Change in osmo-ccid-firmware[master]: cuart cleanup

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.org
Tue Nov 26 18:39:16 UTC 2019


Hoernchen 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>


More information about the gerrit-log mailing list