15 Commits

Author SHA1 Message Date
Harald Welte
e1961beea1 Use gsmtap_inst_fd2() to remove compiler warning
gsmtap.c: In function 'osmo_st2_gsmtap_send_apdu':
gsmtap.c:69:9: warning: 'gsmtap_inst_fd' is deprecated: Use gsmtap_inst_fd2() instead [-Wdeprecated-declarations]
   69 |         rc = write(gsmtap_inst_fd(g_gti), buf, gross_len);
      |         ^~

Change-Id: I62de38175e63cb563635a01b025b805981e4b7a9
2026-02-27 11:18:45 +01:00
Oliver Smith
d0ad985eb0 Generate a version.h file
Related: OS#6626
Change-Id: Ia894a9d9a20e343755d8060822d33b8a1c59b4db
2025-06-23 16:00:59 +02:00
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
Alexander Couzens
d405133672 ngff_cardem: cosmetic: fix superflous space
Change-Id: Ib155d5778a0df7865958ab65fe2ce48b44f4326d
2024-05-22 15:09:23 +01:00
Oliver Smith
69deee859f contrib: remove rpm spec file
Related: https://osmocom.org/news/255
Related: OS#6446
Change-Id: I0cc8d753b26648efa7c9fb5798f7c4227c328547
2024-05-08 14:41:11 +02:00
Harald Welte
3fbed27b7a README.md: Add section on ngff_carem
This board has been around for ages and is supported from fimware + host
software.

Change-Id: I586b170fd6314af53a90d09020e41114714f1fec
2024-03-23 12:05:10 +01:00
Harald Welte
b0d66ebfb0 README.md: Add links to where hardware can be bought
Change-Id: I0b990513153d60c0d70ca29b7243cf7a10c49575
2024-03-23 12:04:10 +01:00
Harald Welte
26517d89de README.md: add links to SIMtrace2 and QMOD
Change-Id: I6279765db0fdf92487a47f3ada28e4f49dd6e881
2024-03-23 12:03:45 +01:00
Harald Welte
6d2d1eeb36 README.md: Fix mark-down nested bullet syntax
Change-Id: I0b5a4cc00be4a8adba2797092fca41b99b336b79
2024-03-23 12:03:07 +01:00
Harald Welte
651987ae62 README.md: Fix mark-down nested bullet syntax
Change-Id: I252fa946010a2750d268b604d72e070ada99931c
2024-03-23 11:33:03 +01:00
Harald Welte
ec157679d6 Add funding link to github mirror
see https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/displaying-a-sponsor-button-in-your-repository

Change-Id: I8be9c11198d09be628994ab0f530b5666fd25a7f
2024-03-23 11:32:23 +01:00
26 changed files with 267 additions and 252 deletions

1
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1 @@
open_collective: osmocom

3
.gitignore vendored
View File

@@ -25,4 +25,5 @@ host/tests
usb_strings_generated.h
firmware/usbstring/usbstring
firmware/apps/*/usb_strings.txt.patched
firmware/misc/crctool
firmware/misc/crctool
host/include/osmocom/simtrace2/version.h

View File

@@ -13,12 +13,17 @@ stack and host software.
Supported Hardware
------------------
* Osmocom SIMtrace 1.x with SAM3 controller
** this is open hardware and schematics / PCB design is published
* sysmocom sysmoQMOD (with 4 Modems, 4 SIM slots and 2 SAM3)
** this is a proprietary device, publicly available from sysmocom
* Osmocom [SIMtrace2](https://osmocom.org/projects/simtrace2/wiki) with SAM3 controller
* this is open hardware and schematics / PCB design is published
* pre-built hardware available from [sysmocom webshop](https://shop.sysmocom.de/SIMtrace2-Hardware-Kit/simtrace2-kit)
* Osmocom [ngff-cardem](https://osmocom.org/projects/ngff-cardem/wiki) M.2/NGFF modem carrier with SAM3 controller
* this is open hardware and schematics / PCB design is published
* pre-built hardware available from [sysmocom webshoo](https://shop.sysmocom.de/M.2-modem-carrier-with-remote-SIM-tracing/ngff-cardem-kit-external)
* sysmocom [sysmoQMOD](https://sysmocom.de/products/lab/sysmoqmod/index.html) (with 4 Modems, 4 SIM slots and 2 SAM3)
* this is a proprietary device, publicly available from sysmocom
* hardware evaluation kit available from [sysmocom webshop](https://shop.sysmocom.de/sysmoQMOD-evaluation-kit/sysmoQMOD-evk)
* sysmocom OWHW (with 2 Modems and 1 SAM3 onboard)
** this is not publicly available hardware, but still supported
* this is not publicly available hardware, but still supported
This Repository
---------------
@@ -36,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

@@ -1672,10 +1672,6 @@ uint8_t USBD_HAL_Halt(uint8_t bEndpoint, uint8_t ctl)
UDP->UDP_RST_EP |= 1 << bEndpoint;
UDP->UDP_RST_EP &= ~(1 << bEndpoint);
}
/* This fixes a weird bug with regard to ping-pong OUT endpoints */
UDP->UDP_RST_EP |= 1 << bEndpoint;
UDP->UDP_RST_EP &= ~(1 << bEndpoint);
}
/* Return Halt status */

