| // FIXME: Copyright license here |
| /*------------------------------------------------------------------------------ |
| * Headers |
| *------------------------------------------------------------------------------*/ |
| |
| #include "board.h" |
| |
| /*------------------------------------------------------------------------------ |
| * Internal variables |
| *------------------------------------------------------------------------------*/ |
| typedef struct { |
| void (* configure) ( void ); |
| void (* init) ( void ); |
| void (* exit) ( void ); |
| void (* run) ( void ); |
| } conf_func; |
| |
| conf_func config_func_ptrs[] = { |
| {Sniffer_configure, Sniffer_init, Sniffer_exit, Sniffer_run}, /* CFG_NUM_SNIFF */ |
| {CCID_configure, CCID_init, CCID_exit, CCID_run}, /* CFG_NUM_CCID */ |
| {Phone_configure, Phone_init, Phone_exit, Phone_run}, /* CFG_NUM_PHONE */ |
| {MITM_configure, MITM_init, MITM_exit, MITM_run}, /* CFG_NUM_MITM */ |
| }; |
| |
| |
| /*------------------------------------------------------------------------------ |
| * Internal variables |
| *------------------------------------------------------------------------------*/ |
| volatile enum confNum simtrace_config = CFG_NUM_SNIFF; |
| |
| /*------------------------------------------------------------------------------ |
| * Main |
| *------------------------------------------------------------------------------*/ |
| |
| extern int main( void ) |
| { |
| uint8_t isUsbConnected = 0; |
| enum confNum last_simtrace_config = simtrace_config; |
| |
| LED_Configure(LED_NUM_RED); |
| LED_Configure(LED_NUM_GREEN); |
| LED_Set(LED_NUM_GREEN); |
| |
| /* Disable watchdog*/ |
| WDT_Disable( WDT ) ; |
| |
| PIO_InitializeInterrupts(0); |
| |
| SIMtrace_USB_Initialize(); |
| |
| printf("%s", "USB init\n\r"); |
| |
| for (unsigned int i = 0; i < sizeof(config_func_ptrs)/sizeof(config_func_ptrs[0]); ++i) |
| { |
| config_func_ptrs[i].configure(); |
| } |
| |
| config_func_ptrs[simtrace_config-1].init(); |
| last_simtrace_config = simtrace_config; |
| |
| // FIXME: why don't we get any interrupts with this line?: |
| while(USBD_GetState() < USBD_STATE_CONFIGURED); |
| |
| TRACE_DEBUG("%s", "Start\n\r"); |
| |
| printf("%s", "Start\n\r"); |
| while(1) { |
| |
| /* Device is not configured */ |
| if (USBD_GetState() < USBD_STATE_CONFIGURED) { |
| |
| if (isUsbConnected) { |
| isUsbConnected = 0; |
| // TC_Stop(TC0, 0); |
| } |
| } |
| else if (isUsbConnected == 0) { |
| printf("USB is now configured\n\r"); |
| |
| isUsbConnected = 1; |
| // TC_Start(TC0, 0); |
| } |
| |
| // for (int i=0; i <10000; i++); |
| |
| /* FIXME: Or should we move the while loop into every case, and break out |
| in case the config changes? */ |
| if (last_simtrace_config != simtrace_config) { |
| config_func_ptrs[last_simtrace_config-1].exit(); |
| config_func_ptrs[simtrace_config-1].init(); |
| last_simtrace_config = simtrace_config; |
| } else { |
| config_func_ptrs[simtrace_config-1].run(); |
| } |
| } |
| } |