5 Commits

Author SHA1 Message Date
Oliver Smith
c38ad746f2 Bump version: 0.8.1 → 0.9.0
Change-Id: I6965017fcd5323677ce11fd9860d4355eb8f770f
2025-02-12 16:09:26 +01:00
Harald Welte
64e0adedb0 README.md: Add note to avoid using a VM
Change-Id: I59602e6a05600fa3e100e17c10e48977391361e3
2024-08-27 16:10:45 +02:00
Alexander Couzens
f9885fe019 simtrace2-cardem-pcsc: allow to set sim presence polarity
Add api call osmo_st2_cardem_request_config2(struct cardemu_usb_msg_config *)
which contains a full cardemu_usb_msg_config.

Related: SYS#6946
Change-Id: Iacde63e667472a85a5f18cb4ca99dcfa1a84dd59
2024-06-23 18:47:42 +02:00
Alexander Couzens
ec9b0b5254 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
2024-06-23 18:47:40 +02:00
Alexander Couzens
0cd501ef80 dissector: add support for sim polarity
Needs testing.

Related: SYS#6946
Change-Id: If3ae350d0f4d737bc9e80c4f5d73cc1a39d076af
2024-06-13 23:58:44 +02:00
16 changed files with 218 additions and 17 deletions

View File

@@ -41,3 +41,14 @@ The host software includes
* simtrace2-list - list any USB-attached devices running simtrace2 firmware
* simtrace2-sniff - interface the 'trace' firmware to obtain card protocol traces
* simtrace2-cardem-pcsc - interface the 'cardem' fimrware to use a SIM in a PC/SC reader
Do not expect SIMtrace2 to work in VMs
--------------------------------------
We only support running SIMtrace2 together with a Linux system running
"bare iron" on actual hardware (x86, x86_64, arm, ...). **using VMs
with USB pass-through for things with critical timing like SIMtrace2 is
calling for trouble** and we will not accept related bug reports or
support you if you do. If you still want to use VMs: Feel free to do
so, but understand that it's unsupported and you are on your own.

View File

@@ -3,8 +3,7 @@
# In short: https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info
# LIBVERSION=c:r:a
# If the library source code has changed at all since the last update, then increment revision: c:r + 1:a.
# If any interfaces have been added, removed, or changed since the last update: c + 1:0:0.
# If any interfaces have been added, removed, or changed since the last update: c + 1:0:a.
# If any interfaces have been added since the last public release: c:r:a + 1.
# 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

View File

