<p>Kévin Redon has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9840">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">copy working cardem app to trace<br><br>because the applications share the board capabilities defined in<br>libboard/*/include/board.h and USB configurations are enabled according<br>to the previously defined capabilities in libcommon/source.usb.c, all<br>applications actually offer the same functions.<br>thus creating the trace application is only mainly a cosmetic change, as the<br>sniffer function will also be present and enabled in the cardem application.<br><br>Change-Id: I24b3500a0905cbd622507722280b3c7e7f188bde<br>---<br>A firmware/apps/trace/Makefile<br>M firmware/apps/trace/main.c<br>A firmware/apps/trace/usb_strings.txt<br>3 files changed, 222 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/simtrace2 refs/changes/40/9840/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/apps/trace/Makefile b/firmware/apps/trace/Makefile</span><br><span>new file mode 100644</span><br><span>index 0000000..75c43e8</span><br><span>--- /dev/null</span><br><span>+++ b/firmware/apps/trace/Makefile</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+C_FILES += $(C_LIBUSB_RT)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+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</span><br><span>diff --git a/firmware/apps/trace/main.c b/firmware/apps/trace/main.c</span><br><span>index e69de29..aabaa41 100644</span><br><span>--- a/firmware/apps/trace/main.c</span><br><span>+++ b/firmware/apps/trace/main.c</span><br><span>@@ -0,0 +1,209 @@</span><br><span style="color: hsl(120, 100%, 40%);">+// FIXME: Copyright license here</span><br><span style="color: hsl(120, 100%, 40%);">+/*------------------------------------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+ *          Headers</span><br><span style="color: hsl(120, 100%, 40%);">+ *------------------------------------------------------------------------------*/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "board.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "simtrace.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "utils.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "osmocom/core/timer.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+unsigned int g_unique_id[4];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*------------------------------------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+ *         Internal variables</span><br><span style="color: hsl(120, 100%, 40%);">+ *------------------------------------------------------------------------------*/</span><br><span style="color: hsl(120, 100%, 40%);">+typedef struct {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* static initialization, called whether or not the usb config is active */</span><br><span style="color: hsl(120, 100%, 40%);">+   void (*configure) (void);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* initialization function after the config was selected */</span><br><span style="color: hsl(120, 100%, 40%);">+   void (*init) (void);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* de-initialization before selecting new config */</span><br><span style="color: hsl(120, 100%, 40%);">+   void (*exit) (void);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* main loop content for given configuration */</span><br><span style="color: hsl(120, 100%, 40%);">+       void (*run) (void);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Interrupt handler for USART1 */</span><br><span style="color: hsl(120, 100%, 40%);">+    void (*usart0_irq) (void);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Interrupt handler for USART1 */</span><br><span style="color: hsl(120, 100%, 40%);">+    void (*usart1_irq) (void);</span><br><span style="color: hsl(120, 100%, 40%);">+} conf_func;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const conf_func config_func_ptrs[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* array slot 0 is empty, usb configs start at 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_SNIFFER</span><br><span style="color: hsl(120, 100%, 40%);">+      [CFG_NUM_SNIFF] = {</span><br><span style="color: hsl(120, 100%, 40%);">+           .configure = Sniffer_configure,</span><br><span style="color: hsl(120, 100%, 40%);">+               .init = Sniffer_init,</span><br><span style="color: hsl(120, 100%, 40%);">+         .exit = Sniffer_exit,</span><br><span style="color: hsl(120, 100%, 40%);">+         .run = Sniffer_run,</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_CCID</span><br><span style="color: hsl(120, 100%, 40%);">+  [CFG_NUM_CCID] = {</span><br><span style="color: hsl(120, 100%, 40%);">+            .configure = CCID_configure,</span><br><span style="color: hsl(120, 100%, 40%);">+          .init = CCID_init,</span><br><span style="color: hsl(120, 100%, 40%);">+            .exit = CCID_exit,</span><br><span style="color: hsl(120, 100%, 40%);">+            .run = CCID_run,</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_CARDEM</span><br><span style="color: hsl(120, 100%, 40%);">+        [CFG_NUM_PHONE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+           .configure = mode_cardemu_configure,</span><br><span style="color: hsl(120, 100%, 40%);">+          .init = mode_cardemu_init,</span><br><span style="color: hsl(120, 100%, 40%);">+            .exit = mode_cardemu_exit,</span><br><span style="color: hsl(120, 100%, 40%);">+            .run = mode_cardemu_run,</span><br><span style="color: hsl(120, 100%, 40%);">+              .usart0_irq = mode_cardemu_usart0_irq,</span><br><span style="color: hsl(120, 100%, 40%);">+                .usart1_irq = mode_cardemu_usart1_irq,</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_MITM</span><br><span style="color: hsl(120, 100%, 40%);">+  [CFG_NUM_MITM] = {</span><br><span style="color: hsl(120, 100%, 40%);">+            .configure = MITM_configure,</span><br><span style="color: hsl(120, 100%, 40%);">+          .init = MITM_init,</span><br><span style="color: hsl(120, 100%, 40%);">+            .exit = MITM_exit,</span><br><span style="color: hsl(120, 100%, 40%);">+            .run = MITM_run,</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*------------------------------------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+ *         Internal variables</span><br><span style="color: hsl(120, 100%, 40%);">+ *------------------------------------------------------------------------------*/</span><br><span style="color: hsl(120, 100%, 40%);">+#if defined(HAVE_SNIFFER)</span><br><span style="color: hsl(120, 100%, 40%);">+static volatile enum confNum simtrace_config = CFG_NUM_SNIFF;</span><br><span style="color: hsl(120, 100%, 40%);">+#elif defined(HAVE_CARDEM)</span><br><span style="color: hsl(120, 100%, 40%);">+static volatile enum confNum simtrace_config = CFG_NUM_PHONE;</span><br><span style="color: hsl(120, 100%, 40%);">+#elif defined(HAVE_CCID)</span><br><span style="color: hsl(120, 100%, 40%);">+static volatile enum confNum simtrace_config = CFG_NUM_CCID;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*----------------------------------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+ *       Callbacks</span><br><span style="color: hsl(120, 100%, 40%);">+ *----------------------------------------------------------------------------*/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void USBDDriverCallbacks_ConfigurationChanged(uint8_t cfgnum)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        TRACE_INFO_WP("cfgChanged%d ", cfgnum);</span><br><span style="color: hsl(120, 100%, 40%);">+     simtrace_config = cfgnum;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void USART1_IrqHandler(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       if (config_func_ptrs[simtrace_config].usart1_irq)</span><br><span style="color: hsl(120, 100%, 40%);">+             config_func_ptrs[simtrace_config].usart1_irq();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void USART0_IrqHandler(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (config_func_ptrs[simtrace_config].usart0_irq)</span><br><span style="color: hsl(120, 100%, 40%);">+             config_func_ptrs[simtrace_config].usart0_irq();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* returns '1' in case we should break any endless loop */</span><br><span style="color: hsl(120, 100%, 40%);">+static void check_exec_dbg_cmd(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int ch;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!UART_IsRxReady())</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ch = UART_GetChar();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        board_exec_dbg_cmd(ch);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*------------------------------------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+ *        Main</span><br><span style="color: hsl(120, 100%, 40%);">+ *------------------------------------------------------------------------------*/</span><br><span style="color: hsl(120, 100%, 40%);">+#define MAX_USB_ITER BOARD_MCK/72   // This should be around a second</span><br><span style="color: hsl(120, 100%, 40%);">+extern int main(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t isUsbConnected = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   enum confNum last_simtrace_config = simtrace_config;</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ led_init();</span><br><span style="color: hsl(120, 100%, 40%);">+   led_blink(LED_RED, BLINK_3O_5F);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Enable watchdog for 500ms, with no window */</span><br><span style="color: hsl(120, 100%, 40%);">+       WDT_Enable(WDT, WDT_MR_WDRSTEN | WDT_MR_WDDBGHLT | WDT_MR_WDIDLEHLT |</span><br><span style="color: hsl(120, 100%, 40%);">+            (WDT_GetPeriod(500) << 16) | WDT_GetPeriod(500));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  PIO_InitializeInterrupts(0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        EEFC_ReadUniqueID(g_unique_id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        printf("\n\r\n\r"</span><br><span style="color: hsl(120, 100%, 40%);">+                "=============================================================================\n\r"</span><br><span style="color: hsl(120, 100%, 40%);">+         "SIMtrace2 firmware " GIT_VERSION " (C) 2010-2016 by Harald Welte\n\r"</span><br><span style="color: hsl(120, 100%, 40%);">+            "=============================================================================\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     TRACE_INFO("Chip ID: 0x%08x (Ext 0x%08x)\n\r", CHIPID->CHIPID_CIDR, CHIPID->CHIPID_EXID);</span><br><span style="color: hsl(120, 100%, 40%);">+     TRACE_INFO("Serial Nr. %08x-%08x-%08x-%08x\n\r",</span><br><span style="color: hsl(120, 100%, 40%);">+               g_unique_id[0], g_unique_id[1],</span><br><span style="color: hsl(120, 100%, 40%);">+               g_unique_id[2], g_unique_id[3]);</span><br><span style="color: hsl(120, 100%, 40%);">+   TRACE_INFO("Reset Cause: 0x%x\n\r", (RSTC->RSTC_SR & RSTC_SR_RSTTYP_Msk) >> RSTC_SR_RSTTYP_Pos);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     board_main_top();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   TRACE_INFO("USB init...\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+      SIMtrace_USB_Initialize();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  while (USBD_GetState() < USBD_STATE_CONFIGURED) {</span><br><span style="color: hsl(120, 100%, 40%);">+          WDT_Restart(WDT);</span><br><span style="color: hsl(120, 100%, 40%);">+             check_exec_dbg_cmd();</span><br><span style="color: hsl(120, 100%, 40%);">+#if 0</span><br><span style="color: hsl(120, 100%, 40%);">+          if (i >= MAX_USB_ITER * 3) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       TRACE_ERROR("Resetting board (USB could "</span><br><span style="color: hsl(120, 100%, 40%);">+                               "not be configured)\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+                      USBD_Disconnect();</span><br><span style="color: hsl(120, 100%, 40%);">+                    NVIC_SystemReset();</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+             i++;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   TRACE_INFO("calling configure of all configurations...\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 1; i < sizeof(config_func_ptrs) / sizeof(config_func_ptrs[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+         ++i) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (config_func_ptrs[i].configure)</span><br><span style="color: hsl(120, 100%, 40%);">+                    config_func_ptrs[i].configure();</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   TRACE_INFO("calling init of config %u...\n\r", simtrace_config);</span><br><span style="color: hsl(120, 100%, 40%);">+    config_func_ptrs[simtrace_config].init();</span><br><span style="color: hsl(120, 100%, 40%);">+     last_simtrace_config = simtrace_config;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     TRACE_INFO("entering main loop...\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+    while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           WDT_Restart(WDT);</span><br><span style="color: hsl(120, 100%, 40%);">+#if TRACE_LEVEL >= TRACE_LEVEL_DEBUG</span><br><span style="color: hsl(120, 100%, 40%);">+            const char rotor[] = { '-', '\\', '|', '/' };</span><br><span style="color: hsl(120, 100%, 40%);">+         putchar('\b');</span><br><span style="color: hsl(120, 100%, 40%);">+                putchar(rotor[i++ % ARRAY_SIZE(rotor)]);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+              check_exec_dbg_cmd();</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_timers_prepare();</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_timers_update();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               if (USBD_GetState() < USBD_STATE_CONFIGURED) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (isUsbConnected) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         isUsbConnected = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (isUsbConnected == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     TRACE_INFO("USB is now configured\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                  isUsbConnected = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (last_simtrace_config != simtrace_config) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        TRACE_INFO("USB config chg %u -> %u\n\r",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   last_simtrace_config, simtrace_config);</span><br><span style="color: hsl(120, 100%, 40%);">+                    config_func_ptrs[last_simtrace_config].exit();</span><br><span style="color: hsl(120, 100%, 40%);">+                        config_func_ptrs[simtrace_config].init();</span><br><span style="color: hsl(120, 100%, 40%);">+                     last_simtrace_config = simtrace_config;</span><br><span style="color: hsl(120, 100%, 40%);">+               } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      config_func_ptrs[simtrace_config].run();</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/firmware/apps/trace/usb_strings.txt b/firmware/apps/trace/usb_strings.txt</span><br><span>new file mode 100644</span><br><span>index 0000000..0e797ac</span><br><span>--- /dev/null</span><br><span>+++ b/firmware/apps/trace/usb_strings.txt</span><br><span>@@ -0,0 +1,10 @@</span><br><span style="color: hsl(120, 100%, 40%);">+sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+SIMtrace 2 compatible device</span><br><span style="color: hsl(120, 100%, 40%);">+SIMtrace Sniffer</span><br><span style="color: hsl(120, 100%, 40%);">+SIMtrace CCID</span><br><span style="color: hsl(120, 100%, 40%);">+SIMtrace Phone</span><br><span style="color: hsl(120, 100%, 40%);">+SIMtrace MITM</span><br><span style="color: hsl(120, 100%, 40%);">+CardEmulator Modem 1</span><br><span style="color: hsl(120, 100%, 40%);">+CardEmulator Modem 2</span><br><span style="color: hsl(120, 100%, 40%);">+CardEmulator Modem 3</span><br><span style="color: hsl(120, 100%, 40%);">+CardEmulator Modem 4</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9840">change 9840</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/9840"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: simtrace2 </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I24b3500a0905cbd622507722280b3c7e7f188bde </div>
<div style="display:none"> Gerrit-Change-Number: 9840 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Kévin Redon <kredon@sysmocom.de> </div>