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>