blob: debfb292cbd63c7d26efbf2d0de3286e40fa3e28 [file] [log] [blame]
Christina Quast32906bb2015-02-24 11:35:19 +01001// FIXME: Copyright license here
2/*------------------------------------------------------------------------------
3 * Headers
4 *------------------------------------------------------------------------------*/
5
6#include "board.h"
Christina Quast32906bb2015-02-24 11:35:19 +01007
8/*------------------------------------------------------------------------------
Christina Quast32906bb2015-02-24 11:35:19 +01009 * Internal variables
10 *------------------------------------------------------------------------------*/
Christina Quastfb524b92015-02-27 13:39:45 +010011typedef struct {
Harald Welte15d72cc2015-11-07 18:18:47 +010012 /* static initialization, called whether or not the usb config is active */
Christina Quast95d66162015-04-09 22:38:47 +020013 void (* configure) ( void );
Harald Welte15d72cc2015-11-07 18:18:47 +010014 /* initialization function after the config was selected */
Christina Quastfb524b92015-02-27 13:39:45 +010015 void (* init) ( void );
Harald Welte15d72cc2015-11-07 18:18:47 +010016 /* de-initialization before selecting new config */
Christina Quast95d66162015-04-09 22:38:47 +020017 void (* exit) ( void );
Harald Welte15d72cc2015-11-07 18:18:47 +010018 /* main loop content for given configuration */
Christina Quastfb524b92015-02-27 13:39:45 +010019 void (* run) ( void );
20} conf_func;
21
22conf_func config_func_ptrs[] = {
Harald Weltefefd5712015-11-07 18:19:11 +010023 /* array slot 0 is empty, usb configs start at 1 */
24 [CFG_NUM_SNIFF] = {
25 .configure = Sniffer_configure,
26 .init = Sniffer_init,
27 .exit = Sniffer_exit,
28 .run = Sniffer_run,
29 },
30 [CFG_NUM_CCID] = {
31 .configure = CCID_configure,
32 .init = CCID_init,
33 .exit = CCID_exit,
34 .run = CCID_run,
35 },
36 [CFG_NUM_PHONE] = {
37 .configure = Phone_configure,
38 .init = Phone_init,
39 .exit = Phone_exit,
40 .run = Phone_run,
41 },
42 [CFG_NUM_MITM] = {
43 .configure = MITM_configure,
44 .init = MITM_init,
45 .exit = MITM_exit,
46 .run = MITM_run
47 },
Christina Quastfb524b92015-02-27 13:39:45 +010048};
49
50
51/*------------------------------------------------------------------------------
52 * Internal variables
53 *------------------------------------------------------------------------------*/
Christina Quast95d66162015-04-09 22:38:47 +020054volatile enum confNum simtrace_config = CFG_NUM_SNIFF;
Christina Quast32906bb2015-02-24 11:35:19 +010055
56/*------------------------------------------------------------------------------
Christina Quast95d66162015-04-09 22:38:47 +020057 * Main
Christina Quast32906bb2015-02-24 11:35:19 +010058 *------------------------------------------------------------------------------*/
Christina Quastde688672015-04-12 15:20:57 +020059#define MAX_USB_ITER BOARD_MCK/72 // This should be around a second
Christina Quast32906bb2015-02-24 11:35:19 +010060extern int main( void )
61{
Christina Quast1161b272015-02-25 14:15:57 +010062 uint8_t isUsbConnected = 0;
Christina Quast95d66162015-04-09 22:38:47 +020063 enum confNum last_simtrace_config = simtrace_config;
Christina Quast2379ac82015-04-16 11:09:37 +020064 unsigned int i = 0;
Christina Quast1161b272015-02-25 14:15:57 +010065
Christina Quastb5ebebe2015-03-05 15:43:01 +010066 LED_Configure(LED_NUM_RED);
Christina Quast32906bb2015-02-24 11:35:19 +010067 LED_Configure(LED_NUM_GREEN);
Christina Quast9dbf1c92015-05-06 08:46:32 +020068 LED_Set(LED_NUM_RED);
Christina Quast32906bb2015-02-24 11:35:19 +010069
70 /* Disable watchdog*/
71 WDT_Disable( WDT ) ;
72
73 PIO_InitializeInterrupts(0);
74
Christina Quast1161b272015-02-25 14:15:57 +010075 SIMtrace_USB_Initialize();
76
77 printf("%s", "USB init\n\r");
Christina Quastde688672015-04-12 15:20:57 +020078 while(USBD_GetState() < USBD_STATE_CONFIGURED){
Christina Quast3d8c0932015-06-24 16:00:13 +020079 if(i >= MAX_USB_ITER*3) {
Christina Quastde688672015-04-12 15:20:57 +020080 TRACE_ERROR("Resetting board (USB could not be configured)\n");
81 NVIC_SystemReset();
82 }
83 i++;
84 }
85
Harald Weltefefd5712015-11-07 18:19:11 +010086 for (i = 1; i < sizeof(config_func_ptrs)/sizeof(config_func_ptrs[0]); ++i)
Christina Quast95d66162015-04-09 22:38:47 +020087 {
88 config_func_ptrs[i].configure();
89 }
90
Harald Weltefefd5712015-11-07 18:19:11 +010091 config_func_ptrs[simtrace_config].init();
Christina Quast95d66162015-04-09 22:38:47 +020092 last_simtrace_config = simtrace_config;
93
Christina Quast1161b272015-02-25 14:15:57 +010094 printf("%s", "Start\n\r");
Christina Quast32906bb2015-02-24 11:35:19 +010095 while(1) {
Christina Quast1161b272015-02-25 14:15:57 +010096
Christina Quast1161b272015-02-25 14:15:57 +010097 if (USBD_GetState() < USBD_STATE_CONFIGURED) {
98
99 if (isUsbConnected) {
100 isUsbConnected = 0;
Christina Quast1161b272015-02-25 14:15:57 +0100101 }
102 }
103 else if (isUsbConnected == 0) {
104 printf("USB is now configured\n\r");
Christina Quast9dbf1c92015-05-06 08:46:32 +0200105 LED_Set(LED_NUM_GREEN);
106 LED_Clear(LED_NUM_RED);
Christina Quast1161b272015-02-25 14:15:57 +0100107
108 isUsbConnected = 1;
Christina Quast95d66162015-04-09 22:38:47 +0200109 }
Christina Quastcafde002015-03-02 16:12:16 +0100110
Christina Quastcafde002015-03-02 16:12:16 +0100111
Christina Quast95d66162015-04-09 22:38:47 +0200112 if (last_simtrace_config != simtrace_config) {
Harald Weltefefd5712015-11-07 18:19:11 +0100113 config_func_ptrs[last_simtrace_config].exit();
114 config_func_ptrs[simtrace_config].init();
Christina Quast95d66162015-04-09 22:38:47 +0200115 last_simtrace_config = simtrace_config;
Christina Quastfb524b92015-02-27 13:39:45 +0100116 } else {
Harald Weltefefd5712015-11-07 18:19:11 +0100117 config_func_ptrs[simtrace_config].run();
Christina Quast32906bb2015-02-24 11:35:19 +0100118 }
119 }
120}