From 20bc014b828b239738a4d556f823da4692ccd26c Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 26 Jan 2022 10:48:51 +0100 Subject: [PATCH] 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 --- firmware/libcommon/include/card_emu.h | 2 ++ firmware/libcommon/source/card_emu.c | 10 +++++++++- firmware/libcommon/source/mode_cardemu.c | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/firmware/libcommon/include/card_emu.h b/firmware/libcommon/include/card_emu.h index 177fad21..2668d73c 100644 --- a/firmware/libcommon/include/card_emu.h +++ b/firmware/libcommon/include/card_emu.h @@ -69,6 +69,8 @@ void card_emu_uart_enable(uint8_t uart_chan, uint8_t rxtx); 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 19a519a2..c85b08ca 100644 --- a/firmware/libcommon/source/card_emu.c +++ b/firmware/libcommon/source/card_emu.c @@ -1058,7 +1058,10 @@ void card_emu_report_status(struct card_handle *ch, bool report_on_irq) 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 @@ void card_emu_io_statechg(struct card_handle *ch, enum card_io io, int active) 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 8e4acf9d..28763ee9 100644 --- a/firmware/libcommon/source/mode_cardemu.c +++ b/firmware/libcommon/source/mode_cardemu.c @@ -168,6 +168,16 @@ static void card_emu_uart_set_direction(uint8_t uart_chan, bool tx) #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) {