lynxis lazus has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/simtrace2/+/36981?usp=email )


Change subject: firmware: allow to change the sim presence pin polarity
......................................................................

firmware: allow to change the sim presence pin polarity

The sim presence pin allows the simtrace2 to inform the modem
about the presence of the simcard. On a generic simcard slot a
button is pressed by the simcard which generate a high or low voltage level.
Even there are specifications of minipcie or ngff defining this signal, certain
modems behave different.
Certain modems require different signals from the specification.

Extend the usb protocol to set the behaviour at runtime.

Change-Id: I77118114ba873fdf0778137402888b40f2442456
---
M TODO-RELEASE
M firmware/libcommon/include/simtrace.h
M firmware/libcommon/include/simtrace_prot.h
M firmware/libcommon/source/card_emu.c
M firmware/libcommon/source/mode_cardemu.c
5 files changed, 74 insertions(+), 5 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/simtrace2 refs/changes/81/36981/1

diff --git a/TODO-RELEASE b/TODO-RELEASE
index 5da461b..fb35723 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -8,3 +8,4 @@
 # If any interfaces have been removed or changed since the last public 
release: c:r:0.
 #library       what                    description / commit summary line
 simtrace2      API/ABI change          osmo_st2_transport new member
+simtrace2      API/ABI change          cardemu_usb_msg_config new member
diff --git a/firmware/libcommon/include/simtrace.h 
b/firmware/libcommon/include/simtrace.h
index a37ec4f..aeb56ed 100644
--- a/firmware/libcommon/include/simtrace.h
+++ b/firmware/libcommon/include/simtrace.h
@@ -124,4 +124,8 @@
 void Timer_Init( void );
 void TC0_Counter_Reset( void );

+/* Sim presence pins */
+bool mode_cardemu_get_prensence_pol(uint8_t instance);
+void mode_cardemu_set_prensence_pol(uint8_t instance, bool high);
+
 #endif  /*  SIMTRACE_H  */
diff --git a/firmware/libcommon/include/simtrace_prot.h 
b/firmware/libcommon/include/simtrace_prot.h
index d1eb89b..d95eb00 100644
--- a/firmware/libcommon/include/simtrace_prot.h
+++ b/firmware/libcommon/include/simtrace_prot.h
@@ -261,12 +261,21 @@
 /* enable/disable the generation of DO_STATUS on IRQ endpoint */
 #define CEMU_FEAT_F_STATUS_IRQ 0x00000001

+#define CEMU_CONFIG_PRES_POL_PRES_L 0x00
+#define CEMU_CONFIG_PRES_POL_PRES_H 0x01
+#define CEMU_CONFIG_PRES_POL_VALID 0x02
+
 /* SIMTRACE_MSGT_BD_CEMU_CONFIG */
 struct cardemu_usb_msg_config {
        /* bit-mask of CEMU_FEAT_F flags */
        uint32_t features;
        /* the selected slot number (if an external mux is present) */
        uint8_t slot_mux_nr;
+       /* Sim presence pin polarity. Bit 1 is valid bit. Bit 0 gpio value when 
sim present.
+        * When sim is present, set sim_present gpio to high -> 0x03
+        * When sim is present, set sim_present gpio to low -> 0x02
+        */
+       uint8_t pres_pol;
 } __attribute__ ((packed));

 /***********************************************************************
diff --git a/firmware/libcommon/source/card_emu.c 
b/firmware/libcommon/source/card_emu.c
index e6907e6..e040eea 100644
--- a/firmware/libcommon/source/card_emu.c
+++ b/firmware/libcommon/source/card_emu.c
@@ -24,6 +24,7 @@
 #include "trace.h"
 #include "iso7816_fidi.h"
 #include "card_emu.h"
+#include "simtrace.h"
 #include "simtrace_prot.h"
 #include "usb_buf.h"
 #include <osmocom/core/linuxlist.h>
@@ -1096,7 +1097,7 @@
 #else
        cfg->slot_mux_nr = 0;
 #endif
-
+       cfg->pres_pol = mode_cardemu_get_prensence_pol(ch->num) | 
CEMU_CONFIG_PRES_POL_VALID;

        usb_buf_upd_len_and_submit(msg);
 }
@@ -1270,6 +1271,11 @@
        }
 #endif

+       if (scfg_len >= sizeof(uint32_t)+sizeof(uint8_t)+sizeof(uint8_t)) {
+               if (scfg->pres_pol & CEMU_CONFIG_PRES_POL_VALID)
+                       mode_cardemu_set_prensence_pol(ch->num, scfg->pres_pol 
& CEMU_CONFIG_PRES_POL_PRES_H);
+       }
+
        /* send back a report of our current configuration */
        card_emu_report_config(ch);

