simtrace2/firmware/src_simtrace/main.c

121 lines
3.4 KiB
C
Raw Normal View History

2015-02-24 10:35:19 +00:00
// FIXME: Copyright license here
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include "board.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 */
[CFG_NUM_SNIFF] = {
.configure = Sniffer_configure,
.init = Sniffer_init,
.exit = Sniffer_exit,
.run = Sniffer_run,
},
[CFG_NUM_CCID] = {
.configure = CCID_configure,
.init = CCID_init,
.exit = CCID_exit,
.run = CCID_run,
},
[CFG_NUM_PHONE] = {
.configure = Phone_configure,
.init = Phone_init,
.exit = Phone_exit,
.run = Phone_run,
},
[CFG_NUM_MITM] = {
.configure = MITM_configure,
.init = MITM_init,
.exit = MITM_exit,
.run = MITM_run
},
};
2015-02-24 10:35:19 +00:00
/*------------------------------------------------------------------------------
* Internal variables
*------------------------------------------------------------------------------*/
volatile enum confNum simtrace_config = CFG_NUM_SNIFF;
2015-02-24 10:35:19 +00:00
/*------------------------------------------------------------------------------
* Main
2015-02-24 10:35:19 +00:00
*------------------------------------------------------------------------------*/
#define MAX_USB_ITER BOARD_MCK/72 // This should be around a second
2015-02-24 10:35:19 +00:00
extern int main( void )
{
2015-02-25 13:15:57 +00:00
uint8_t isUsbConnected = 0;
enum confNum last_simtrace_config = simtrace_config;
unsigned int i = 0;
2015-02-25 13:15:57 +00:00
2015-03-05 14:43:01 +00:00
LED_Configure(LED_NUM_RED);
2015-02-24 10:35:19 +00:00
LED_Configure(LED_NUM_GREEN);
LED_Set(LED_NUM_RED);
2015-02-24 10:35:19 +00:00
/* Disable watchdog*/
WDT_Disable( WDT ) ;
PIO_InitializeInterrupts(0);
2015-02-25 13:15:57 +00:00
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;
2015-02-25 13:15:57 +00:00
printf("%s", "Start\n\r");
2015-02-24 10:35:19 +00:00
while(1) {
2015-02-25 13:15:57 +00:00
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);
2015-02-25 13:15:57 +00:00
isUsbConnected = 1;
}
2015-03-02 15:12:16 +00:00
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();
2015-02-24 10:35:19 +00:00
}
}
}