diff options
author | Kévin Redon <kredon@sysmocom.de> | 2018-06-04 16:21:23 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2018-07-04 11:24:13 +0000 |
commit | f9997e9d26b8bbd69d616e6dd7ced1abb1304333 (patch) | |
tree | 7de94cb0b8bd0255727fa0ef8ebd7ee0ff7aadea /firmware | |
parent | 05cc7f653137d7ddee7572eb946c8ee7f881cbff (diff) |
copy working cardem app to trace
because the applications share the board capabilities defined in
libboard/*/include/board.h and USB configurations are enabled according
to the previously defined capabilities in libcommon/source.usb.c, all
applications actually offer the same functions.
thus creating the trace application is only mainly a cosmetic change, as the
sniffer function will also be present and enabled in the cardem application.
Change-Id: I24b3500a0905cbd622507722280b3c7e7f188bde
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/apps/trace/Makefile | 3 | ||||
-rw-r--r-- | firmware/apps/trace/main.c | 209 | ||||
-rw-r--r-- | firmware/apps/trace/usb_strings.txt | 10 |
3 files changed, 222 insertions, 0 deletions
diff --git a/firmware/apps/trace/Makefile b/firmware/apps/trace/Makefile new file mode 100644 index 0000000..75c43e8 --- /dev/null +++ b/firmware/apps/trace/Makefile @@ -0,0 +1,3 @@ +C_FILES += $(C_LIBUSB_RT) + +C_FILES += card_emu.c cciddriver.c iso7816_4.c iso7816_fidi.c mitm.c mode_cardemu.c mode_ccid.c simtrace_iso7816.c sniffer.c tc_etu.c usb.c diff --git a/firmware/apps/trace/main.c b/firmware/apps/trace/main.c index e69de29..aabaa41 100644 --- a/firmware/apps/trace/main.c +++ b/firmware/apps/trace/main.c @@ -0,0 +1,209 @@ +// FIXME: Copyright license here +/*------------------------------------------------------------------------------ + * Headers + *------------------------------------------------------------------------------*/ + +#include "board.h" +#include "simtrace.h" +#include "utils.h" +#include "osmocom/core/timer.h" + +unsigned int g_unique_id[4]; + +/*------------------------------------------------------------------------------ + * Internal variables + *------------------------------------------------------------------------------*/ +typedef struct { + /* static initialization, called whether or not the usb config is active */ + void (*configure) (void); + /* initialization function after the config was selected */ + void (*init) (void); + /* de-initialization before selecting new config */ + void (*exit) (void); + /* main loop content for given configuration */ + void (*run) (void); + /* Interrupt handler for USART1 */ + void (*usart0_irq) (void); + /* Interrupt handler for USART1 */ + void (*usart1_irq) (void); +} conf_func; + +static const conf_func config_func_ptrs[] = { + /* array slot 0 is empty, usb configs start at 1 */ +#ifdef HAVE_SNIFFER + [CFG_NUM_SNIFF] = { + .configure = Sniffer_configure, + .init = Sniffer_init, + .exit = Sniffer_exit, + .run = Sniffer_run, + }, +#endif +#ifdef HAVE_CCID + [CFG_NUM_CCID] = { + .configure = CCID_configure, + .init = CCID_init, + .exit = CCID_exit, + .run = CCID_run, + }, +#endif +#ifdef HAVE_CARDEM + [CFG_NUM_PHONE] = { + .configure = mode_cardemu_configure, + .init = mode_cardemu_init, + .exit = mode_cardemu_exit, + .run = mode_cardemu_run, + .usart0_irq = mode_cardemu_usart0_irq, + .usart1_irq = mode_cardemu_usart1_irq, + }, +#endif +#ifdef HAVE_MITM + [CFG_NUM_MITM] = { + .configure = MITM_configure, + .init = MITM_init, + .exit = MITM_exit, + .run = MITM_run, + }, +#endif +}; + +/*------------------------------------------------------------------------------ + * Internal variables + *------------------------------------------------------------------------------*/ +#if defined(HAVE_SNIFFER) +static volatile enum confNum simtrace_config = CFG_NUM_SNIFF; +#elif defined(HAVE_CARDEM) +static volatile enum confNum simtrace_config = CFG_NUM_PHONE; +#elif defined(HAVE_CCID) +static volatile enum confNum simtrace_config = CFG_NUM_CCID; +#endif + +/*---------------------------------------------------------------------------- + * Callbacks + *----------------------------------------------------------------------------*/ + +void USBDDriverCallbacks_ConfigurationChanged(uint8_t cfgnum) +{ + TRACE_INFO_WP("cfgChanged%d ", cfgnum); + simtrace_config = cfgnum; +} + +void USART1_IrqHandler(void) +{ + if (config_func_ptrs[simtrace_config].usart1_irq) + config_func_ptrs[simtrace_config].usart1_irq(); +} + +void USART0_IrqHandler(void) +{ + if (config_func_ptrs[simtrace_config].usart0_irq) + config_func_ptrs[simtrace_config].usart0_irq(); +} + +/* returns '1' in case we should break any endless loop */ +static void check_exec_dbg_cmd(void) +{ + int ch; + + if (!UART_IsRxReady()) + return; + + ch = UART_GetChar(); + + board_exec_dbg_cmd(ch); +} + +/*------------------------------------------------------------------------------ + * Main + *------------------------------------------------------------------------------*/ +#define MAX_USB_ITER BOARD_MCK/72 // This should be around a second +extern int main(void) +{ + uint8_t isUsbConnected = 0; + enum confNum last_simtrace_config = simtrace_config; + unsigned int i = 0; + + led_init(); + led_blink(LED_RED, BLINK_3O_5F); + + /* Enable watchdog for 500ms, with no window */ + WDT_Enable(WDT, WDT_MR_WDRSTEN | WDT_MR_WDDBGHLT | WDT_MR_WDIDLEHLT | + (WDT_GetPeriod(500) << 16) | WDT_GetPeriod(500)); + + PIO_InitializeInterrupts(0); + + EEFC_ReadUniqueID(g_unique_id); + + printf("\n\r\n\r" + "=============================================================================\n\r" + "SIMtrace2 firmware " GIT_VERSION " (C) 2010-2016 by Harald Welte\n\r" + "=============================================================================\n\r"); + + TRACE_INFO("Chip ID: 0x%08x (Ext 0x%08x)\n\r", CHIPID->CHIPID_CIDR, CHIPID->CHIPID_EXID); + TRACE_INFO("Serial Nr. %08x-%08x-%08x-%08x\n\r", + g_unique_id[0], g_unique_id[1], + g_unique_id[2], g_unique_id[3]); + TRACE_INFO("Reset Cause: 0x%x\n\r", (RSTC->RSTC_SR & RSTC_SR_RSTTYP_Msk) >> RSTC_SR_RSTTYP_Pos); + + board_main_top(); + + TRACE_INFO("USB init...\n\r"); + SIMtrace_USB_Initialize(); + + while (USBD_GetState() < USBD_STATE_CONFIGURED) { + WDT_Restart(WDT); + check_exec_dbg_cmd(); +#if 0 + if (i >= MAX_USB_ITER * 3) { + TRACE_ERROR("Resetting board (USB could " + "not be configured)\n\r"); + USBD_Disconnect(); + NVIC_SystemReset(); + } +#endif + i++; + } + + TRACE_INFO("calling configure of all configurations...\n\r"); + for (i = 1; i < sizeof(config_func_ptrs) / sizeof(config_func_ptrs[0]); + ++i) { + if (config_func_ptrs[i].configure) + config_func_ptrs[i].configure(); + } + + TRACE_INFO("calling init of config %u...\n\r", simtrace_config); + config_func_ptrs[simtrace_config].init(); + last_simtrace_config = simtrace_config; + + TRACE_INFO("entering main loop...\n\r"); + while (1) { + WDT_Restart(WDT); +#if TRACE_LEVEL >= TRACE_LEVEL_DEBUG + const char rotor[] = { '-', '\\', '|', '/' }; + putchar('\b'); + putchar(rotor[i++ % ARRAY_SIZE(rotor)]); +#endif + check_exec_dbg_cmd(); + osmo_timers_prepare(); + osmo_timers_update(); + + if (USBD_GetState() < USBD_STATE_CONFIGURED) { + + if (isUsbConnected) { + isUsbConnected = 0; + } + } else if (isUsbConnected == 0) { + TRACE_INFO("USB is now configured\n\r"); + + isUsbConnected = 1; + } + if (last_simtrace_config != simtrace_config) { + TRACE_INFO("USB config chg %u -> %u\n\r", + last_simtrace_config, simtrace_config); + config_func_ptrs[last_simtrace_config].exit(); + config_func_ptrs[simtrace_config].init(); + last_simtrace_config = simtrace_config; + } else { + config_func_ptrs[simtrace_config].run(); + } + } +} diff --git a/firmware/apps/trace/usb_strings.txt b/firmware/apps/trace/usb_strings.txt new file mode 100644 index 0000000..0e797ac --- /dev/null +++ b/firmware/apps/trace/usb_strings.txt @@ -0,0 +1,10 @@ +sysmocom - s.f.m.c. GmbH +SIMtrace 2 compatible device +SIMtrace Sniffer +SIMtrace CCID +SIMtrace Phone +SIMtrace MITM +CardEmulator Modem 1 +CardEmulator Modem 2 +CardEmulator Modem 3 +CardEmulator Modem 4 |