diff --git a/firmware/libboard/simtrace/include/board.h b/firmware/libboard/simtrace/include/board.h index f8326d20..a0bc37ea 100644 --- a/firmware/libboard/simtrace/include/board.h +++ b/firmware/libboard/simtrace/include/board.h @@ -105,6 +105,14 @@ /* ISO7816-communication related pins */ #define PINS_ISO7816 PIN_SIM_IO, PIN_SIM_CLK, PIN_ISO7816_RSTMC // SIM_PWEN_PIN, PIN_SIM_IO2, PIN_SIM_CLK2 +/** card emulation configuration */ +/* Disable power converter 4.5-6V to 3.3V (active high) */ +#define PIN_SIM_PWEN_CARDEMU {SIM_PWEN, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT} +/* Disable power switch to forward VCC_PHONE to VCC_SIM (active high) */ +#define PIN_VCC_FWD_CARDEMU {VCC_FWD, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT} +/* Disable power to SIM */ +#define PINS_PWR_CARDEMU PIN_SIM_PWEN_CARDEMU, PIN_VCC_FWD_CARDEMU + /** External SPI flash interface **/ /* SPI MISO pin definition */ #define PIN_SPI_MISO {PIO_PA12A_MISO, PIOA, PIOA, PIO_PERIPH_A, PIO_PULLUP} diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c index 4a6a3bfd..d5405c2e 100644 --- a/firmware/libcommon/source/mode_cardemu.c +++ b/firmware/libcommon/source/mode_cardemu.c @@ -508,12 +508,20 @@ void mode_cardemu_init(void) TRACE_ENTRY(); +#ifdef PINS_PWR_CARDEMU + // enable power on required peripherals, else disable + Pin pins_pwr_cardemu[] = { PINS_PWR_CARDEMU }; + PIO_Configure(pins_pwr_cardemu, PIO_LISTSIZE(pins_pwr_cardemu)); +#endif /* PINS_PWR_CARDEMU */ #ifdef PINS_CARDSIM PIO_Configure(pins_cardsim, PIO_LISTSIZE(pins_cardsim)); #endif + // ADC channel 6 and 7 are used to measure VCC (else they are grounded) + ADC->ADC_CHER |= ADC_CHER_CH6 | ADC_CHER_CH7; // enable the ADC channels to put them in high impedance (else they leak current) #ifdef DETECT_VCC_BY_ADC - card_vcc_adc_init(); + card_vcc_adc_init(); // configure the ADC to measure VCC #endif /* DETECT_VCC_BY_ADC */ + // TODO pull SIMtrace board SIM lines low, else they can leak current back to VCC INIT_LLIST_HEAD(&cardem_inst[0].usb_out_queue); rbuf_reset(&cardem_inst[0].rb);