@@ -58,6 +58,7 @@ local hf_pts_resp = ProtoField.bytes("usb_simtrace.pts_resp", "PTS response")
local hf_cemu_cfg_features = ProtoField.uint32("usb_simtrace.cemu_cfg.features.status_irq", "CardEm Features", base.HEX)
local hf_cemu_cfg_slot_mux_nr = ProtoField.uint32("usb_simtrace.cemu_cfg.features.slot_mux_nr", "CardEm Slot Mux Nr", base.DEC)
local hf_cemu_cfg_presence_polarity = ProtoField.uint8("usb_simtrace.cemu_cfg.features.presence_polarity", "Sim presence polarity", base.DEC)
local card_insert_types = {
[0x00] = "not inserted",
@@ -71,6 +72,9 @@ local CEMU_STATUS_F_RCEMU_ACTIVE = ProtoField.uint32("usb_simtrace.CEMU_STATUS.
local CEMU_STATUS_F_CARD_INSERT = ProtoField.uint32("usb_simtrace.CEMU_STATUS.F_CARD_INSERT", "CARD_INSERT", base.HEX_DEC, NULL, 0x00000008)
local CEMU_STATUS_F_RESET_ACTIVE = ProtoField.uint32("usb_simtrace.CEMU_STATUS.F_RESET_ACTIVE", "RESET_ACTIVE", base.HEX_DEC, NULL, 0x00000010)
local CEMU_CONFIG_PRES_POL_PRES_H = ProtoField.uint32("usb_simtrace.CEMU_CONFIG.PRES_POL_PRES_H", "PRESENCE_HIGH", base.HEX_DEC, NULL, 0x00000001)
local CEMU_CONFIG_PRES_POL_VALID = ProtoField.uint32("usb_simtrace.CEMU_CONFIG.PRES_POL_VALID", "PRESENCE_VALID", base.HEX_DEC, NULL, 0x00000002)
local modem_reset_types = {
[0x00] = "de-assert",
[0x01] = "assert",
@@ -89,9 +93,10 @@ usb_simtrace_protocol.fields = {
msgtype, seqnr, slotnr, reserved, payloadlen, payload,
pb_and_rx, pb_and_tx, final, tpdu_hdr, rxtxdatalen, rxtxdata,
CEMU_STATUS_F_VCC_PRESENT, CEMU_STATUS_F_CLK_ACTIVE, CEMU_STATUS_F_RCEMU_ACTIVE, CEMU_STATUS_F_CARD_INSERT, CEMU_STATUS_F_RESET_ACTIVE,
CEMU_CONFIG_PRES_POL_PRES_H, CEMU_CONFIG_PRES_POL_VALID,
modem_reset_status, modem_reset_len,
hf_pts_len, hf_pts_req, hf_pts_resp,
hf_cemu_cfg_features, hf_cemu_cfg_slot_mux_nr,
hf_cemu_cfg_features, hf_cemu_cfg_slot_mux_nr, hf_cemu_cfg_presence_polarity,
hf_cemu_cardinsert, hf_modem_sim_select,
}
@@ -214,7 +219,15 @@ function dissect_cemu_config(payload_data, pinfo, tree)
local subtree = tree:add(usb_simtrace_protocol, payload_data, "Card Emu Config")
subtree:add(hf_cemu_cfg_features, payload_data(0,4));
subtree:add(hf_cemu_cfg_slot_mux_nr, payload_data(4,1));
if payload_data:len() >= 4 then
subtree:add(hf_cemu_cfg_slot_mux_nr, payload_data(4,1));
end
if payload_data:len() >= 5 then
local pres = payload_data(5,1):le_uint();
subtree:add(hf_cemu_cfg_presence_polarity, payload_data(5,1));
headerSubtree:add(CEMU_CONFIG_PRES_POL_PRES_H, pres)
headerSubtree:add(CEMU_CONFIG_PRES_POL_VALID, pres)
end
end
function dissect_modem_sim_sel(payload_data, pinfo, tree)

96
debian/changelog vendored
View File

@@ -1,3 +1,99 @@
simtrace2 (0.9.0) unstable; urgency=medium
[ Oliver Smith ]
* host/contrib/simtrace2.spec.in: update
* treewide: remove FSF address
* contrib/jenkins.sh: set USE_CLANG=1
* Cosmetic: fix CI errors
* debian/rules: remove override_dh_autoreconf
* debian: set compat level to 10
* contrib/jenkins: tweak shell logic
* firmware/Makefile: don't use distribution's CFLAGS
* contrib: remove rpm spec file
[ Eric Wild ]
* firmware: add crc stub to all dfu apps to ensure reliable loading
* wireshark lua dissector: dissect more
* lua dissector: adjust usage instructions
* conrtrib/upload : upload elf files
* contrib/jenkins.sh : build and publish combined targets
* fw: only build the bl with clang
[ James Tavares ]
* simtrace2-tool: add "modem sim-card (insert|remove)" command
* firmware: add definition for main osc bypass when using external osc
* gitignore: add missing entries binaries
* firmware: bugfix: disable cardemu comms in local SIM mode
* main: rotor: erase immediately after send
* Fix missing generation of waiting-time-extension in some situations
[ Harald Welte ]
* host: Print strerror(errno) in case of problems opening the USB device
* cosmetic: Fix indent of printf() statement
* host: properly zero-initialize interface match structures
* contrib/simtrace.lua: Add VID/PID of all currentl simtrace2 devices
* cosmetic: contrib/simtrace.lua: more consistent formatting
* contrib/simtrace.lua: Add header with author/description/usage
* contrib/simtrace.lua: print length + slot-number in decimal only
* contrib/simtrace.lua: Don't print SIMTRACE_MSGT_ in every COL_INFO
* contrib/simtrace.lua: Dissect some more cardem related message types
* contrib/simtrace.lua: Register for "decode as..."
* cardem: Report the VCC voltage (if supported)
* card_emu_uart_interrupt: ASSERT if we get called with wrong uart_chan
* cardem: set more reasonable interrupt priorities
* host: Always initialize libosmocore logging before using it
* simtrace2-cardem-pcsc: rename 'flags' to 'status_flags'
* simtrace2-cardem-pcsc: Move all logging into libosmocore
* simtrace2-cardem-pcsc: Detect card power-up without RESET
* host: Don't pass -1 (converted to 255) as address
* simtrace2-cardem-pcsc: Fix copy+paste error in log message
* simtrace2-cardem-pcsc: continue in case of LIBUSB_TRANSFER_ERROR
* contrib/simtrace.lua: Add Flag bits + Data to COL_INFO
* Reduce bInterval of interrupt endpoints to avoid interrupt misses
* simtrace2-cardem-pcsc.c: Send APDUs via GSMTAP
* update git URLs (git -> https; gitea)
* cardem: reset the uC in case of USB disconnect
* cosmetic: Fix compile-time #error message string typo
* firmware/sniffer: Fix copy+paste when logging invalid INS bytes
* firmware/sniffer: Log parity errors, just like overruns and framing errors
* firmware/sniffer: refactor setting TPDU state
* firmware/sniffer: Log old and new state in ISO7816-3 state changes
* firmware/sniffer: Avoid extra call for rbuf_is_full
* firmware/sniffer: Fix programming error in PPS
* firmware/sniffer: Make all global variables 'static'
* firmware/sniffer: Group global variables in structs
* firmware/sniffer: Log cause of WT change
* firmware/sniffer: Rename global variable 'wt' to 'g_wt'
* firmware/sniffer: Disable TIMEOUT interrupts in USART IER on exit
* firmware/sniffer: Add + use 16bit ringbuffer
* firmware/sniffer: Pass PARITY/OVERRUN/FRAMING error via ringbuffer
* firmware/sniffer: Handle WT timeouts via ring-buffer
* firmware/sniffer: introduce #define for interrupt enable flags
* firmware/sniffer: Enable interrupts for overrun/parity/frame errors
* Fix unchecked return value of osmo_libusb_init()
* Add funding link to github mirror
* README.md: Fix mark-down nested bullet syntax
* README.md: Fix mark-down nested bullet syntax
* README.md: add links to SIMtrace2 and QMOD
* README.md: Add links to where hardware can be bought
* README.md: Add section on ngff_carem
* README.md: Add note to avoid using a VM
[ Alexander Couzens ]
* firmware: usb: call USBD_HAL_DISCONNECT while usb init to recover from resets
* ngff_cardem: cosmetic: fix superflous space
* dissector: add support for sim polarity
* firmware: allow to change the sim presence pin polarity
* simtrace2-cardem-pcsc: allow to set sim presence polarity
[ Vadim Yanitskiy ]
* host/cardem: fix integer overflow in process_do_rx_da()
[ Philipp Maier ]
* simtrace2-cardem-pcsc: mark reset events in GSMTAP trace
-- Oliver Smith <osmith@sysmocom.de> Wed, 12 Feb 2025 16:07:53 +0100
simtrace2 (0.8.1) unstable; urgency=medium
* host/contrib/simtrace2.spec.in: fix soname

2
debian/control vendored
View File

@@ -10,7 +10,7 @@ Build-Depends: debhelper (>= 10),
pkg-config,
git,
dh-autoreconf,
libosmocore-dev (>= 1.4.0),
libosmocore-dev (>= 1.11.0),
libpcsclite-dev,
libnewlib-arm-none-eabi,
libusb-1.0-0-dev,

View File

@@ -124,4 +124,8 @@ extern void mode_cardemu_usart1_irq(void);
void Timer_Init( void );
void TC0_Counter_Reset( void );
/* Sim presence pins */
bool mode_cardemu_get_presence_pol(uint8_t instance);
void mode_cardemu_set_presence_pol(uint8_t instance, bool high);
#endif /* SIMTRACE_H */

View File

@@ -261,12 +261,21 @@ struct cardemu_usb_msg_error {
/* 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 a validity 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));
/***********************************************************************

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -7,6 +7,7 @@ CFLAGS=-g -Wall $(LIBOSMOCORE_CFLAGS) \
-I../atmel_softpack_libraries/libchip_sam3s/cmsis \
-I../atmel_softpack_libraries/libchip_sam3s/include \
-I../atmel_softpack_libraries/usb/include \
-I../atmel_softpack_libraries/ \
-I../libcommon/include \
-I../libboard/common/include \
-I../libboard/simtrace/include \

View File

@@ -93,7 +93,14 @@ void card_emu_uart_reset_wt(uint8_t uart_chan)
printf("%s(uart_chan=%u\n", __func__, uart_chan);
}
void mode_cardemu_set_presence_pol(uint8_t instance, bool high)
{
}
bool mode_cardemu_get_presence_pol(uint8_t instance)
{
return false;
}
/***********************************************************************
* test helper functions

View File

@@ -56,9 +56,9 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])],
CFLAGS="$saved_CFLAGS"
AC_SUBST(SYMBOL_VISIBILITY)
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.4.0)
PKG_CHECK_MODULES(LIBOSMOSIM, libosmosim >= 1.4.0)
PKG_CHECK_MODULES(LIBOSMOUSB, libosmousb >= 1.4.0)
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.11.0)
PKG_CHECK_MODULES(LIBOSMOSIM, libosmosim >= 1.11.0)
PKG_CHECK_MODULES(LIBOSMOUSB, libosmousb >= 1.11.0)
PKG_CHECK_MODULES(LIBUSB, libusb-1.0)
AC_ARG_ENABLE(sanitize,

View File

@@ -41,6 +41,8 @@ struct osmo_st2_cardem_inst {
void *priv;
};
struct cardemu_usb_msg_config;
int osmo_st2_slot_tx_msg(struct osmo_st2_slot *slot, struct msgb *msg,
uint8_t msg_class, uint8_t msg_type);
@@ -53,7 +55,7 @@ int osmo_st2_cardem_request_sw_tx(struct osmo_st2_cardem_inst *ci, const uint8_t
int osmo_st2_cardem_request_set_atr(struct osmo_st2_cardem_inst *ci, const uint8_t *atr,
unsigned int atr_len);
int osmo_st2_cardem_request_config(struct osmo_st2_cardem_inst *ci, uint32_t features);
int osmo_st2_cardem_request_config2(struct osmo_st2_cardem_inst *ci, const struct cardemu_usb_msg_config *config);
int osmo_st2_modem_reset_pulse(struct osmo_st2_slot *slot, uint16_t duration_ms);
int osmo_st2_modem_reset_active(struct osmo_st2_slot *slot);

View File

@@ -1,7 +1,7 @@
# This is _NOT_ the library release version, it's an API version.
# Please read chapter "Library interface versions" of the libtool documentation
# before making any modifications: https://www.gnu.org/software/libtool/manual/html_node/Versioning.html
ST2_LIBVERSION=1:0:0
ST2_LIBVERSION=2:0:1
AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS= -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOSIM_CFLAGS) $(LIBUSB_CFLAGS) $(COVERAGE_CFLAGS)

View File

@@ -272,6 +272,21 @@ int osmo_st2_cardem_request_config(struct osmo_st2_cardem_inst *ci, uint32_t fea
return osmo_st2_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_CARDEM, SIMTRACE_MSGT_BD_CEMU_CONFIG);
}
/* user_cfg is in host byte order. */
int osmo_st2_cardem_request_config2(struct osmo_st2_cardem_inst *ci, const struct cardemu_usb_msg_config *user_cfg)
{
struct msgb *msg = st_msgb_alloc();
struct cardemu_usb_msg_config *tx_cfg;
tx_cfg = (struct cardemu_usb_msg_config *) msgb_put(msg, sizeof(*tx_cfg));
LOGSLOT(ci->slot, LOGL_NOTICE, "<= %s(features=%08x)\n", __func__, tx_cfg->features);
memcpy(tx_cfg, user_cfg, sizeof(*tx_cfg));
osmo_store32le(user_cfg->features, &tx_cfg->features);
return osmo_st2_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_CARDEM, SIMTRACE_MSGT_BD_CEMU_CONFIG);
}
/***********************************************************************
* Modem Control protocol
***********************************************************************/

View File

@@ -413,6 +413,7 @@ static void print_help(void)
"\t-S\t--usb-altsetting ALTSETTING_ID\n"
"\t-A\t--usb-address\tADDRESS\n"
"\t-H\t--usb-path\tPATH\n"
"\t-Z\t--set-sim-presence\t<0/1>\n"
"\n"
);
}
@@ -431,6 +432,7 @@ static const struct option opts[] = {
{ "usb-altsetting", 1, 0, 'S' },
{ "usb-address", 1, 0, 'A' },
{ "usb-path", 1, 0, 'H' },
{ "set-sim-presence", 1, 0, 'Z' },
{ NULL, 0, 0, 0 }
};
@@ -487,6 +489,7 @@ int main(int argc, char **argv)
char *path = NULL;
struct osim_reader_hdl *reader;
struct osim_card_hdl *card;
struct cardemu_usb_msg_config cardem_config = { .features = CEMU_FEAT_F_STATUS_IRQ };
print_welcome();
@@ -509,7 +512,7 @@ int main(int argc, char **argv)
while (1) {
int option_index = 0;
c = getopt_long(argc, argv, "hi:V:P:C:I:S:A:H:akn:t:", opts, &option_index);
c = getopt_long(argc, argv, "hi:V:P:C:I:S:A:H:akn:t:Z:", opts, &option_index);
if (c == -1)
break;
switch (c) {
@@ -553,6 +556,10 @@ int main(int argc, char **argv)
case 'H':
path = optarg;
break;
case 'Z':
cardem_config.pres_pol = atoi(optarg) ? CEMU_CONFIG_PRES_POL_PRES_H : 0;
cardem_config.pres_pol |= CEMU_CONFIG_PRES_POL_VALID;
break;
}
}
@@ -636,7 +643,7 @@ int main(int argc, char **argv)
allocate_and_submit_in(ci);
/* request firmware to generate STATUS on IRQ endpoint */
osmo_st2_cardem_request_config(ci, CEMU_FEAT_F_STATUS_IRQ);
osmo_st2_cardem_request_config2(ci, &cardem_config);
/* simulate card-insert to modem (owhw, not qmod) */
osmo_st2_cardem_request_card_insert(ci, true);