<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/15742">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">cuart: Integrate software WT (waiting time) timer<br><br>Change-Id: If94d7bdca0e5571d4f2f53862fc574c33a05ce43<br>---<br>M ccid_common/cuart.c<br>M ccid_common/cuart.h<br>M ccid_host/cuart_driver_tty.c<br>3 files changed, 53 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/ccid_common/cuart.c b/ccid_common/cuart.c</span><br><span>index fc3cfb6..4ea82ba 100644</span><br><span>--- a/ccid_common/cuart.c</span><br><span>+++ b/ccid_common/cuart.c</span><br><span>@@ -2,6 +2,7 @@</span><br><span> #include <string.h></span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/timer.h></span><br><span> </span><br><span> #include "cuart.h"</span><br><span> </span><br><span>@@ -25,6 +26,34 @@</span><br><span>   return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* obtain the current ETU in us */</span><br><span style="color: hsl(120, 100%, 40%);">+static int get_etu_in_us(struct card_uart *cuart)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       /* FIXME: actually implement this based on the real baud rate */</span><br><span style="color: hsl(120, 100%, 40%);">+      return (1000000/9600);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* software waiting-time timer has expired */</span><br><span style="color: hsl(120, 100%, 40%);">+static void card_uart_wtime_cb(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct card_uart *cuart = (struct card_uart *) data;</span><br><span style="color: hsl(120, 100%, 40%);">+  card_uart_notification(cuart, CUART_E_RX_TIMEOUT, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      /* should we automatically disable the receiver? */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void card_uart_wtime_restart(struct card_uart *cuart)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    int secs, usecs;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    usecs = get_etu_in_us(cuart) * cuart->wtime_etu;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (usecs > 1000000) {</span><br><span style="color: hsl(120, 100%, 40%);">+             secs = usecs / 1000000;</span><br><span style="color: hsl(120, 100%, 40%);">+               usecs = usecs % 1000000;</span><br><span style="color: hsl(120, 100%, 40%);">+      } else</span><br><span style="color: hsl(120, 100%, 40%);">+                secs = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_timer_schedule(&cuart->wtime_tmr, secs, usecs);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int card_uart_open(struct card_uart *cuart, const char *driver_name, const char *device_name)</span><br><span> {</span><br><span>       struct card_uart_driver *drv = cuart_drv_by_name(driver_name);</span><br><span>@@ -33,8 +62,10 @@</span><br><span>  if (!drv)</span><br><span>            return -ENODEV;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   cuart->wtime_etu = 9600; /* ISO 7816-3 Section 8.1 */</span><br><span>     cuart->rx_enabled = true;</span><br><span>         cuart->rx_threshold = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_timer_setup(&cuart->wtime_tmr, card_uart_wtime_cb, cuart);</span><br><span> </span><br><span>   rc = drv->ops->open(cuart, device_name);</span><br><span>       if (rc < 0)</span><br><span>@@ -60,13 +91,19 @@</span><br><span>         OSMO_ASSERT(cuart->driver);</span><br><span>       OSMO_ASSERT(cuart->driver->ops);</span><br><span>       OSMO_ASSERT(cuart->driver->ops->ctrl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    rc = cuart->driver->ops->ctrl(cuart, ctl, arg);</span><br><span>     if (rc < 0)</span><br><span>               return rc;</span><br><span> </span><br><span>       switch (ctl) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case CUART_CTL_WTIME:</span><br><span style="color: hsl(120, 100%, 40%);">+         cuart->wtime_etu = arg;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span>       case CUART_CTL_RX:</span><br><span>           cuart->rx_enabled = arg ? true : false;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!cuart->rx_enabled)</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_timer_del(&cuart->wtime_tmr);</span><br><span>            break;</span><br><span>       default:</span><br><span>             break;</span><br><span>diff --git a/ccid_common/cuart.h b/ccid_common/cuart.h</span><br><span>index f35cdd2..9d56035 100644</span><br><span>--- a/ccid_common/cuart.h</span><br><span>+++ b/ccid_common/cuart.h</span><br><span>@@ -2,6 +2,7 @@</span><br><span> #include <stdint.h></span><br><span> #include <stdbool.h></span><br><span> #include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/timer.h></span><br><span> </span><br><span> #include <osmocom/core/select.h></span><br><span> #include "utils_ringbuffer.h"</span><br><span>@@ -23,6 +24,7 @@</span><br><span>        CUART_CTL_POWER,</span><br><span>     CUART_CTL_CLOCK,</span><br><span>     CUART_CTL_RST,</span><br><span style="color: hsl(120, 100%, 40%);">+        CUART_CTL_WTIME,</span><br><span> };</span><br><span> </span><br><span> struct card_uart;</span><br><span>@@ -65,6 +67,9 @@</span><br><span>   *  issue CUART_E_RX_SINGLE; if it is > 1, we will issue CUART_E_RX_COMPLETE */</span><br><span>   uint32_t rx_threshold;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    uint32_t wtime_etu;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_timer_list wtime_tmr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* driver-specific private data */</span><br><span>   union {</span><br><span>              struct {</span><br><span>@@ -103,6 +108,9 @@</span><br><span> /*! Set the Rx notification threshold in number of bytes received */</span><br><span> void card_uart_set_rx_threshold(struct card_uart *cuart, size_t rx_threshold);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* (re)start the software WTIME timer */</span><br><span style="color: hsl(120, 100%, 40%);">+void card_uart_wtime_restart(struct card_uart *cuart);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void card_uart_notification(struct card_uart *cuart, enum card_uart_event evt, void *data);</span><br><span> </span><br><span> int card_uart_driver_register(struct card_uart_driver *drv);</span><br><span>diff --git a/ccid_host/cuart_driver_tty.c b/ccid_host/cuart_driver_tty.c</span><br><span>index 10ea60f..5f635b5 100644</span><br><span>--- a/ccid_host/cuart_driver_tty.c</span><br><span>+++ b/ccid_host/cuart_driver_tty.c</span><br><span>@@ -143,6 +143,8 @@</span><br><span>                       if (!cuart->rx_enabled)</span><br><span>                           continue;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+                 card_uart_wtime_restart(cuart);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                    if (cuart->rx_threshold == 1) {</span><br><span>                           /* bypass ringbuffer and report byte directly */</span><br><span>                             card_uart_notification(cuart, CUART_E_RX_SINGLE, &buf[i]);</span><br><span>@@ -263,9 +265,10 @@</span><br><span>                }</span><br><span>            /* We do our best here, but lots of [USB] serial drivers seem to ignore</span><br><span>               * CREAD, see https://bugzilla.kernel.org/show_bug.cgi?id=205033 */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (arg)</span><br><span style="color: hsl(120, 100%, 40%);">+              if (arg) {</span><br><span>                   tio.c_cflag |= CREAD;</span><br><span style="color: hsl(0, 100%, 40%);">-           else</span><br><span style="color: hsl(120, 100%, 40%);">+                  card_uart_wtime_restart(cuart);</span><br><span style="color: hsl(120, 100%, 40%);">+               } else</span><br><span>                       tio.c_cflag &= ~CREAD;</span><br><span>           rc = tcsetattr(cuart->u.tty.ofd.fd, TCSANOW, &tio);</span><br><span>           if (rc < 0) {</span><br><span>@@ -278,6 +281,9 @@</span><br><span>               if (arg)</span><br><span>                     _flush(cuart->u.tty.ofd.fd);</span><br><span>              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case CUART_CTL_WTIME:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* no driver-specific handling of this */</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span>       case CUART_CTL_POWER:</span><br><span>        case CUART_CTL_CLOCK:</span><br><span>        default:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/15742">change 15742</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/+/15742"/><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: If94d7bdca0e5571d4f2f53862fc574c33a05ce43 </div>
<div style="display:none"> Gerrit-Change-Number: 15742 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>