aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2021-06-03 13:11:34 +0200
committerHarald Welte <laforge@osmocom.org>2021-06-03 14:37:45 +0200
commit731e199fc478762869984b6d13a06881087ad2c2 (patch)
treef67916bf222876089210a98f690002fbf4c679bb
parentf69a60f2555fa0cd1b57759b43627e67dfd43773 (diff)
firmware: octsimtest: Support SIMTRACE_MSGT_DT_CEMU_CARDINSERT
The octsimtest board can control the card-insert contact of the OCTSIM under test via an external I2C gpio multiplexer; let's add support for that. Change-Id: I8c9b0c3d862a967832134b24252577739182da62
-rw-r--r--firmware/libboard/octsimtest/include/board.h4
-rw-r--r--firmware/libboard/octsimtest/include/mcp23017.h2
-rw-r--r--firmware/libboard/octsimtest/source/board_octsimtest.c15
-rw-r--r--firmware/libboard/octsimtest/source/mcp23017.c10
-rw-r--r--firmware/libcommon/source/mode_cardemu.c4
5 files changed, 35 insertions, 0 deletions
diff --git a/firmware/libboard/octsimtest/include/board.h b/firmware/libboard/octsimtest/include/board.h
index ad21a1f..530f27b 100644
--- a/firmware/libboard/octsimtest/include/board.h
+++ b/firmware/libboard/octsimtest/include/board.h
@@ -111,6 +111,10 @@
#define HAVE_SLOT_MUX
+#define HAVE_BOARD_CARDINSERT
+struct cardem_inst;
+void board_set_card_insert(struct cardem_inst *ci, bool card_insert);
+
/** Supported modes */
/* SIMtrace board supports sniffer mode */
//#define HAVE_SNIFFER
diff --git a/firmware/libboard/octsimtest/include/mcp23017.h b/firmware/libboard/octsimtest/include/mcp23017.h
index c0f4b13..190588f 100644
--- a/firmware/libboard/octsimtest/include/mcp23017.h
+++ b/firmware/libboard/octsimtest/include/mcp23017.h
@@ -21,5 +21,7 @@
int mcp23017_init(uint8_t slave, uint8_t iodira, uint8_t iodirb);
int mcp23017_test(uint8_t slave);
int mcp23017_toggle(uint8_t slave);
+int mcp23017_set_output_a(uint8_t slave, uint8_t val);
+int mcp23017_set_output_b(uint8_t slave, uint8_t val);
//int mcp23017_write_byte(uint8_t slave, uint8_t addr, uint8_t byte);
//int mcp23017_read_byte(uint8_t slave, uint8_t addr);
diff --git a/firmware/libboard/octsimtest/source/board_octsimtest.c b/firmware/libboard/octsimtest/source/board_octsimtest.c
index 404bef6..1c6a278 100644
--- a/firmware/libboard/octsimtest/source/board_octsimtest.c
+++ b/firmware/libboard/octsimtest/source/board_octsimtest.c
@@ -94,3 +94,18 @@ int board_override_enter_dfu(void)
} else
return 0;
}
+
+void board_set_card_insert(struct cardem_inst *ci, bool card_insert)
+{
+ int s = mux_get_slot();
+
+ /* A0 .. A7 of the MCP are each connected to the gate of a FET which closes
+ * the sim-present signal of the respective slot */
+
+ if (mcp2317_present) {
+ /* we must enable card-presence of the active slot and disable it on all others */
+ mcp23017_set_output_a(MCP23017_ADDRESS, (1 << s));
+ } else {
+ TRACE_WARNING("No MCP23017 present; cannot set CARD_INSERT\r\n");
+ }
+}
diff --git a/firmware/libboard/octsimtest/source/mcp23017.c b/firmware/libboard/octsimtest/source/mcp23017.c
index a4d055f..bc6bd49 100644
--- a/firmware/libboard/octsimtest/source/mcp23017.c
+++ b/firmware/libboard/octsimtest/source/mcp23017.c
@@ -126,6 +126,16 @@ int mcp23017_test(uint8_t slave)
return 0;
}
+int mcp23017_set_output_a(uint8_t slave, uint8_t val)
+{
+ return mcp23017_write_byte(slave, MCP23017_OLATA, val);
+}
+
+int mcp23017_set_output_b(uint8_t slave, uint8_t val)
+{
+ return mcp23017_write_byte(slave, MCP23017_OLATB, val);
+}
+
int mcp23017_toggle(uint8_t slave)
{
// example writing MSB of gpio
diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c
index 3863767..a357f15 100644
--- a/firmware/libcommon/source/mode_cardemu.c
+++ b/firmware/libcommon/source/mode_cardemu.c
@@ -656,6 +656,9 @@ static void process_card_insert(struct cardem_inst *ci, bool card_insert)
{
TRACE_INFO("%u: set card_insert to %s\r\n", ci->num, card_insert ? "INSERTED" : "REMOVED");
+#ifdef HAVE_BOARD_CARDINSERT
+ board_set_card_insert(ci, card_insert);
+#else
if (!ci->pin_insert.pio) {
TRACE_INFO("%u: skipping unsupported card_insert to %s\r\n",
ci->num, card_insert ? "INSERTED" : "REMOVED");
@@ -666,6 +669,7 @@ static void process_card_insert(struct cardem_inst *ci, bool card_insert)
PIO_Set(&ci->pin_insert);
else
PIO_Clear(&ci->pin_insert);
+#endif
}
/* handle a single USB command as received from the USB host */