<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16251">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">cuart cleanup<br><br>Change-Id: Ia5b66a86f0f53e5123139c3c5047f70582d1bf6e<br>---<br>M ccid_common/ccid_slot_fsm.c<br>M ccid_common/cuart.c<br>M ccid_common/cuart.h<br>M sysmoOCTSIM/cuart_driver_asf4_usart_async.c<br>4 files changed, 40 insertions(+), 50 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/51/16251/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/ccid_common/ccid_slot_fsm.c b/ccid_common/ccid_slot_fsm.c</span><br><span>index fef1515..3a591d7 100644</span><br><span>--- a/ccid_common/ccid_slot_fsm.c</span><br><span>+++ b/ccid_common/ccid_slot_fsm.c</span><br><span>@@ -195,8 +195,8 @@</span><br><span>            * - after ATR while card is idle</span><br><span>             * - after PPS while card is idle</span><br><span>             */</span><br><span style="color: hsl(0, 100%, 40%);">-             card_uart_ctrl(ss->cuart, CUART_CTL_CLOCK_FREQ, fmax);</span><br><span style="color: hsl(0, 100%, 40%);">-               card_uart_ctrl(ss->cuart, CUART_CTL_FD, F/D);</span><br><span style="color: hsl(120, 100%, 40%);">+              card_uart_ctrl(ss->cuart, CUART_CTL_SET_CLOCK_FREQ, fmax);</span><br><span style="color: hsl(120, 100%, 40%);">+         card_uart_ctrl(ss->cuart, CUART_CTL_SET_FD, F/D);</span><br><span>                 card_uart_ctrl(ss->cuart, CUART_CTL_WTIME, cs->proposed_pars.t0.waiting_integer);</span><br><span> </span><br><span>          cs->pars = cs->proposed_pars;</span><br><span>diff --git a/ccid_common/cuart.c b/ccid_common/cuart.c</span><br><span>index 9a68167..1ae50c6 100644</span><br><span>--- a/ccid_common/cuart.c</span><br><span>+++ b/ccid_common/cuart.c</span><br><span>@@ -29,8 +29,12 @@</span><br><span> /* obtain the current ETU in us */</span><br><span> static int get_etu_in_us(struct card_uart *cuart)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       /* FIXME: actually implement this based on the real baud rate */</span><br><span style="color: hsl(0, 100%, 40%);">-        return (1000000/9600);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(cuart);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(cuart->driver);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(cuart->driver->ops);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(cuart->driver->ops->ctrl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return 1e6 / cuart->driver->ops->ctrl(cuart, CUART_CTL_GET_BAUDRATE, 0);</span><br><span> }</span><br><span> </span><br><span> /* software waiting-time timer has expired */</span><br><span>diff --git a/ccid_common/cuart.h b/ccid_common/cuart.h</span><br><span>index efd70f0..40a4aa8 100644</span><br><span>--- a/ccid_common/cuart.h</span><br><span>+++ b/ccid_common/cuart.h</span><br><span>@@ -26,10 +26,12 @@</span><br><span>   CUART_CTL_NO_RXTX,              /* enable/disable receiver */</span><br><span>        CUART_CTL_POWER,        /* enable/disable ICC power */</span><br><span>       CUART_CTL_CLOCK,        /* enable/disable ICC clock */</span><br><span style="color: hsl(0, 100%, 40%);">-  CUART_CTL_CLOCK_FREQ, /* set ICC clock frequency (hz)*/</span><br><span style="color: hsl(120, 100%, 40%);">+       CUART_CTL_SET_CLOCK_FREQ, /* set ICC clock frequency (hz)*/</span><br><span>  CUART_CTL_RST,          /* enable/disable ICC reset */</span><br><span>       CUART_CTL_WTIME,        /* set the waiting time (in etu) */</span><br><span style="color: hsl(0, 100%, 40%);">-     CUART_CTL_FD,</span><br><span style="color: hsl(120, 100%, 40%);">+ CUART_CTL_SET_FD,</span><br><span style="color: hsl(120, 100%, 40%);">+     CUART_CTL_GET_BAUDRATE,</span><br><span style="color: hsl(120, 100%, 40%);">+       CUART_CTL_GET_CLOCK_FREQ,</span><br><span> };</span><br><span> </span><br><span> struct card_uart;</span><br><span>@@ -101,6 +103,7 @@</span><br><span>                       uint8_t slot_nr;</span><br><span>                     /* in us, required, no delay breaks _rx_ */</span><br><span>                  uint32_t extrawait_after_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+                  uint32_t current_baudrate;</span><br><span>           } asf4;</span><br><span>      } u;</span><br><span> };</span><br><span>diff --git a/sysmoOCTSIM/cuart_driver_asf4_usart_async.c b/sysmoOCTSIM/cuart_driver_asf4_usart_async.c</span><br><span>index 14fe491..c7d29eb 100644</span><br><span>--- a/sysmoOCTSIM/cuart_driver_asf4_usart_async.c</span><br><span>+++ b/sysmoOCTSIM/cuart_driver_asf4_usart_async.c</span><br><span>@@ -161,8 +161,10 @@</span><br><span>  *  @param[in] baudrate baud rate in bps to set</span><br><span>  *  @return if the baud rate has been set, else a parameter is out of range</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static bool slot_set_baudrate(uint8_t slotnr, uint32_t baudrate)</span><br><span style="color: hsl(120, 100%, 40%);">+static bool slot_set_baudrate(struct card_uart *cuart, uint32_t baudrate)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t slotnr = cuart->u.asf4.slot_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         ASSERT(slotnr < ARRAY_SIZE(SIM_peripheral_descriptors));</span><br><span> </span><br><span>      // calculate the error corresponding to the clock sources</span><br><span>@@ -203,6 +205,11 @@</span><br><span>     if (NULL == slot) {</span><br><span>          return false;</span><br><span>        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   // update cached values</span><br><span style="color: hsl(120, 100%, 40%);">+       cuart->u.asf4.current_baudrate = baudrate;</span><br><span style="color: hsl(120, 100%, 40%);">+ cuart->u.asf4.extrawait_after_rx = 1./baudrate * 1000 * 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   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]);</span><br><span>       while (!usart_async_is_tx_empty(slot)); // wait for transmission to complete (WARNING no timeout)</span><br><span>    usart_async_disable(slot); // disable SERCOM peripheral</span><br><span>@@ -223,8 +230,10 @@</span><br><span>  *  @param[in] d baud rate adjustment factor D</span><br><span>  *  @return if the baud rate has been set, else a parameter is out of range</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static bool slot_set_isorate(uint8_t slotnr, enum ncn8025_sim_clkdiv clkdiv, uint16_t f, uint8_t d)</span><br><span style="color: hsl(120, 100%, 40%);">+static bool slot_set_isorate(struct card_uart *cuart, enum ncn8025_sim_clkdiv clkdiv, uint16_t f, uint8_t d)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t slotnr = cuart->u.asf4.slot_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         // input checks</span><br><span>      ASSERT(slotnr < ARRAY_SIZE(SIM_peripheral_descriptors));</span><br><span>  if (clkdiv != SIM_CLKDIV_1 && clkdiv != SIM_CLKDIV_2 && clkdiv != SIM_CLKDIV_4 && clkdiv != SIM_CLKDIV_8) {</span><br><span>@@ -264,7 +273,7 @@</span><br><span> </span><br><span>        // set baud rate</span><br><span>     uint32_t baudrate = (freq * d) / f; // calculate actual baud rate</span><br><span style="color: hsl(0, 100%, 40%);">-       return slot_set_baudrate(slotnr, baudrate); // set baud rate</span><br><span style="color: hsl(120, 100%, 40%);">+  return slot_set_baudrate(cuart, baudrate); // set baud rate</span><br><span> }</span><br><span> </span><br><span> /***********************************************************************</span><br><span>@@ -289,16 +298,13 @@</span><br><span>     cuart->u.asf4.usa_pd = usa_pd;</span><br><span>    cuart->u.asf4.slot_nr = slot_nr;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* in us, 20Mhz with default ncn8025 divider 8, F=372, D=1*/</span><br><span style="color: hsl(0, 100%, 40%);">-    cuart->u.asf4.extrawait_after_rx = 1./(20./8/372);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>        usart_async_register_callback(usa_pd, USART_ASYNC_RXC_CB, SIM_rx_cb[slot_nr]);</span><br><span>       usart_async_register_callback(usa_pd, USART_ASYNC_TXC_CB, SIM_tx_cb[slot_nr]);</span><br><span>       usart_async_register_callback(usa_pd, USART_ASYNC_ERROR_CB, _SIM_error_cb);</span><br><span>  usart_async_enable(usa_pd);</span><br><span> </span><br><span>      // set USART baud rate to match the interface (f = 2.5 MHz) and card default settings (Fd = 372, Dd = 1)</span><br><span style="color: hsl(0, 100%, 40%);">-        slot_set_isorate(cuart->u.asf4.slot_nr, SIM_CLKDIV_8, ISO7816_3_DEFAULT_FD, ISO7816_3_DEFAULT_DD);</span><br><span style="color: hsl(120, 100%, 40%);">+ slot_set_isorate(cuart, SIM_CLKDIV_8, ISO7816_3_DEFAULT_FD, ISO7816_3_DEFAULT_DD);</span><br><span> </span><br><span>         return 0;</span><br><span> }</span><br><span>@@ -349,38 +355,13 @@</span><br><span> </span><br><span>         switch (ctl) {</span><br><span>       case CUART_CTL_NO_RXTX:</span><br><span style="color: hsl(0, 100%, 40%);">-//               if (arg){</span><br><span style="color: hsl(0, 100%, 40%);">-//                     uint32_t ctrlb = ((Sercom *)sercom)->USART.CTRLB.reg;</span><br><span style="color: hsl(0, 100%, 40%);">-//                      ctrlb &= ~(SERCOM_USART_CTRLB_TXEN | SERCOM_USART_CTRLB_RXEN);</span><br><span style="color: hsl(0, 100%, 40%);">-//                    ((Sercom *)sercom)->USART.CTRLB.reg = ctrlb;</span><br><span style="color: hsl(0, 100%, 40%);">-//                       hri_sercomusart_wait_for_sync(sercom, SERCOM_USART_SYNCBUSY_MASK);</span><br><span style="color: hsl(0, 100%, 40%);">-//            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-//                      uint32_t ctrlb = ((Sercom *)sercom)->USART.CTRLB.reg;</span><br><span style="color: hsl(0, 100%, 40%);">-//                      ctrlb |= (SERCOM_USART_CTRLB_TXEN | SERCOM_USART_CTRLB_RXEN);</span><br><span style="color: hsl(0, 100%, 40%);">-//                 ((Sercom *)sercom)->USART.CTRLB.reg = ctrlb;</span><br><span style="color: hsl(0, 100%, 40%);">-//                       hri_sercomusart_wait_for_sync(sercom, SERCOM_USART_SYNCBUSY_MASK);</span><br><span style="color: hsl(0, 100%, 40%);">-//            }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* no op */</span><br><span>          break;</span><br><span>       case CUART_CTL_RX:</span><br><span>           if (arg){</span><br><span style="color: hsl(0, 100%, 40%);">-////                   delay_us(cuart->u.asf4.extrawait_after_rx);</span><br><span style="color: hsl(0, 100%, 40%);">-//                        uint32_t ctrlb = ((Sercom *)sercom)->USART.CTRLB.reg;</span><br><span style="color: hsl(0, 100%, 40%);">-//                      ctrlb &= ~SERCOM_USART_CTRLB_TXEN;</span><br><span style="color: hsl(0, 100%, 40%);">-//                        ctrlb |= SERCOM_USART_CTRLB_RXEN;</span><br><span style="color: hsl(0, 100%, 40%);">-//                     ((Sercom *)sercom)->USART.CTRLB.reg = ctrlb;</span><br><span style="color: hsl(0, 100%, 40%);">-//                       hri_sercomusart_wait_for_sync(sercom, SERCOM_USART_SYNCBUSY_MASK);</span><br><span style="color: hsl(0, 100%, 40%);">-//</span><br><span style="color: hsl(0, 100%, 40%);">-////                        sercom->USART.CTRLB.bit.TXEN = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-////                        sercom->USART.CTRLB.bit.RXEN = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* no op */</span><br><span>          } else {</span><br><span>                     delay_us(cuart->u.asf4.extrawait_after_rx);</span><br><span style="color: hsl(0, 100%, 40%);">-////                      sercom->USART.CTRLB.bit.RXEN = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-////                        sercom->USART.CTRLB.bit.TXEN = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-//                  uint32_t ctrlb = ((Sercom *)sercom)->USART.CTRLB.reg;</span><br><span style="color: hsl(0, 100%, 40%);">-//                      ctrlb &= ~SERCOM_USART_CTRLB_RXEN;</span><br><span style="color: hsl(0, 100%, 40%);">-//                        ctrlb |= SERCOM_USART_CTRLB_TXEN;</span><br><span style="color: hsl(0, 100%, 40%);">-//                     ((Sercom *)sercom)->USART.CTRLB.reg = ctrlb;</span><br><span style="color: hsl(0, 100%, 40%);">-//                       hri_sercomusart_wait_for_sync(sercom, SERCOM_USART_SYNCBUSY_MASK);</span><br><span>           }</span><br><span>            break;</span><br><span>       case CUART_CTL_RST:</span><br><span>@@ -390,12 +371,8 @@</span><br><span>           usart_async_flush_rx_buffer(cuart->u.asf4.usa_pd);</span><br><span>                break;</span><br><span>       case CUART_CTL_POWER:</span><br><span style="color: hsl(0, 100%, 40%);">-           /* in us, 20Mhz with default ncn8025 divider 8, F=372, D=1*/</span><br><span style="color: hsl(0, 100%, 40%);">-            cuart->u.asf4.extrawait_after_rx = 1./(20./8/372);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           // set USART baud rate to match the interface (f = 2.5 MHz) and card default settings (Fd = 372, Dd = 1)</span><br><span style="color: hsl(0, 100%, 40%);">-                if(arg)</span><br><span style="color: hsl(0, 100%, 40%);">-                 slot_set_isorate(cuart->u.asf4.slot_nr, SIM_CLKDIV_8, ISO7816_3_DEFAULT_FD, ISO7816_3_DEFAULT_DD);</span><br><span style="color: hsl(120, 100%, 40%);">+         /* reset everything */</span><br><span style="color: hsl(120, 100%, 40%);">+                slot_set_isorate(cuart, SIM_CLKDIV_8, ISO7816_3_DEFAULT_FD, ISO7816_3_DEFAULT_DD);</span><br><span> </span><br><span>               ncn8025_get(cuart->u.asf4.slot_nr, &settings);</span><br><span>                settings.cmdvcc = arg ? true : false;</span><br><span>@@ -410,7 +387,7 @@</span><br><span>  case CUART_CTL_CLOCK:</span><br><span>                /* no clock stop support */</span><br><span>          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case CUART_CTL_CLOCK_FREQ:</span><br><span style="color: hsl(120, 100%, 40%);">+    case CUART_CTL_SET_CLOCK_FREQ:</span><br><span>               ncn8025_get(cuart->u.asf4.slot_nr, &settings);</span><br><span> </span><br><span>            /* 2,5/5/10/20 supported by dividers */</span><br><span>@@ -424,12 +401,18 @@</span><br><span>              settings.clkdiv = clkdiv;</span><br><span>            ncn8025_set(cuart->u.asf4.slot_nr, &settings);</span><br><span>                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case CUART_CTL_FD:</span><br><span style="color: hsl(120, 100%, 40%);">+    case CUART_CTL_SET_FD:</span><br><span>               ncn8025_get(cuart->u.asf4.slot_nr, &settings);</span><br><span>                uint8_t divider = ncn8025_div_val[settings.clkdiv];</span><br><span>          uint32_t baudrate = (20e6/divider)/arg;</span><br><span style="color: hsl(0, 100%, 40%);">-         cuart->u.asf4.extrawait_after_rx = 1./baudrate * 1000 * 1000;</span><br><span style="color: hsl(0, 100%, 40%);">-                slot_set_baudrate(cuart->u.asf4.slot_nr, baudrate);</span><br><span style="color: hsl(120, 100%, 40%);">+                slot_set_baudrate(cuart, baudrate);</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case CUART_CTL_GET_BAUDRATE:</span><br><span style="color: hsl(120, 100%, 40%);">+          return cuart->u.asf4.current_baudrate;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case CUART_CTL_GET_CLOCK_FREQ:</span><br><span style="color: hsl(120, 100%, 40%);">+                ncn8025_get(cuart->u.asf4.slot_nr, &settings);</span><br><span style="color: hsl(120, 100%, 40%);">+         return 20e6 / ncn8025_div_val[settings.clkdiv];</span><br><span>              break;</span><br><span>       default:</span><br><span>             return -EINVAL;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16251">change 16251</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16251"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ccid-firmware </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ia5b66a86f0f53e5123139c3c5047f70582d1bf6e </div>
<div style="display:none"> Gerrit-Change-Number: 16251 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>