laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/simtrace2/+/26996 )
Change subject: cardem: Report the VCC voltage (if supported) ......................................................................
cardem: Report the VCC voltage (if supported)
The SIMtrace2 protocol alwasy contained a field for the VCC voltage, the cardem firmware just never populated that field, even on those boards that use the ADC to determine its voltage.
Change-Id: Idcecad553fb36380e916378e1420488acbbfa8e3 --- M firmware/libcommon/include/card_emu.h M firmware/libcommon/source/card_emu.c M firmware/libcommon/source/mode_cardemu.c 3 files changed, 21 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/simtrace2 refs/changes/96/26996/1
diff --git a/firmware/libcommon/include/card_emu.h b/firmware/libcommon/include/card_emu.h index 177fad2..2668d73 100644 --- a/firmware/libcommon/include/card_emu.h +++ b/firmware/libcommon/include/card_emu.h @@ -69,6 +69,8 @@ void card_emu_uart_wait_tx_idle(uint8_t uart_chan); void card_emu_uart_interrupt(uint8_t uart_chan);
+int card_emu_get_vcc(uint8_t uart_chan); + struct cardemu_usb_msg_config; int card_emu_set_config(struct card_handle *ch, const struct cardemu_usb_msg_config *scfg, unsigned int scfg_len); diff --git a/firmware/libcommon/source/card_emu.c b/firmware/libcommon/source/card_emu.c index 19a519a..c85b08c 100644 --- a/firmware/libcommon/source/card_emu.c +++ b/firmware/libcommon/source/card_emu.c @@ -1058,7 +1058,10 @@ sts->flags |= CEMU_STATUS_F_CLK_ACTIVE; if (ch->in_reset) sts->flags |= CEMU_STATUS_F_RESET_ACTIVE; - /* FIXME: voltage + card insert */ +#ifdef DETECT_VCC_BY_ADC + sts->voltage_mv = card_emu_get_vcc(ch->num); +#endif + /* FIXME: card insert */ sts->F_index = ch->F_index; sts->D_index = ch->D_index; sts->wi = ch->wi; @@ -1102,7 +1105,12 @@ card_set_state(ch, ISO_S_WAIT_POWER); chg_mask |= CEMU_STATUS_F_VCC_PRESENT; } else if (active == 1 && ch->vcc_active == 0) { +#ifdef DETECT_VCC_BY_ADC + TRACE_INFO("%u: VCC activated (%d mV)\r\n", ch->num, + card_emu_get_vcc(ch->num)); +#else TRACE_INFO("%u: VCC activated\r\n", ch->num); +#endif card_set_state(ch, ISO_S_WAIT_CLK); chg_mask |= CEMU_STATUS_F_VCC_PRESENT; } diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c index ff76863..edd500f 100644 --- a/firmware/libcommon/source/mode_cardemu.c +++ b/firmware/libcommon/source/mode_cardemu.c @@ -168,6 +168,16 @@ #endif }
+int card_emu_get_vcc(uint8_t uart_chan) +{ + struct cardem_inst *ci = &cardem_inst[uart_chan]; +#ifdef DETECT_VCC_BY_ADC + return ci->vcc_uv / 1000; +#else + return -1; +#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) {