diff options
author | Harald Welte <laforge@osmocom.org> | 2021-06-03 13:11:34 +0200 |
---|---|---|
committer | Harald Welte <laforge@osmocom.org> | 2021-06-03 14:37:45 +0200 |
commit | 731e199fc478762869984b6d13a06881087ad2c2 (patch) | |
tree | f67916bf222876089210a98f690002fbf4c679bb | |
parent | f69a60f2555fa0cd1b57759b43627e67dfd43773 (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.h | 4 | ||||
-rw-r--r-- | firmware/libboard/octsimtest/include/mcp23017.h | 2 | ||||
-rw-r--r-- | firmware/libboard/octsimtest/source/board_octsimtest.c | 15 | ||||
-rw-r--r-- | firmware/libboard/octsimtest/source/mcp23017.c | 10 | ||||
-rw-r--r-- | firmware/libcommon/source/mode_cardemu.c | 4 |
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 */ |