View File

@@ -146,8 +146,8 @@ int board_override_enter_dfu(void)
return 0;
}
static const Pin deton = {PIO_PA13, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT};
static const Pin detoff = {PIO_PA13, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT};
static const Pin deton = {PIO_PA13, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT};
static const Pin detoff = {PIO_PA13, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT};
void board_set_card_insert(struct cardem_inst *ci, bool card_insert)
{

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

@@ -1,6 +1,6 @@
/* SIMtrace2 USB protocol
*
* (C) 2015-2022 by Harald Welte <hwelte@hmw-consulting.de>
* (C) 2015-2017 by Harald Welte <hwelte@hmw-consulting.de>
* (C) 2018 by sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de>
*
* This program is free software; you can redistribute it and/or modify
@@ -84,8 +84,6 @@ enum simtrace_msg_type_sniff {
SIMTRACE_MSGT_SNIFF_PPS,
/* TPDU data */
SIMTRACE_MSGT_SNIFF_TPDU,
/* Statistics */
SIMTRACE_MSGT_DO_SNIFF_STATS,
};
/* common message header */
@@ -263,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));
/***********************************************************************
@@ -340,24 +347,3 @@ struct sniff_data {
/* data */
uint8_t data[0];
} __attribute__ ((packed));
/* SIMTRACE_MSGT_DO_SNIFF_STATS */
struct st_sniff_stats {
uint32_t flags; /* RFU */
uint32_t num_bytes; /* total lnumber of bytes received */
uint32_t num_tpdu; /* total number of TPDUs received */
uint32_t num_atr; /* total number of ATRs received */
uint32_t num_pps; /* total number of PPS (req, resp) received */
uint32_t num_reset; /* total number of resets */
struct {
uint32_t overruns;
uint32_t framing_errs;
uint32_t parity_errs;
uint32_t breaks;
} num_usart;
uint32_t num_waiting_time_exp;
uint32_t num_tpdu_overflows; /* TPDU buffer overflows */
uint32_t num_csum_errors; /* ATR + PPS checksum */
uint32_t num_ringbuf_overflows; /* ISR->main ringbuffer overflows */
uint32_t num_tpdu_malformed;
} __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

