diff options
-rw-r--r-- | firmware/libboard/octsimtest/include/board.h | 4 | ||||
-rw-r--r-- | firmware/libcommon/source/mode_cardemu.c | 20 |
2 files changed, 23 insertions, 1 deletions
diff --git a/firmware/libboard/octsimtest/include/board.h b/firmware/libboard/octsimtest/include/board.h index 6006796..361c180 100644 --- a/firmware/libboard/octsimtest/include/board.h +++ b/firmware/libboard/octsimtest/include/board.h @@ -62,8 +62,10 @@ #define PIN_PHONE_IO {PIO_PA22A_TXD1, PIOA, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} /* Phone CLK clock input (CLK_PHONE in schematic) */ #define PIN_PHONE_CLK {PIO_PA23A_SCK1, PIOA, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} +/* Pin used to switch level shifter in I/O line between rx (0) and tx (1) */ +#define PIN_USIM1_IO_DIR {PIO_PA16, PIOA, ID_PIOA, PIO_PERIPH_A, PIO_OUTPUT_0} /* Pin used for phone USIM slot 1 communication */ -#define PINS_USIM1 PIN_PHONE_IO, PIN_PHONE_CLK, PIN_PHONE_CLK_INPUT, PIN_USIM1_VCC, PIN_PHONE_IO_INPUT, PIN_USIM1_nRST +#define PINS_USIM1 PIN_PHONE_IO, PIN_PHONE_CLK, PIN_PHONE_CLK_INPUT, PIN_USIM1_VCC, PIN_PHONE_IO_INPUT, PIN_USIM1_nRST, PIN_USIM1_IO_DIR /* Phone I/O data signal input/output (unused USART RX input; connected to I/O_PHONE in schematic) */ #define PIN_PHONE_IO_INPUT {PIO_PA21A_RXD1, PIOA, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} /* Pin used as clock input (to measure the ETU duration; connected to CLK_PHONE in schematic) */ diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c index 127556c..604c66a 100644 --- a/firmware/libcommon/source/mode_cardemu.c +++ b/firmware/libcommon/source/mode_cardemu.c @@ -42,6 +42,10 @@ static const Pin pins_cardsim[] = PINS_CARDSIM; static const Pin pins_usim1[] = {PINS_USIM1}; static const Pin pin_usim1_rst = PIN_USIM1_nRST; static const Pin pin_usim1_vcc = PIN_USIM1_VCC; +#ifdef PIN_USIM1_IO_DIR +static const Pin pin_io_dir = PIN_USIM1_IO_DIR; +#endif + #ifdef CARDEMU_SECOND_UART static const Pin pins_usim2[] = {PINS_USIM2}; @@ -142,12 +146,27 @@ void card_emu_uart_wait_tx_idle(uint8_t uart_chan) wait_tx_idle(usart); } +static void card_emu_uart_set_direction(uint8_t uart_chan, bool tx) +{ + /* only on some boards (octsimtest) we hae an external level + * shifter that requires us to switch the direction between RX and TX */ +#ifdef PIN_USIM1_IO_DIR + if (uart_chan == 0) { + if (tx) + PIO_Set(&pin_io_dir); + else + PIO_Clear(&pin_io_dir); + } +#endif +} + /* call-back from card_emu.c to enable/disable transmit and/or receive */ void card_emu_uart_enable(uint8_t uart_chan, uint8_t rxtx) { Usart *usart = get_usart_by_chan(uart_chan); switch (rxtx) { case ENABLE_TX: + card_emu_uart_set_direction(uart_chan, true); USART_DisableIt(usart, ~(US_IER_TXRDY | US_IER_TIMEOUT)); /* as irritating as it is, we actually want to keep the * receiver enabled during transmit */ @@ -173,6 +192,7 @@ void card_emu_uart_enable(uint8_t uart_chan, uint8_t rxtx) * transmitter enabled during receive */ USART_SetTransmitterEnabled(usart, 1); wait_tx_idle(usart); + card_emu_uart_set_direction(uart_chan, false);; usart->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK; USART_EnableIt(usart, US_IER_RXRDY); USART_SetReceiverEnabled(usart, 1); |