mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-18 14:28:33 +03:00
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 though 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. Related: SYS#6946 Change-Id: I77118114ba873fdf0778137402888b40f2442456
This commit is contained in:
@@ -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 @@ static void card_emu_report_config(struct card_handle *ch)
|
||||
#else
|
||||
cfg->slot_mux_nr = 0;
|
||||
#endif
|
||||
|
||||
cfg->pres_pol = mode_cardemu_get_presence_pol(ch->num) | CEMU_CONFIG_PRES_POL_VALID;
|
||||
|
||||
usb_buf_upd_len_and_submit(msg);
|
||||
}
|
||||
@@ -1270,6 +1271,11 @@ int card_emu_set_config(struct card_handle *ch, const struct cardemu_usb_msg_con
|
||||
}
|
||||
#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_presence_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);
|
||||
|
||||
|
||||
@@ -79,7 +79,10 @@ struct cardem_inst {
|
||||
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 @@ struct cardem_inst cardem_inst[] = {
|
||||
.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 @@ struct cardem_inst cardem_inst[] = {
|
||||
.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 @@ 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);
|
||||
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 @@ static void process_card_insert(struct cardem_inst *ci, bool card_insert)
|
||||
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 @@ void mode_cardemu_run(void)
|
||||
process_any_usb_commands(queue, ci);
|
||||
}
|
||||
}
|
||||
|
||||
void mode_cardemu_set_presence_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_presence_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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user