diff options
author | Kévin Redon <kredon@sysmocom.de> | 2020-03-26 01:47:12 +0100 |
---|---|---|
committer | Harald Welte <laforge@osmocom.org> | 2021-06-06 11:46:49 +0200 |
commit | 07fda1e706ed3f4a49f29a93cccd0c2d40978ea2 (patch) | |
tree | c00d2a98e39fd2b99413f0bc06074caad66f3f12 | |
parent | ed4ca2573005b6478fe3f3848c93870344dea7ad (diff) |
card_emu: use edge-triggered VCC ADC logic
Before this patch, we used to st ci->vcc_active depending on the
instantaneous ADC reading of VCC. Is it > .5v, we claim VCC is active,
and if it's below, VCC is inactive.
With this patch we move to an edge triggered approach: Only change
ci->vcc_active if the previous reading was different from the current
reading.
FIXME: why?
Change-Id: I71b703162219484e43638f1f2f692e9dd554ef55
-rw-r--r-- | firmware/libcommon/source/mode_cardemu.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c index a357f15..ef6b379 100644 --- a/firmware/libcommon/source/mode_cardemu.c +++ b/firmware/libcommon/source/mode_cardemu.c @@ -74,6 +74,7 @@ struct cardem_inst { const Pin pin_insert; #ifdef DETECT_VCC_BY_ADC uint32_t vcc_uv; + uint32_t vcc_uv_last; #endif bool vcc_active; bool vcc_active_last; @@ -253,6 +254,7 @@ static uint16_t compute_next_timeout(struct cardem_inst *ci) * \param[in] inst_num Instance number, range 0..1 (some boards only '0' permitted) */ static void usart_irq_rx(uint8_t inst_num) { + OSMO_ASSERT(inst_num < ARRAY_SIZE(cardem_inst)); Usart *usart = get_usart_by_chan(inst_num); struct cardem_inst *ci = &cardem_inst[inst_num]; uint32_t csr; @@ -461,10 +463,14 @@ static int card_vcc_adc_init(void) static void process_vcc_adc(struct cardem_inst *ci) { - if (ci->vcc_uv >= VCC_UV_THRESH_3V) + if (ci->vcc_uv >= VCC_UV_THRESH_3V && + ci->vcc_uv_last < VCC_UV_THRESH_3V) { ci->vcc_active = true; - else + } else if (ci->vcc_uv < VCC_UV_THRESH_3V && + ci->vcc_uv_last >= VCC_UV_THRESH_3V) { ci->vcc_active = false; + } + ci->vcc_uv_last = ci->vcc_uv; } void ADC_IrqHandler(void) |