diff --git a/firmware/libcommon/source/mode_cardemu.c 
b/firmware/libcommon/source/mode_cardemu.c
index a05840e..60c14ea 100644
--- a/firmware/libcommon/source/mode_cardemu.c
+++ b/firmware/libcommon/source/mode_cardemu.c
@@ -79,7 +79,10 @@
        uint8_t ep_out;
        uint8_t ep_in;
        uint8_t ep_int;
+       /*! Pin to set when SIM is present/inserted (SIM presence pin). */
        const Pin pin_insert;
+       /*! Invert the Pin polarity. When not inverted, the SIM pin_insert will 
be High, when a SIM is present. */
+       bool pin_insert_inverted;
 #ifdef DETECT_VCC_BY_ADC
        uint32_t vcc_uv;
 #endif
@@ -113,7 +116,10 @@
                .ep_int = SIMTRACE_CARDEM_USB_EP_USIM1_INT,
 #ifdef PIN_SET_USIM1_PRES
                .pin_insert = PIN_SET_USIM1_PRES,
-#endif
+#endif /* PIN_SET_USIM1_PRES */
+#ifdef PIN_SET_USIM1_PRES_INVERTED
+               .pin_insert_inverted = true,
+#endif /* PIN_SET_USIM1_PRES_INVERTED */
        },
 #ifdef CARDEMU_SECOND_UART
        {
@@ -128,7 +134,10 @@
                .ep_int = SIMTRACE_CARDEM_USB_EP_USIM2_INT,
 #ifdef PIN_SET_USIM2_PRES
                .pin_insert = PIN_SET_USIM2_PRES,
-#endif
+#endif /* PIN_SET_USIM2_PRES */
+#ifdef PIN_SET_USIM2_PRES_INVERTED
+               .pin_insert_inverted = true,
+#endif /* PIN_SET_USIM2_PRES_INVERTED */
        },
 #endif
 };
@@ -700,7 +709,7 @@
        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);
+       board_set_card_insert(ci, card_insert ^ ci->pin_insert_inverted);
 #else
        if (!ci->pin_insert.pio) {
                TRACE_INFO("%u: skipping unsupported card_insert to %s\r\n",
@@ -708,7 +717,7 @@
                return;
        }

-       if (card_insert)
+       if (card_insert ^ ci->pin_insert_inverted)
                PIO_Set(&ci->pin_insert);
        else
                PIO_Clear(&ci->pin_insert);
@@ -962,3 +971,25 @@
                process_any_usb_commands(queue, ci);
        }
 }
+
+void mode_cardemu_set_prensence_pol(uint8_t instance, bool high)
+{
+       struct cardem_inst *ci;
+
+       if (instance >= ARRAY_SIZE(cardem_inst))
+               return;
+
+       ci = &cardem_inst[instance];
+       ci->pin_insert_inverted = !high;
+}
+
+bool mode_cardemu_get_prensence_pol(uint8_t instance)
+{
+       struct cardem_inst *ci;
+
+       if (instance >= ARRAY_SIZE(cardem_inst))
+               return false;
+
+       ci = &cardem_inst[instance];
+       return !ci->pin_insert_inverted;
+}

--
To view, visit https://gerrit.osmocom.org/c/simtrace2/+/36981?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: simtrace2
Gerrit-Branch: master
Gerrit-Change-Id: I77118114ba873fdf0778137402888b40f2442456
Gerrit-Change-Number: 36981
Gerrit-PatchSet: 1
Gerrit-Owner: lynxis lazus <lyn...@fe80.eu>
Gerrit-MessageType: newchange

Reply via email to