| // FIXME: Copyright license here |
| /*------------------------------------------------------------------------------ |
| * Headers |
| *------------------------------------------------------------------------------*/ |
| |
| #include "board.h" |
| #include "utils.h" |
| #include "req_ctx.h" |
| |
| /*------------------------------------------------------------------------------ |
| * 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 ); |
| } 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, |
| }, |
| #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; |
| } |
| |
| /*------------------------------------------------------------------------------ |
| * 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_Configure(LED_NUM_RED); |
| LED_Configure(LED_NUM_GREEN); |
| LED_Set(LED_NUM_RED); |
| |
| /* Disable watchdog*/ |
| WDT_Disable( WDT ) ; |
| |
| req_ctx_init(); |
| |
| PIO_InitializeInterrupts(0); |
| |
| SIMtrace_USB_Initialize(); |
| |
| printf("%s", "USB init\n\r"); |
| while(USBD_GetState() < USBD_STATE_CONFIGURED){ |
| if(i >= MAX_USB_ITER*3) { |
| TRACE_ERROR("Resetting board (USB could not be configured)\n"); |
| NVIC_SystemReset(); |
| } |
| i++; |
| } |
| |
| for (i = 1; i < sizeof(config_func_ptrs)/sizeof(config_func_ptrs[0]); ++i) |
| { |
| config_func_ptrs[i].configure(); |
| } |
| |
| config_func_ptrs[simtrace_config].init(); |
| last_simtrace_config = simtrace_config; |
| |
| printf("%s", "Start\n\r"); |
| while(1) { |
| |
| if (USBD_GetState() < USBD_STATE_CONFIGURED) { |
| |
| if (isUsbConnected) { |
| isUsbConnected = 0; |
| } |
| } |
| else if (isUsbConnected == 0) { |
| printf("USB is now configured\n\r"); |
| LED_Set(LED_NUM_GREEN); |
| LED_Clear(LED_NUM_RED); |
| |
| isUsbConnected = 1; |
| } |
| |
| |
| if (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(); |
| } |
| } |
| } |