This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Hoernchen gerrit-no-reply at lists.osmocom.orgHoernchen has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16251 ) Change subject: cuart cleanup ...................................................................... cuart cleanup Change-Id: Ia5b66a86f0f53e5123139c3c5047f70582d1bf6e --- M ccid_common/ccid_slot_fsm.c M ccid_common/cuart.c M ccid_common/cuart.h M sysmoOCTSIM/cuart_driver_asf4_usart_async.c 4 files changed, 40 insertions(+), 50 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/51/16251/1 diff --git a/ccid_common/ccid_slot_fsm.c b/ccid_common/ccid_slot_fsm.c index fef1515..3a591d7 100644 --- a/ccid_common/ccid_slot_fsm.c +++ b/ccid_common/ccid_slot_fsm.c @@ -195,8 +195,8 @@ * - after ATR while card is idle * - after PPS while card is idle */ - card_uart_ctrl(ss->cuart, CUART_CTL_CLOCK_FREQ, fmax); - card_uart_ctrl(ss->cuart, CUART_CTL_FD, F/D); + card_uart_ctrl(ss->cuart, CUART_CTL_SET_CLOCK_FREQ, fmax); + card_uart_ctrl(ss->cuart, CUART_CTL_SET_FD, F/D); card_uart_ctrl(ss->cuart, CUART_CTL_WTIME, cs->proposed_pars.t0.waiting_integer); cs->pars = cs->proposed_pars; diff --git a/ccid_common/cuart.c b/ccid_common/cuart.c index 9a68167..1ae50c6 100644 --- a/ccid_common/cuart.c +++ b/ccid_common/cuart.c @@ -29,8 +29,12 @@ /* obtain the current ETU in us */ static int get_etu_in_us(struct card_uart *cuart) { - /* FIXME: actually implement this based on the real baud rate */ - return (1000000/9600); + OSMO_ASSERT(cuart); + OSMO_ASSERT(cuart->driver); + OSMO_ASSERT(cuart->driver->ops); + OSMO_ASSERT(cuart->driver->ops->ctrl); + + return 1e6 / cuart->driver->ops->ctrl(cuart, CUART_CTL_GET_BAUDRATE, 0); } /* software waiting-time timer has expired */ diff --git a/ccid_common/cuart.h b/ccid_common/cuart.h index efd70f0..40a4aa8 100644 --- a/ccid_common/cuart.h +++ b/ccid_common/cuart.h @@ -26,10 +26,12 @@ CUART_CTL_NO_RXTX, /* enable/disable receiver */ CUART_CTL_POWER, /* enable/disable ICC power */ CUART_CTL_CLOCK, /* enable/disable ICC clock */ - CUART_CTL_CLOCK_FREQ, /* set ICC clock frequency (hz)*/ + CUART_CTL_SET_CLOCK_FREQ, /* set ICC clock frequency (hz)*/ CUART_CTL_RST, /* enable/disable ICC reset */ CUART_CTL_WTIME, /* set the waiting time (in etu) */ - CUART_CTL_FD, + CUART_CTL_SET_FD, + CUART_CTL_GET_BAUDRATE, + CUART_CTL_GET_CLOCK_FREQ, }; struct card_uart; @@ -101,6 +103,7 @@ uint8_t slot_nr; /* in us, required, no delay breaks _rx_ */ uint32_t extrawait_after_rx; + uint32_t current_baudrate; } asf4; } u; }; diff --git a/sysmoOCTSIM/cuart_driver_asf4_usart_async.c b/sysmoOCTSIM/cuart_driver_asf4_usart_async.c index 14fe491..c7d29eb 100644 --- a/sysmoOCTSIM/cuart_driver_asf4_usart_async.c +++ b/sysmoOCTSIM/cuart_driver_asf4_usart_async.c @@ -161,8 +161,10 @@ * @param[in] baudrate baud rate in bps to set * @return if the baud rate has been set, else a parameter is out of range */ -static bool slot_set_baudrate(uint8_t slotnr, uint32_t baudrate) +static bool slot_set_baudrate(struct card_uart *cuart, uint32_t baudrate) { + uint8_t slotnr = cuart->u.asf4.slot_nr; + ASSERT(slotnr < ARRAY_SIZE(SIM_peripheral_descriptors)); // calculate the error corresponding to the clock sources @@ -203,6 +205,11 @@ if (NULL == slot) { return false; } + + // update cached values + cuart->u.asf4.current_baudrate = baudrate; + cuart->u.asf4.extrawait_after_rx = 1./baudrate * 1000 * 1000; + printf("(%u) switching SERCOM clock to GCLK%u (freq = %lu kHz) and baud rate to %lu bps (baud = %u)\r\n", slotnr, (best + 1) * 2, (uint32_t)(round(sercom_glck_freqs[best] / 1000)), baudrate, bauds[best]); while (!usart_async_is_tx_empty(slot)); // wait for transmission to complete (WARNING no timeout) usart_async_disable(slot); // disable SERCOM peripheral @@ -223,8 +230,10 @@ * @param[in] d baud rate adjustment factor D * @return if the baud rate has been set, else a parameter is out of range */ -static bool slot_set_isorate(uint8_t slotnr, enum ncn8025_sim_clkdiv clkdiv, uint16_t f, uint8_t d) +static bool slot_set_isorate(struct card_uart *cuart, enum ncn8025_sim_clkdiv clkdiv, uint16_t f, uint8_t d) { + uint8_t slotnr = cuart->u.asf4.slot_nr; + // input checks ASSERT(slotnr < ARRAY_SIZE(SIM_peripheral_descriptors)); if (clkdiv != SIM_CLKDIV_1 && clkdiv != SIM_CLKDIV_2 && clkdiv != SIM_CLKDIV_4 && clkdiv != SIM_CLKDIV_8) { @@ -264,7 +273,7 @@ // set baud rate uint32_t baudrate = (freq * d) / f; // calculate actual baud rate - return slot_set_baudrate(slotnr, baudrate); // set baud rate + return slot_set_baudrate(cuart, baudrate); // set baud rate } /*********************************************************************** @@ -289,16 +298,13 @@ cuart->u.asf4.usa_pd = usa_pd; cuart->u.asf4.slot_nr = slot_nr; - /* in us, 20Mhz with default ncn8025 divider 8, F=372, D=1*/ - cuart->u.asf4.extrawait_after_rx = 1./(20./8/372); - usart_async_register_callback(usa_pd, USART_ASYNC_RXC_CB, SIM_rx_cb[slot_nr]); usart_async_register_callback(usa_pd, USART_ASYNC_TXC_CB, SIM_tx_cb[slot_nr]); usart_async_register_callback(usa_pd, USART_ASYNC_ERROR_CB, _SIM_error_cb); usart_async_enable(usa_pd); // set USART baud rate to match the interface (f = 2.5 MHz) and card default settings (Fd = 372, Dd = 1) - slot_set_isorate(cuart->u.asf4.slot_nr, SIM_CLKDIV_8, ISO7816_3_DEFAULT_FD, ISO7816_3_DEFAULT_DD); + slot_set_isorate(cuart, SIM_CLKDIV_8, ISO7816_3_DEFAULT_FD, ISO7816_3_DEFAULT_DD); return 0; } @@ -349,38 +355,13 @@ switch (ctl) { case CUART_CTL_NO_RXTX: -// if (arg){ -// uint32_t ctrlb = ((Sercom *)sercom)->USART.CTRLB.reg; -// ctrlb &= ~(SERCOM_USART_CTRLB_TXEN | SERCOM_USART_CTRLB_RXEN); -// ((Sercom *)sercom)->USART.CTRLB.reg = ctrlb; -// hri_sercomusart_wait_for_sync(sercom, SERCOM_USART_SYNCBUSY_MASK); -// } else { -// uint32_t ctrlb = ((Sercom *)sercom)->USART.CTRLB.reg; -// ctrlb |= (SERCOM_USART_CTRLB_TXEN | SERCOM_USART_CTRLB_RXEN); -// ((Sercom *)sercom)->USART.CTRLB.reg = ctrlb; -// hri_sercomusart_wait_for_sync(sercom, SERCOM_USART_SYNCBUSY_MASK); -// } + /* no op */ break; case CUART_CTL_RX: if (arg){ -//// delay_us(cuart->u.asf4.extrawait_after_rx); -// uint32_t ctrlb = ((Sercom *)sercom)->USART.CTRLB.reg; -// ctrlb &= ~SERCOM_USART_CTRLB_TXEN; -// ctrlb |= SERCOM_USART_CTRLB_RXEN; -// ((Sercom *)sercom)->USART.CTRLB.reg = ctrlb; -// hri_sercomusart_wait_for_sync(sercom, SERCOM_USART_SYNCBUSY_MASK); -// -//// sercom->USART.CTRLB.bit.TXEN = 0; -//// sercom->USART.CTRLB.bit.RXEN = 1; + /* no op */ } else { delay_us(cuart->u.asf4.extrawait_after_rx); -//// sercom->USART.CTRLB.bit.RXEN = 0; -//// sercom->USART.CTRLB.bit.TXEN = 1; -// uint32_t ctrlb = ((Sercom *)sercom)->USART.CTRLB.reg; -// ctrlb &= ~SERCOM_USART_CTRLB_RXEN; -// ctrlb |= SERCOM_USART_CTRLB_TXEN; -// ((Sercom *)sercom)->USART.CTRLB.reg = ctrlb; -// hri_sercomusart_wait_for_sync(sercom, SERCOM_USART_SYNCBUSY_MASK); } break; case CUART_CTL_RST: @@ -390,12 +371,8 @@ usart_async_flush_rx_buffer(cuart->u.asf4.usa_pd); break; case CUART_CTL_POWER: - /* in us, 20Mhz with default ncn8025 divider 8, F=372, D=1*/ - cuart->u.asf4.extrawait_after_rx = 1./(20./8/372); - - // set USART baud rate to match the interface (f = 2.5 MHz) and card default settings (Fd = 372, Dd = 1) - if(arg) - slot_set_isorate(cuart->u.asf4.slot_nr, SIM_CLKDIV_8, ISO7816_3_DEFAULT_FD, ISO7816_3_DEFAULT_DD); + /* reset everything */ + slot_set_isorate(cuart, SIM_CLKDIV_8, ISO7816_3_DEFAULT_FD, ISO7816_3_DEFAULT_DD); ncn8025_get(cuart->u.asf4.slot_nr, &settings); settings.cmdvcc = arg ? true : false; @@ -410,7 +387,7 @@ case CUART_CTL_CLOCK: /* no clock stop support */ break; - case CUART_CTL_CLOCK_FREQ: + case CUART_CTL_SET_CLOCK_FREQ: ncn8025_get(cuart->u.asf4.slot_nr, &settings); /* 2,5/5/10/20 supported by dividers */ @@ -424,12 +401,18 @@ settings.clkdiv = clkdiv; ncn8025_set(cuart->u.asf4.slot_nr, &settings); break; - case CUART_CTL_FD: + case CUART_CTL_SET_FD: ncn8025_get(cuart->u.asf4.slot_nr, &settings); uint8_t divider = ncn8025_div_val[settings.clkdiv]; uint32_t baudrate = (20e6/divider)/arg; - cuart->u.asf4.extrawait_after_rx = 1./baudrate * 1000 * 1000; - slot_set_baudrate(cuart->u.asf4.slot_nr, baudrate); + slot_set_baudrate(cuart, baudrate); + break; + case CUART_CTL_GET_BAUDRATE: + return cuart->u.asf4.current_baudrate; + break; + case CUART_CTL_GET_CLOCK_FREQ: + ncn8025_get(cuart->u.asf4.slot_nr, &settings); + return 20e6 / ncn8025_div_val[settings.clkdiv]; break; default: return -EINVAL; -- To view, visit https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16251 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ccid-firmware Gerrit-Branch: master Gerrit-Change-Id: Ia5b66a86f0f53e5123139c3c5047f70582d1bf6e Gerrit-Change-Number: 16251 Gerrit-PatchSet: 1 Gerrit-Owner: Hoernchen <ewild at sysmocom.de> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20191126/91304c92/attachment.htm>