blob: a1058e180eb327cf2be3cb53aae35399f7b3e6a4 [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
Harald Welted4c14212015-11-07 18:25:46 +010022static const conf_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 *------------------------------------------------------------------------------*/
Harald Welte8d6a5d82015-11-07 18:27:05 +010054static volatile enum confNum simtrace_config = CFG_NUM_SNIFF;
55
56/*----------------------------------------------------------------------------
57 * Callbacks
58 *----------------------------------------------------------------------------*/
59
60void USBDDriverCallbacks_ConfigurationChanged(uint8_t cfgnum)
61{
62 TRACE_INFO_WP("cfgChanged%d ", cfgnum);
63 simtrace_config = cfgnum;
64}
Christina Quast32906bb2015-02-24 11:35:19 +010065
66/*------------------------------------------------------------------------------
Christina Quast95d66162015-04-09 22:38:47 +020067 * Main
Christina Quast32906bb2015-02-24 11:35:19 +010068 *------------------------------------------------------------------------------*/
Christina Quastde688672015-04-12 15:20:57 +020069#define MAX_USB_ITER BOARD_MCK/72 // This should be around a second
Christina Quast32906bb2015-02-24 11:35:19 +010070extern int main( void )
71{
Christina Quast1161b272015-02-25 14:15:57 +010072 uint8_t isUsbConnected = 0;
Christina Quast95d66162015-04-09 22:38:47 +020073 enum confNum last_simtrace_config = simtrace_config;
Christina Quast2379ac82015-04-16 11:09:37 +020074 unsigned int i = 0;
Christina Quast1161b272015-02-25 14:15:57 +010075
Christina Quastb5ebebe2015-03-05 15:43:01 +010076 LED_Configure(LED_NUM_RED);
Christina Quast32906bb2015-02-24 11:35:19 +010077 LED_Configure(LED_NUM_GREEN);
Christina Quast9dbf1c92015-05-06 08:46:32 +020078 LED_Set(LED_NUM_RED);
Christina Quast32906bb2015-02-24 11:35:19 +010079
80 /* Disable watchdog*/
81 WDT_Disable( WDT ) ;
82
83 PIO_InitializeInterrupts(0);
84
Christina Quast1161b272015-02-25 14:15:57 +010085 SIMtrace_USB_Initialize();
86
87 printf("%s", "USB init\n\r");
Christina Quastde688672015-04-12 15:20:57 +020088 while(USBD_GetState() < USBD_STATE_CONFIGURED){
Christina Quast3d8c0932015-06-24 16:00:13 +020089 if(i >= MAX_USB_ITER*3) {
Christina Quastde688672015-04-12 15:20:57 +020090 TRACE_ERROR("Resetting board (USB could not be configured)\n");
91 NVIC_SystemReset();
92 }
93 i++;
94 }
95
Harald Weltefefd5712015-11-07 18:19:11 +010096 for (i = 1; i < sizeof(config_func_ptrs)/sizeof(config_func_ptrs[0]); ++i)
Christina Quast95d66162015-04-09 22:38:47 +020097 {
98 config_func_ptrs[i].configure();
99 }
100
Harald Weltefefd5712015-11-07 18:19:11 +0100101 config_func_ptrs[simtrace_config].init();
Christina Quast95d66162015-04-09 22:38:47 +0200102 last_simtrace_config = simtrace_config;
103
Christina Quast1161b272015-02-25 14:15:57 +0100104 printf("%s", "Start\n\r");
Christina Quast32906bb2015-02-24 11:35:19 +0100105 while(1) {
Christina Quast1161b272015-02-25 14:15:57 +0100106
Christina Quast1161b272015-02-25 14:15:57 +0100107 if (USBD_GetState() < USBD_STATE_CONFIGURED) {
108
109 if (isUsbConnected) {
110 isUsbConnected = 0;
Christina Quast1161b272015-02-25 14:15:57 +0100111 }
112 }
113 else if (isUsbConnected == 0) {
114 printf("USB is now configured\n\r");
Christina Quast9dbf1c92015-05-06 08:46:32 +0200115 LED_Set(LED_NUM_GREEN);
116 LED_Clear(LED_NUM_RED);
Christina Quast1161b272015-02-25 14:15:57 +0100117
118 isUsbConnected = 1;
Christina Quast95d66162015-04-09 22:38:47 +0200119 }
Christina Quastcafde002015-03-02 16:12:16 +0100120
Christina Quastcafde002015-03-02 16:12:16 +0100121
Christina Quast95d66162015-04-09 22:38:47 +0200122 if (last_simtrace_config != simtrace_config) {
Harald Weltefefd5712015-11-07 18:19:11 +0100123 config_func_ptrs[last_simtrace_config].exit();
124 config_func_ptrs[simtrace_config].init();
Christina Quast95d66162015-04-09 22:38:47 +0200125 last_simtrace_config = simtrace_config;
Christina Quastfb524b92015-02-27 13:39:45 +0100126 } else {
Harald Weltefefd5712015-11-07 18:19:11 +0100127 config_func_ptrs[simtrace_config].run();
Christina Quast32906bb2015-02-24 11:35:19 +0100128 }
129 }
130}