aboutsummaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
authorKévin Redon <kredon@sysmocom.de>2018-06-04 16:21:23 +0200
committerHarald Welte <laforge@gnumonks.org>2018-07-04 11:24:13 +0000
commitf9997e9d26b8bbd69d616e6dd7ced1abb1304333 (patch)
tree7de94cb0b8bd0255727fa0ef8ebd7ee0ff7aadea /firmware
parent05cc7f653137d7ddee7572eb946c8ee7f881cbff (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/Makefile3
-rw-r--r--firmware/apps/trace/main.c209
-rw-r--r--firmware/apps/trace/usb_strings.txt10
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