@@ -116,7 +116,6 @@ enum tpdu_sniff_state {
#define RBUF16_F_FRAMING 0x0200
#define RBUF16_F_PARITY 0x0400
#define RBUF16_F_TIMEOUT_WT 0x0800
#define RBUF16_F_BREAK 0x1000
#define RBUF16_F_DATA_BYTE 0x8000
/*------------------------------------------------------------------------------
@@ -151,9 +150,6 @@ static struct ringbuf16 sniff_buffer;
/* Flags to know is the card status changed (see SIMTRACE_MSGT_DT_SNIFF_CHANGE flags) */
static volatile uint32_t change_flags = 0;
/* statistics for SIMTRACE_MSGT_DO_SNIFF_STATS */
static struct st_sniff_stats g_stats;
/* ISO 7816 variables */
/*! ISO 7816-3 state */
static enum iso7816_3_sniff_state iso_state = ISO7816_S_RESET;
@@ -457,7 +453,6 @@ static void process_byte_atr(uint8_t byte)
default:
TRACE_WARNING("Invalid TS received\n\r");
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
g_stats.num_tpdu_malformed++;
usb_send_atr(SNIFF_DATA_FLAG_ERROR_MALFORMED); /* send ATR to host software using USB */
change_state(ISO7816_S_WAIT_ATR); /* reset state */
break;
@@ -528,11 +523,9 @@ static void process_byte_atr(uint8_t byte)
/* We still consider the data as valid (e.g. for WT) even is the checksum is wrong.
* It is up to the reader to handle this error (e.g. by resetting)
*/
g_stats.num_csum_errors++;
}
}
usb_send_atr(flags); /* send ATR to host software using USB */
g_stats.num_atr++;
change_state(ISO7816_S_WAIT_TPDU); /* go to next state */
break;
default:
@@ -624,7 +617,6 @@ static void process_byte_pps(uint8_t byte)
} else {
TRACE_INFO("Invalid PPSS received\n\r");
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
g_stats.num_tpdu_malformed++;
usb_send_pps(SNIFF_DATA_FLAG_ERROR_MALFORMED); /* send ATR to host software using USB */
change_state(ISO7816_S_WAIT_TPDU); /* go back to TPDU state */
}
@@ -676,7 +668,6 @@ static void process_byte_pps(uint8_t byte)
if (0 == check) { /* checksum is valid */
change_state(ISO7816_S_WAIT_PPS_RSP); /* go to next state */
} else { /* checksum is invalid */
g_stats.num_csum_errors++;
change_state(ISO7816_S_WAIT_TPDU); /* go to next state */
}
} else if (ISO7816_S_IN_PPS_RSP == iso_state) {
@@ -696,9 +687,7 @@ static void process_byte_pps(uint8_t byte)
usb_send_fidi(pps_cur[2]); /* send Fi/Di change notification to host software over USB */
} else { /* checksum is invalid */
TRACE_INFO("PPS negotiation failed\n\r");
g_stats.num_csum_errors++;
}
g_stats.num_pps++;
change_state(ISO7816_S_WAIT_TPDU); /* go to next state */
}
break;
@@ -735,7 +724,6 @@ static void process_byte_tpdu(uint8_t byte)
return;
}
if (g_tpdu.packet_i >= ARRAY_SIZE(g_tpdu.packet)) {
g_stats.num_tpdu_overflows++;
TRACE_ERROR("TPDU data overflow\n\r");
return;
}
@@ -746,7 +734,6 @@ static void process_byte_tpdu(uint8_t byte)
if (0xff == byte) {
TRACE_WARNING("0xff is not a valid class byte\n\r");
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
g_stats.num_tpdu_malformed++;
usb_send_tpdu(SNIFF_DATA_FLAG_ERROR_MALFORMED); /* send ATR to host software using USB */
change_state(ISO7816_S_WAIT_TPDU); /* go back to TPDU state */
return;
@@ -759,7 +746,6 @@ static void process_byte_tpdu(uint8_t byte)
if ((0x60 == (byte & 0xf0)) || (0x90 == (byte & 0xf0))) {
TRACE_WARNING("invalid INS 0x%02x\n\r", byte);
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
g_stats.num_tpdu_malformed++;
usb_send_tpdu(SNIFF_DATA_FLAG_ERROR_MALFORMED); /* send ATR to host software using USB */
change_state(ISO7816_S_WAIT_TPDU); /* go back to TPDU state */
return;
@@ -800,7 +786,6 @@ static void process_byte_tpdu(uint8_t byte)
} else {
TRACE_WARNING("invalid SW1 0x%02x\n\r", byte);
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
g_stats.num_tpdu_malformed++;
usb_send_tpdu(SNIFF_DATA_FLAG_ERROR_MALFORMED); /* send ATR to host software using USB */
change_state(ISO7816_S_WAIT_TPDU); /* go back to TPDU state */
return;
@@ -809,7 +794,6 @@ static void process_byte_tpdu(uint8_t byte)
case TPDU_S_SW2:
g_tpdu.packet[g_tpdu.packet_i++] = byte;
usb_send_tpdu(0); /* send TPDU to host software using USB */
g_stats.num_tpdu++;
change_state(ISO7816_S_WAIT_TPDU); /* this is the end of the TPDU */
break;
case TPDU_S_DATA_SINGLE:
@@ -848,28 +832,17 @@ void Sniffer_usart_isr(void)
if (csr & US_CSR_RXRDY) {
/* Read communication data byte between phone and SIM */
byte = RBUF16_F_DATA_BYTE | (sniff_usart.base->US_RHR & 0xff);
g_stats.num_bytes++;
/* Reset WT timer */
wt_remaining = g_wt;
}
/* Verify if there was an error */
if (csr & US_CSR_OVRE) {
g_stats.num_usart.overruns++;
if (csr & US_CSR_OVRE)
byte |= RBUF16_F_OVERRUN;
}
if (csr & US_CSR_FRAME) {
g_stats.num_usart.framing_errs++;
if (csr & US_CSR_FRAME)
byte |= RBUF16_F_FRAMING;
}
if (csr & US_CSR_PARE) {
g_stats.num_usart.parity_errs++;
if (csr & US_CSR_PARE)
byte |= RBUF16_F_PARITY;
}
if (csr & US_CSR_RXBRK) {
g_stats.num_usart.breaks++;
byte |= RBUF16_F_BREAK;
};
if (csr & (US_CSR_OVRE|US_CSR_FRAME|US_CSR_PARE))
sniff_usart.base->US_CR |= US_CR_RSTSTA;
@@ -883,7 +856,6 @@ void Sniffer_usart_isr(void)
change_flags |= SNIFF_CHANGE_FLAG_TIMEOUT_WT;
/* Reset timeout value */
wt_remaining = g_wt;
g_stats.num_waiting_time_exp++;
} else {
wt_remaining -= (sniff_usart.base->US_RTOR & 0xffff); /* be sure to subtract the actual timeout since the new might not have been set and reloaded yet */
}
@@ -902,10 +874,8 @@ void Sniffer_usart_isr(void)
/* Store sniffed data (or error flags, or both) into buffer */
if (byte) {
if (rbuf16_write(&sniff_buffer, byte) != 0) {
g_stats.num_ringbuf_overflows++;
if (rbuf16_write(&sniff_buffer, byte) != 0)
TRACE_ERROR("USART buffer full\n\r");
}
}
}
@@ -921,7 +891,6 @@ static void Sniffer_reset_isr(const Pin* pPin)
/* Update the ISO state according to the reset change (reset is active low) */
if (PIO_Get(&pin_rst)) {
change_flags |= SNIFF_CHANGE_FLAG_RESET_DEASSERT; /* set flag and let main loop send it */
g_stats.num_reset++;
} else {
change_flags |= SNIFF_CHANGE_FLAG_RESET_ASSERT; /* set flag and let main loop send it */
}
@@ -949,8 +918,7 @@ void Sniffer_usart0_irq(void)
* Initialization routine
*-----------------------------------------------------------------------------*/
#define SNIFFER_IER (US_IER_RXRDY | US_IER_TIMEOUT | US_IER_OVRE | US_IER_FRAME | US_IER_PARE | \
US_CSR_RXBRK)
#define SNIFFER_IER (US_IER_RXRDY | US_IER_TIMEOUT | US_IER_OVRE | US_IER_FRAME | US_IER_PARE)
/* Called during USB enumeration after device is enumerated by host */
void Sniffer_configure(void)
@@ -977,8 +945,6 @@ void Sniffer_init(void)
{
TRACE_INFO("Sniffer Init\n\r");
memset(&g_stats, 0, sizeof(g_stats));
/* Configure pins to sniff communication between phone and card */
PIO_Configure(pins_sniff, PIO_LISTSIZE(pins_sniff));
/* Configure pins to connect phone to card */
@@ -1135,8 +1101,6 @@ void Sniffer_run(void)
TRACE_ERROR("USART FRAMING Error\r\n");
if (entry & RBUF16_F_OVERRUN)
TRACE_ERROR("USART OVERRUN Error\r\n");
if (entry & RBUF16_F_BREAK)
TRACE_ERROR("USART BREAK Error\r\n");
}
/* Handle flags */

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,
@@ -100,5 +100,4 @@ AC_OUTPUT(
src/Makefile
lib/Makefile
contrib/Makefile
contrib/simtrace2.spec
Makefile)

