laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/simtrace2/+/26865 )

Change subject: firmware: bugfix: disable cardemu comms in local SIM mode
......................................................................

firmware: bugfix: disable cardemu comms in local SIM mode

This change prevents contention on the ISO7816 bus by disabling the card 
emulation state machine when the SIM switch is in the local mode. Without this 
change, the card emulation firmware can clobber ISO7816 communications and 
cause contention with certain (but not all) SIM cards.

Changes:
- Add 'enabled' flag to cardemu instance that is set/cleared by 
usb_command_sim_select() (the only place where sim switch occurs).
- Flag is initialized as false (disabled) by default, to match local SIM mode 
default.
- When card emulation is disabled, force SIM VCC to be "OFF",  SIM RESET as 
"not in RESET", and drop bytes bytes received on the ISO7816 interface (but do 
service buffers).

Change-Id: I4010f988712eac4a6af8568ccd60062f9de62449
---
M firmware/libcommon/source/mode_cardemu.c
1 file changed, 31 insertions(+), 13 deletions(-)

Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved



diff --git a/firmware/libcommon/source/mode_cardemu.c 
b/firmware/libcommon/source/mode_cardemu.c
index 7fd069a..7f52647 100644
--- a/firmware/libcommon/source/mode_cardemu.c
+++ b/firmware/libcommon/source/mode_cardemu.c
@@ -83,10 +83,21 @@
 #ifdef DETECT_VCC_BY_ADC
        uint32_t vcc_uv;
 #endif
+
+       /*! real-time state of VCC I/O line, irrespective of enabled flag */
        bool vcc_active;
+
+       /*! last VCC state we reported to the card emu state machine 
(conditioned by enabled flag) */
        bool vcc_active_last;
+
+       /*! real-time state of RST I/O line, irrespective of enabled flag */
        bool rst_active;
+
+       /*! last RST state we reported to the card emu state machine 
(conditioned by enabled flag) */
        bool rst_active_last;
+
+       /*! flag indicating whether this instance should perform card 
emulation, or not */
+       bool enabled;
 };

 struct cardem_inst cardem_inst[] = {
@@ -515,19 +526,25 @@
 #endif /* DETECT_VCC_BY_ADC */


-/* called from main loop; dispatches card I/O state changes to card_emu from 
main loop */
+/**
+ * called from main loop; dispatches card I/O state changes to card_emu from 
main loop.
+ * NOTE: conditions I/O state on the ci->enabled flag; if the instance is 
disabled, we assume VCC is
+ * disabled and the device is not in reset
+ */
 static void process_io_statechg(struct cardem_inst *ci)
 {
-       if (ci->vcc_active != ci->vcc_active_last) {
-               card_emu_io_statechg(ci->ch, CARD_IO_VCC, ci->vcc_active);
+       const bool vcc_active = ci->vcc_active && ci->enabled;
+       if (vcc_active != ci->vcc_active_last) {
+               card_emu_io_statechg(ci->ch, CARD_IO_VCC, vcc_active);
                /* FIXME do this for real */
-               card_emu_io_statechg(ci->ch, CARD_IO_CLK, ci->vcc_active);
-               ci->vcc_active_last = ci->vcc_active;
+               card_emu_io_statechg(ci->ch, CARD_IO_CLK, vcc_active);
+               ci->vcc_active_last = vcc_active;
        }

-       if (ci->rst_active != ci->rst_active_last) {
-               card_emu_io_statechg(ci->ch, CARD_IO_RST, ci->rst_active);
-               ci->rst_active_last = ci->rst_active;
+       const bool rst_active = ci->rst_active && ci->enabled;
+       if (rst_active != ci->rst_active_last) {
+               card_emu_io_statechg(ci->ch, CARD_IO_RST, rst_active);
+               ci->rst_active_last = rst_active;
        }
 }

@@ -778,10 +795,8 @@
        if (msgb_l2len(msg) < sizeof(*mss))
                return -1;

-       if (mss->remote_sim)
-               sim_switch_use_physical(ci->num, 0);
-       else
-               sim_switch_use_physical(ci->num, 1);
+       ci->enabled = mss->remote_sim ? true : false;
+       sim_switch_use_physical(ci->num, !ci->enabled);

        return 0;
 }
@@ -925,7 +940,10 @@
                        }
                        uint8_t byte = rbuf_read(&ci->rb);
                        __enable_irq();
-                       card_emu_process_rx_byte(ci->ch, byte);
+
+                       if (ci->enabled) {
+                               card_emu_process_rx_byte(ci->ch, byte);
+                       }
                        //TRACE_ERROR("%uRx%02x\r\n", i, byte);
                }


--
To view, visit https://gerrit.osmocom.org/c/simtrace2/+/26865
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: simtrace2
Gerrit-Branch: master
Gerrit-Change-Id: I4010f988712eac4a6af8568ccd60062f9de62449
Gerrit-Change-Number: 26865
Gerrit-PatchSet: 2
Gerrit-Owner: jtavares <[email protected]>
Gerrit-Reviewer: Hoernchen <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-MessageType: merged

Reply via email to