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,
+};