<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16273">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">cuart icc clock freq and divider setting support<br><br>Change-Id: I9c99c68511d3972513348ee6be5e7bb3b3a5f99e<br>---<br>M ccid_common/cuart.h<br>M sysmoOCTSIM/cuart_driver_asf4_usart_async.c<br>M sysmoOCTSIM/ncn8025.c<br>M sysmoOCTSIM/ncn8025.h<br>4 files changed, 43 insertions(+), 8 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/73/16273/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/ccid_common/cuart.h b/ccid_common/cuart.h</span><br><span>index 5e397ab..6c53481 100644</span><br><span>--- a/ccid_common/cuart.h</span><br><span>+++ b/ccid_common/cuart.h</span><br><span>@@ -25,8 +25,10 @@</span><br><span>      CUART_CTL_RX,           /* 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(120, 100%, 40%);">+        CUART_CTL_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(120, 100%, 40%);">+   CUART_CTL_FD,</span><br><span> };</span><br><span> </span><br><span> struct card_uart;</span><br><span>@@ -95,6 +97,8 @@</span><br><span>             struct {</span><br><span>                     struct usart_async_descriptor *usa_pd;</span><br><span>                       uint8_t slot_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* in us, required, no delay breaks _rx_ */</span><br><span style="color: hsl(120, 100%, 40%);">+                   uint32_t extrawait_after_rx;</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 f9856f3..a8f8044 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>@@ -289,6 +289,8 @@</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(120, 100%, 40%);">+       /* in us, 20Mhz with default ncn8025 divider 8, F=372, D=1*/</span><br><span style="color: hsl(120, 100%, 40%);">+  cuart->u.asf4.extrawait_after_rx = 1./(20./8/372);</span><br><span> </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>@@ -338,6 +340,8 @@</span><br><span>         return io_read(&usa_pd->io, data, len);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include "ccid_device.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "iso7816_3.h"</span><br><span> static int asf4_usart_ctrl(struct card_uart *cuart, enum card_uart_ctl ctl, int arg)</span><br><span> {</span><br><span>   struct ncn8025_settings settings;</span><br><span>@@ -349,7 +353,7 @@</span><br><span>                      sercom->USART.CTRLB.bit.RXEN = 1;</span><br><span>                         sercom->USART.CTRLB.bit.TXEN = 0;</span><br><span>                 } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        delay_us(100);</span><br><span style="color: hsl(120, 100%, 40%);">+                        delay_us(cuart->u.asf4.extrawait_after_rx);</span><br><span>                       sercom->USART.CTRLB.bit.RXEN = 0;</span><br><span>                         sercom->USART.CTRLB.bit.TXEN = 1;</span><br><span>                 }</span><br><span>@@ -361,22 +365,47 @@</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%);">-           ncn8025_get(cuart->u.asf4.slot_nr, &settings);</span><br><span style="color: hsl(0, 100%, 40%);">-           settings.cmdvcc = arg ? true : false;</span><br><span style="color: hsl(0, 100%, 40%);">-           settings.led = arg ? true : false;</span><br><span style="color: hsl(0, 100%, 40%);">-              settings.vsel = SIM_VOLT_5V0;</span><br><span style="color: hsl(120, 100%, 40%);">+         /* in us, 20Mhz with default ncn8025 divider 8, F=372, D=1*/</span><br><span style="color: hsl(120, 100%, 40%);">+          cuart->u.asf4.extrawait_after_rx = 1./(20./8/372);</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>             if(arg)</span><br><span>                      slot_set_isorate(cuart->u.asf4.slot_nr, SIM_CLKDIV_8, ISO7816_3_DEFAULT_FD, ISO7816_3_DEFAULT_DD);</span><br><span> </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%);">+         settings.cmdvcc = arg ? true : false;</span><br><span style="color: hsl(120, 100%, 40%);">+         settings.led = arg ? true : false;</span><br><span style="color: hsl(120, 100%, 40%);">+            settings.vsel = SIM_VOLT_5V0;</span><br><span>                ncn8025_set(cuart->u.asf4.slot_nr, &settings);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>              break;</span><br><span>       case CUART_CTL_WTIME:</span><br><span>                /* no driver-specific handling of this */</span><br><span>            break;</span><br><span>       case CUART_CTL_CLOCK:</span><br><span style="color: hsl(0, 100%, 40%);">-           /* FIXME */</span><br><span style="color: hsl(120, 100%, 40%);">+           /* no clock stop support */</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case CUART_CTL_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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* 2,5/5/10/20 supported by dividers */</span><br><span style="color: hsl(120, 100%, 40%);">+               enum ncn8025_sim_clkdiv clkdiv = SIM_CLKDIV_1;</span><br><span style="color: hsl(120, 100%, 40%);">+                if(arg < 20000000)</span><br><span style="color: hsl(120, 100%, 40%);">+                 clkdiv = SIM_CLKDIV_2;</span><br><span style="color: hsl(120, 100%, 40%);">+                if(arg < 10000000)</span><br><span style="color: hsl(120, 100%, 40%);">+                 clkdiv = SIM_CLKDIV_4;</span><br><span style="color: hsl(120, 100%, 40%);">+                if(arg < 5000000)</span><br><span style="color: hsl(120, 100%, 40%);">+                  clkdiv = SIM_CLKDIV_8;</span><br><span style="color: hsl(120, 100%, 40%);">+                settings.clkdiv = clkdiv;</span><br><span style="color: hsl(120, 100%, 40%);">+             ncn8025_set(cuart->u.asf4.slot_nr, &settings);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case CUART_CTL_FD:</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%);">+         uint8_t divider = ncn8025_div_val[settings.clkdiv];</span><br><span style="color: hsl(120, 100%, 40%);">+           uint32_t baudrate = (20e6/divider)/arg;</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%);">+              slot_set_baudrate(cuart->u.asf4.slot_nr, baudrate);</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span>       default:</span><br><span>             return -EINVAL;</span><br><span>      }</span><br><span>diff --git a/sysmoOCTSIM/ncn8025.c b/sysmoOCTSIM/ncn8025.c</span><br><span>index 540b166..74d3b39 100644</span><br><span>--- a/sysmoOCTSIM/ncn8025.c</span><br><span>+++ b/sysmoOCTSIM/ncn8025.c</span><br><span>@@ -159,7 +159,7 @@</span><br><span>     [SIM_VOLT_1V8] = "1.8",</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static const unsigned int div_val[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+const unsigned int ncn8025_div_val[] = {</span><br><span>         [SIM_CLKDIV_1] = 1,</span><br><span>  [SIM_CLKDIV_2] = 2,</span><br><span>  [SIM_CLKDIV_4] = 4,</span><br><span>@@ -168,7 +168,7 @@</span><br><span> </span><br><span> void ncn8025_dump(const struct ncn8025_settings *set)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     printf("VOLT=%s, CLKDIV=%u", volt_str[set->vsel], div_val[set->clkdiv]);</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("VOLT=%s, CLKDIV=%u", volt_str[set->vsel], ncn8025_div_val[set->clkdiv]);</span><br><span>     if (set->rstin)</span><br><span>           printf(", RST");</span><br><span>   if (set->cmdvcc)</span><br><span>diff --git a/sysmoOCTSIM/ncn8025.h b/sysmoOCTSIM/ncn8025.h</span><br><span>index 2e774a7..01ddc97 100644</span><br><span>--- a/sysmoOCTSIM/ncn8025.h</span><br><span>+++ b/sysmoOCTSIM/ncn8025.h</span><br><span>@@ -14,6 +14,8 @@</span><br><span>     SIM_CLKDIV_8 = 0,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+extern const unsigned int ncn8025_div_val[];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct ncn8025_settings {</span><br><span>     bool rstin;     /* Reset signal (true: asserted low) */</span><br><span>      bool cmdvcc;    /* Command VCC pin. Activation sequence Enable (true: active low) */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16273">change 16273</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/+/16273"/><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: I9c99c68511d3972513348ee6be5e7bb3b3a5f99e </div>
<div style="display:none"> Gerrit-Change-Number: 16273 </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>