View File

@@ -1,102 +0,0 @@
#
# spec file for package simtrace2
#
# Copyright (c) 2021 SUSE LLC
# Copyright (c) 2018-2021, Martin Hauke <mardnh@gmx.de>
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
%define sover 1
Name: simtrace2
Version: @VERSION@
Release: 0
Summary: Osmocom SIMtrace host utility
License: GPL-2.0-or-later
Group: Productivity/Telephony/Utilities
URL: https://osmocom.org/projects/simtrace2/wiki
Source: %{name}-%{version}.tar.xz
BuildRequires: autoconf
BuildRequires: automake
BuildRequires: libtool
BuildRequires: pkgconfig
BuildRequires: pkgconfig(libosmocore) >= 1.4.0
BuildRequires: pkgconfig(libosmosim) >= 1.4.0
BuildRequires: pkgconfig(libosmousb) >= 1.4.0
BuildRequires: pkgconfig(libpcsclite)
BuildRequires: pkgconfig(libusb-1.0)
%description
Osmocom SIMtrace 2 is a software and hardware system for passively
tracing SIM-ME communication between the SIM card and the mobile phone,
and remote SIM operation.
This package contains SIMtrace 2 host utility.
%package -n libosmo-simtrace2-%{sover}
Summary: Driver functions for Osmocom SIMtrace2 and compatible firmware
Group: System/Libraries
%description -n libosmo-simtrace2-%{sover}
This library contains core "driver" functionality to interface with the
Osmocom SIMtrace2 (and compatible) USB device firmware. It enables
applications to implement SIM card / smart card tracing as well as
SIM / smart card emulation functions.
%package -n libosmo-simtrace2-devel
Summary: Development files for the Osmocom SIMtrace2 library
Group: Development/Libraries/C and C++
Requires: libosmo-simtrace2-%{sover} = %{version}
%description -n libosmo-simtrace2-devel
Osmocom SIMtrace2 (and compatible) USB device firmware. It enables
applications to implement SIM card / smart card tracing as well as
SIM / smart card emulation functions.
This subpackage contains libraries and header files for developing
applications that want to make use of libosmo-simtrace2.
%prep
%setup -q
%build
cd host
echo "%{version}" >.tarball-version
autoreconf -fiv
%configure --disable-static
%make_build
%install
%make_install -C host
install -Dm0644 host/contrib/99-simtrace2.rules %{buildroot}/%{_udevrulesdir}/99-simtrace2.rules
find %{buildroot} -type f -name "*.la" -delete -print
%post -n libosmo-simtrace2-%{sover} -p /sbin/ldconfig
%postun -n libosmo-simtrace2-%{sover} -p /sbin/ldconfig
%files
%license host/COPYING
%doc README.md
%{_bindir}/simtrace2-cardem-pcsc
%{_bindir}/simtrace2-list
%{_bindir}/simtrace2-sniff
%{_bindir}/simtrace2-tool
%{_udevrulesdir}/99-simtrace2.rules
%files -n libosmo-simtrace2-%{sover}
%{_libdir}/libosmo-simtrace2.so.%{sover}*
%files -n libosmo-simtrace2-devel
%dir %{_includedir}/osmocom/
%dir %{_includedir}/osmocom/simtrace2/
%{_includedir}/osmocom/simtrace2/*.h
%{_libdir}/libosmo-simtrace2.so
%{_libdir}/pkgconfig/libosmo-simtrace2.pc
%changelog

View File

@@ -1,3 +1,12 @@
osmocom/simtrace2/version.h: osmocom/simtrace2/version.h.tpl
$(AM_V_GEN)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)sed \
-e "s/{{VERSION}}/$$(echo '@VERSION@' | cut -d. -f1-3)/g" \
-e "s/{{VERSION_MAJOR}}/$$(echo '@VERSION@' | cut -d. -f1)/g" \
-e "s/{{VERSION_MINOR}}/$$(echo '@VERSION@' | cut -d. -f2)/g" \
-e "s/{{VERSION_PATCH}}/$$(echo '@VERSION@' | cut -d. -f3)/g" \
$< > $@
nobase_include_HEADERS = \
osmocom/simtrace2/apdu_dispatch.h \
osmocom/simtrace2/simtrace2_api.h \
@@ -5,4 +14,5 @@ nobase_include_HEADERS = \
osmocom/simtrace2/simtrace_prot.h \
osmocom/simtrace2/usb_util.h \
osmocom/simtrace2/gsmtap.h \
osmocom/simtrace2/version.h \
$(NULL)

View File

@@ -41,10 +41,11 @@ 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);
int osmo_st2_generic_request_board_info(struct osmo_st2_slot *slot);
int osmo_st2_cardem_request_card_insert(struct osmo_st2_cardem_inst *ci, bool inserted);
int osmo_st2_cardem_request_pb_and_rx(struct osmo_st2_cardem_inst *ci, uint8_t pb, uint8_t le);
@@ -54,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

@@ -0,0 +1,16 @@
#pragma once
#define LIBOSMO_SIMTRACE2_VERSION {{VERSION}}
#define LIBOSMO_SIMTRACE2_VERSION_STR "{{VERSION}}"
#define LIBOSMO_SIMTRACE2_VERSION_MAJOR {{VERSION_MAJOR}}
#define LIBOSMO_SIMTRACE2_VERSION_MINOR {{VERSION_MINOR}}
#define LIBOSMO_SIMTRACE2_VERSION_PATCH {{VERSION_PATCH}}
#define LIBOSMO_SIMTRACE2_VERSION_GREATER_EQUAL(major, minor, patch) \
(LIBOSMO_SIMTRACE2_VERSION_MAJOR > (major) || \
(LIBOSMO_SIMTRACE2_VERSION_MAJOR == (major) && \
LIBOSMO_SIMTRACE2_VERSION_MINOR > (minor)) || \
(LIBOSMO_SIMTRACE2_VERSION_MAJOR == (major) && \
LIBOSMO_SIMTRACE2_VERSION_MINOR == (minor) && \
LIBOSMO_SIMTRACE2_VERSION_PATCH >= (patch)))

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

@@ -66,7 +66,7 @@ int osmo_st2_gsmtap_send_apdu(uint8_t sub_type, const uint8_t *apdu, unsigned in
memcpy(buf + sizeof(*gh), apdu, len);
rc = write(gsmtap_inst_fd(g_gti), buf, gross_len);
rc = write(gsmtap_inst_fd2(g_gti), buf, gross_len);
if (rc < 0) {
perror("write gsmtap");
free(buf);

View File

@@ -154,19 +154,6 @@ int osmo_st2_slot_tx_msg(struct osmo_st2_slot *slot, struct msgb *msg,
return rc;
}
/***********************************************************************
* Generic protocol
***********************************************************************/
/*! \brief Requeset the SIMtrace2 board information structure from the device */
int osmo_st2_generic_request_board_info(struct osmo_st2_slot *slot)
{
struct msgb *msg = st_msgb_alloc();
return osmo_st2_slot_tx_msg(slot, msg, SIMTRACE_MSGC_GENERIC, SIMTRACE_CMD_BD_BOARD_INFO);
}
/***********************************************************************
* Card Emulation protocol
***********************************************************************/
@@ -285,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);

