ccid: Introduce ccid_slot_ops + implement simulator/stub for it
This adds a new interface to the CCID implementation, on the card/slot
side. The purpose of this interface (based on function pointers) is
to allow for different real hardware or virtual implementations.
Change-Id: I2c38aa69594a3b22bb5b5e256edfb48481e42793
diff --git a/ccid/ccid_slot_sim.c b/ccid/ccid_slot_sim.c
new file mode 100644
index 0000000..d7a5952
--- /dev/null
+++ b/ccid/ccid_slot_sim.c
@@ -0,0 +1,72 @@
+/* Simulated CCID card slot. This is used in absence of a real hardware back-end
+ * in order to test the CCID firmware codebase in a virtual environment */
+
+#include "ccid_device.h"
+
+static const struct ccid_pars_decoded slotsim_def_pars = {
+ .fi = 0,
+ .di = 0,
+ .clock_stop = CCID_CLOCK_STOP_NOTALLOWED,
+ .inverse_convention = false,
+ .t0 = {
+ .guard_time_etu = 0,
+ .waiting_integer = 0,
+ },
+ /* FIXME: T=1 */
+};
+
+static void slotsim_pre_proc_cb(struct ccid_slot *cs, struct msgb *msg)
+{
+ /* do nothing; real hardware would update the slot related state here */
+}
+
+static void slotsim_set_power(struct ccid_slot *cs, bool enable)
+{
+ if (enable) {
+ cs->icc_powered = true;
+ /* FIXME: What to do about ATR? */
+ } else {
+ cs->icc_powered = false;
+ }
+}
+
+static void slotsim_set_clock(struct ccid_slot *cs, enum ccid_clock_command cmd)
+{
+ /* FIXME */
+ switch (cmd) {
+ case CCID_CLOCK_CMD_STOP:
+ break;
+ case CCID_CLOCK_CMD_RESTART:
+ break;
+ default:
+ OSMO_ASSERT(0);
+ }
+}
+
+static int slotsim_set_params(struct ccid_slot *cs, enum ccid_protocol_num proto,
+ const struct ccid_pars_decoded *pars_dec)
+{
+ /* we always acknowledge all parameters */
+ return 0;
+}
+
+static int slotsim_set_rate_and_clock(struct ccid_slot *cs, uint32_t freq_hz, uint32_t rate_bps)
+{
+ /* we always acknowledge all rates/clocks */
+ return 0;
+}
+
+static int slotsim_init(struct ccid_slot *cs)
+{
+ cs->default_pars = &slotsim_def_pars;
+ return 0;
+}
+
+const struct ccid_slot_ops slotsim_slot_ops = {
+ .init = slotsim_init,
+ .pre_proc_cb = slotsim_pre_proc_cb,
+ .set_power = slotsim_set_power,
+ .set_clock = slotsim_set_clock,
+ .set_params = slotsim_set_params,
+ .set_rate_and_clock = slotsim_set_rate_and_clock,
+};