From 3bafe4337642bb67454acc83d3023fc6e5ae22b9 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 20 Mar 2016 16:43:12 +0100 Subject: [PATCH] dynamically dispatch USART IRQs The different modes (configurations) will have different interrupt handlers, so we need to dispatch them via config_func_ptrs --- firmware/src_simtrace/main.c | 16 ++++++++++++++++ firmware/src_simtrace/mode_cardemu.c | 22 +++++++++++++++------- firmware/src_simtrace/simtrace.h | 3 +++ firmware/src_simtrace/simtrace_iso7816.c | 7 +------ 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/firmware/src_simtrace/main.c b/firmware/src_simtrace/main.c index bca47cda..5d5e3329 100644 --- a/firmware/src_simtrace/main.c +++ b/firmware/src_simtrace/main.c @@ -22,6 +22,10 @@ typedef struct { void (*exit) (void); /* main loop content for given configuration */ void (*run) (void); + /* Interrupt handler for USART1 */ + void (*usart0_irq) (void); + /* Interrupt handler for USART1 */ + void (*usart1_irq) (void); } conf_func; static const conf_func config_func_ptrs[] = { @@ -48,6 +52,8 @@ static const conf_func config_func_ptrs[] = { .init = mode_cardemu_init, .exit = mode_cardemu_exit, .run = mode_cardemu_run, + .usart0_irq = mode_cardemu_usart0_irq, + .usart1_irq = mode_cardemu_usart1_irq, }, #endif #ifdef HAVE_MITM @@ -81,6 +87,16 @@ void USBDDriverCallbacks_ConfigurationChanged(uint8_t cfgnum) simtrace_config = cfgnum; } +void USART1_IrqHandler(void) +{ + config_func_ptrs[simtrace_config].usart1_irq(); +} + +void USART0_IrqHandler(void) +{ + config_func_ptrs[simtrace_config].usart0_irq(); +} + /*------------------------------------------------------------------------------ * Main *------------------------------------------------------------------------------*/ diff --git a/firmware/src_simtrace/mode_cardemu.c b/firmware/src_simtrace/mode_cardemu.c index d53d60bf..00742d68 100644 --- a/firmware/src_simtrace/mode_cardemu.c +++ b/firmware/src_simtrace/mode_cardemu.c @@ -167,17 +167,13 @@ int card_emu_uart_tx(uint8_t uart_chan, uint8_t byte) /* FIXME: integrate this with actual irq handler */ -void usart_irq_rx(uint8_t uart) +static void usart_irq_rx(uint8_t inst_num) { - Usart *usart = get_usart_by_chan(uart); - struct cardem_inst *ci = &cardem_inst[0]; + Usart *usart = get_usart_by_chan(inst_num); + struct cardem_inst *ci = &cardem_inst[inst_num]; uint32_t csr; uint8_t byte = 0; -#ifdef CARDEMU_SECOND_UART - if (uart == 1) - ci = &cardem_inst[1]; -#endif csr = usart->US_CSR & usart->US_IMR; if (csr & US_CSR_RXRDY) { @@ -197,6 +193,18 @@ void usart_irq_rx(uint8_t uart) } } +void mode_cardemu_usart0_irq(void) +{ + /* USART0 == Instance 1 == USIM 2 */ + usart_irq_rx(1); +} + +void mode_cardemu_usart1_irq(void) +{ + /* USART1 == Instance 0 == USIM 1 */ + usart_irq_rx(0); +} + /* call-back from card_emu.c to change UART baud rate */ int card_emu_uart_update_fidi(uint8_t uart_chan, unsigned int fidi) { diff --git a/firmware/src_simtrace/simtrace.h b/firmware/src_simtrace/simtrace.h index 725ef418..2a54d76f 100644 --- a/firmware/src_simtrace/simtrace.h +++ b/firmware/src_simtrace/simtrace.h @@ -106,6 +106,9 @@ extern void CCID_run( void ); extern void mode_cardemu_run(void); extern void MITM_run( void ); +extern void mode_cardemu_usart0_irq(void); +extern void mode_cardemu_usart1_irq(void); + /* Timer helper function */ void Timer_Init( void ); void TC0_Counter_Reset( void ); diff --git a/firmware/src_simtrace/simtrace_iso7816.c b/firmware/src_simtrace/simtrace_iso7816.c index e1453db8..81ae9806 100644 --- a/firmware/src_simtrace/simtrace_iso7816.c +++ b/firmware/src_simtrace/simtrace_iso7816.c @@ -78,14 +78,12 @@ void ISR_PhoneRST(const Pin * pPin) PIO_DisableIt(&pinPhoneRST); } -extern void usart_irq_rx(uint8_t num); /* * char_stat is zero if no error occured. * Otherwise it is filled with the content of the status register. */ -void USART1_IrqHandler(void) +void mode_trace_usart1_irq(void) { -#if 0 uint32_t stat; char_stat = 0; // Rcv buf full @@ -115,9 +113,6 @@ void USART1_IrqHandler(void) char_stat = stat; } -#else - usart_irq_rx(0); -#endif } /* FIDI update functions */