View File

@@ -63,7 +63,6 @@ static void print_help(void)
"\n"
);
printf( "Commands:\n"
"\tgeneric board-info\n"
"\tmodem reset (enable|disable|cycle)\n"
"\tmodem sim-switch (local|remote)\n"
"\tmodem sim-card (insert|remove)\n"
@@ -99,15 +98,9 @@ static void run_mainloop(struct osmo_st2_cardem_inst *ci)
fprintf(stderr, "BULK IN transfer error; rc=%d\n", rc);
return;
}
if (rc >= 0) {
printf("Rx(%u): %s\n", xfer_len, osmo_hexdump(buf, xfer_len));
osmo_st2_generic_request_board_info(ci->slot);
}
#if 0
/* break the loop if no new messages arrive within 100ms */
if (rc == LIBUSB_ERROR_TIMEOUT)
return;
#endif
}
}
@@ -223,36 +216,6 @@ static int do_subsys_modem(int argc, char **argv)
return rc;
}
static int do_generic_board_info(int argc, char **argv)
{
printf("ci: %p\n", ci);
printf("ci->slot: %p\n", ci->slot);
printf("ci->slot->transp: %p\n", ci->slot->transp);
return osmo_st2_generic_request_board_info(ci->slot);
}
static int do_subsys_generic(int argc, char **argv)
{
char *command;
int rc;
if (argc < 1)
return -EINVAL;
command = argv[0];
argc--;
argv++;
if (!strcmp(command, "board-info")) {
rc = do_generic_board_info(argc, argv);
} else {
fprintf(stderr, "Unsupported command for subsystem generic: '%s'\n", command);
return -EINVAL;
}
return rc;
}
static int do_command(int argc, char **argv)
{
char *subsys;
@@ -264,9 +227,7 @@ static int do_command(int argc, char **argv)
argc--;
argv++;
if (!strcmp(subsys, "generic")) {
rc= do_subsys_generic(argc, argv);
} else if (!strcmp(subsys, "modem"))
if (!strcmp(subsys, "modem"))
rc = do_subsys_modem(argc, argv);
else {
fprintf(stderr, "Unsupported subsystem '%s'\n", subsys);