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