<p>Harald Welte has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/14058">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add ccid_device.h file for ccid_device.c<br><br>Change-Id: I1b171ede38deebfa525a0ee10865da2dc5ec7e4e<br>---<br>M ccid/ccid_device.c<br>A ccid/ccid_device.h<br>2 files changed, 71 insertions(+), 48 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/58/14058/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/ccid/ccid_device.c b/ccid/ccid_device.c</span><br><span>index 02d1599..b7077df 100644</span><br><span>--- a/ccid/ccid_device.c</span><br><span>+++ b/ccid/ccid_device.c</span><br><span>@@ -8,40 +8,7 @@</span><br><span> #include <osmocom/core/utils.h></span><br><span> </span><br><span> #include "ccid_proto.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define NR_SLOTS    8</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ccid_pars_decoded {</span><br><span style="color: hsl(0, 100%, 40%);">-     /* global for T0/T1 */</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t fi;</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t di;</span><br><span style="color: hsl(0, 100%, 40%);">-     enum ccid_clock_stop clock_stop;</span><br><span style="color: hsl(0, 100%, 40%);">-        bool inverse_convention;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                uint8_t guard_time_etu;</span><br><span style="color: hsl(0, 100%, 40%);">-         uint8_t waiting_integer;</span><br><span style="color: hsl(0, 100%, 40%);">-        } t0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                enum ccid_t1_csum_type csum_type;</span><br><span style="color: hsl(0, 100%, 40%);">-               uint8_t guard_time_t1;</span><br><span style="color: hsl(0, 100%, 40%);">-          uint8_t bwi;</span><br><span style="color: hsl(0, 100%, 40%);">-            uint8_t cwi;</span><br><span style="color: hsl(0, 100%, 40%);">-            uint8_t ifsc;</span><br><span style="color: hsl(0, 100%, 40%);">-           uint8_t nad;</span><br><span style="color: hsl(0, 100%, 40%);">-    } t1;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ccid_slot {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct ccid_instance *ci;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t slot_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-        bool icc_present;</span><br><span style="color: hsl(0, 100%, 40%);">-       bool icc_powered;</span><br><span style="color: hsl(0, 100%, 40%);">-       bool icc_in_reset;</span><br><span style="color: hsl(0, 100%, 40%);">-      bool cmd_busy;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct ccid_pars_decoded pars;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+#include "ccid_device.h"</span><br><span> </span><br><span> /* decode on-the-wire T0 parameters into their parsed form */</span><br><span> static int decode_ccid_pars_t0(struct ccid_pars_decoded *out, const struct ccid_proto_data_t0 *in)</span><br><span>@@ -134,23 +101,9 @@</span><br><span>       out->bNadValue = in->t1.nad;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct ccid_ops {</span><br><span style="color: hsl(0, 100%, 40%);">-    int (*send_in)(struct ccid_instance *ci, struct msgb *msg);</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ccid_instance {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct ccid_slot slot[NR_SLOTS];</span><br><span style="color: hsl(0, 100%, 40%);">-        struct ccid_ops ops;</span><br><span style="color: hsl(0, 100%, 40%);">-    const char *name;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #define msgb_ccid_out(x) (union ccid_pc_to_rdr *)msgb_data(x)</span><br><span> #define msgb_ccid_in(x) (union ccid_rdr_to_pc *)msgb_data(x)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define LOGPCI(ci, lvl, fmt, args ...) LOGP(DCCID, lvl, "%s: " fmt, (ci)->name, ## args)</span><br><span style="color: hsl(0, 100%, 40%);">-#define LOGPCS(cs, lvl, fmt, args ...) \</span><br><span style="color: hsl(0, 100%, 40%);">-   LOGP(DCCID, lvl, "%s(%u): " fmt, (cc)->ci->name, (cc)->slot_nr, ## args)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static struct ccid_slot *get_ccid_slot(struct ccid_instance *ci, uint8_t slot_nr)</span><br><span> {</span><br><span>        if (slot_nr >= sizeof(ci->slot))</span><br><span>diff --git a/ccid/ccid_device.h b/ccid/ccid_device.h</span><br><span>new file mode 100644</span><br><span>index 0000000..c7cef47</span><br><span>--- /dev/null</span><br><span>+++ b/ccid/ccid_device.h</span><br><span>@@ -0,0 +1,70 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></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%);">+#define NR_SLOTS  8</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define LOGPCI(ci, lvl, fmt, args ...) LOGP(DCCID, lvl, "%s: " fmt, (ci)->name, ## args)</span><br><span style="color: hsl(120, 100%, 40%);">+#define LOGPCS(cs, lvl, fmt, args ...) \</span><br><span style="color: hsl(120, 100%, 40%);">+  LOGP(DCCID, lvl, "%s(%u): " fmt, (cc)->ci->name, (cc)->slot_nr, ## args)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ccid_pars_decoded {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* global for T0/T1 */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t fi;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t di;</span><br><span style="color: hsl(120, 100%, 40%);">+   enum ccid_clock_stop clock_stop;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool inverse_convention;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t guard_time_etu;</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t waiting_integer;</span><br><span style="color: hsl(120, 100%, 40%);">+      } t0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              enum ccid_t1_csum_type csum_type;</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t guard_time_t1;</span><br><span style="color: hsl(120, 100%, 40%);">+                uint8_t bwi;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t cwi;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t ifsc;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t nad;</span><br><span style="color: hsl(120, 100%, 40%);">+  } t1;</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%);">+struct ccid_slot {</span><br><span style="color: hsl(120, 100%, 40%);">+       /* back-pointer to the ccid_instance */</span><br><span style="color: hsl(120, 100%, 40%);">+       struct ccid_instance *ci;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* number of this slot (0 = first) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t slot_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* is there an ICC physically present (card detect)? */</span><br><span style="color: hsl(120, 100%, 40%);">+       bool icc_present;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* was there an ICC present during the last NotifSlotStatus?</span><br><span style="color: hsl(120, 100%, 40%);">+   * should be set to zero every USB resume and setConfig != 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+       bool icc_present_last;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* is the ICC physically powered? */</span><br><span style="color: hsl(120, 100%, 40%);">+  bool icc_powered;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* is the ICC currently in reset? */</span><br><span style="color: hsl(120, 100%, 40%);">+  bool icc_in_reset;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* is this slot currently busy with processing a CCID command? */</span><br><span style="color: hsl(120, 100%, 40%);">+     bool cmd_busy;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* decided CCID parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ccid_pars_decoded pars;</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%);">+/* CCID operations */</span><br><span style="color: hsl(120, 100%, 40%);">+struct ccid_ops {</span><br><span style="color: hsl(120, 100%, 40%);">+        int (*send_in)(struct ccid_instance *ci, struct msgb *msg);</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%);">+/* An instance of CCID (i.e. a card reader device) */</span><br><span style="color: hsl(120, 100%, 40%);">+struct ccid_instance {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* slots within the reader */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ccid_slot slot[NR_SLOTS];</span><br><span style="color: hsl(120, 100%, 40%);">+      /* set of function pointers implementing specific operations */</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct ccid_ops ops;</span><br><span style="color: hsl(120, 100%, 40%);">+    const char *name;</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%);">+int ccid_handle_out(struct ccid_instance *ci, struct msgb *msg);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/14058">change 14058</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/14058"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I1b171ede38deebfa525a0ee10865da2dc5ec7e4e </div>
<div style="display:none"> Gerrit-Change-Number: 14058 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>