aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKévin Redon <kredon@sysmocom.de>2019-07-18 18:50:51 +0200
committerKévin Redon <kredon@sysmocom.de>2019-07-18 18:50:58 +0200
commit90abc09cf3138e95b8d28418f75e828b575edffb (patch)
tree4d059943a44b4996cf2045f19b4402a81ad0e206
parent76c2eebae250150885a61d08bba2aec20c0d2da2 (diff)
cardem: ensure VCC_PHONE is floatingkevin/cardem
this change is mainly relevant for the SIMtrace board, but also affects the others. First we ensure VCC_PHONE is not forwarded to VCC_SIM because the card could affect the signal (card could draw too much current or feed back current in). next we disable VCC_SIM. the card slot does not need to be powered, and the FPF2019 leaks current back to VCC_PHONE, even with forwarding disabled (the reverse current protection only kicks in when VCC_PHONE is briefly shorted to ground, but still leaks 0.6V). enable the ADC channels normally used to measure VCC, even if not used. the dedicated ADC pins leak current when left unconfigured. enabling them puts them in high impedance. Change-Id: If1487c1c191838aaa08b654e49cd31c7180ffc19
-rw-r--r--firmware/libboard/simtrace/include/board.h8
-rw-r--r--firmware/libcommon/source/mode_cardemu.c10
2 files changed, 17 insertions, 1 deletions
diff --git a/firmware/libboard/simtrace/include/board.h b/firmware/libboard/simtrace/include/board.h
index f8326d2..a0bc37e 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 4a6a3bf..d5405c2 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);