From 419eb8acf29ccc9b7f051f3f86611098ed2383e2 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 20 Mar 2016 10:04:03 +0100 Subject: [PATCH] WIP: Use ADC to determine VCC voltage --- firmware/src_simtrace/mode_cardemu.c | 41 ++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/firmware/src_simtrace/mode_cardemu.c b/firmware/src_simtrace/mode_cardemu.c index 609b1ee4..2e012372 100644 --- a/firmware/src_simtrace/mode_cardemu.c +++ b/firmware/src_simtrace/mode_cardemu.c @@ -36,6 +36,7 @@ struct cardem_inst { uint8_t ep_in; uint8_t ep_int; const Pin pin_insert; + uint16_t vcc_adc; }; static struct cardem_inst cardem_inst[] = { @@ -177,6 +178,43 @@ int card_emu_uart_update_fidi(uint8_t uart_chan, unsigned int fidi) return 0; } +/*********************************************************************** + * ADC for VCC voltage detection + ***********************************************************************/ + +static int card_vcc_adc_init(void) +{ + /* Initialize ADC for AD7 / AD6 */ + ADC->ADC_CR |= ADC_CR_SWRST; + ADC->ADC_MR = ADC_MR_TRGEN_DIS | ADC_MR_LOWRES_BITS_12 | + ADC_MR_SLEEP_NORMAL | ADC_MR_FWUP_OFF | + ADC_MR_FREERUN_ON | ADC_MR_PRESCAL(255) | + ADC_MR_STARTUP_SUT8 | ADC_MR_SETTLING(0) | + ADC_MR_ANACH_NONE | ADC_MR_TRACKTIM(0) | + ADC_MR_TRANSFER(1) | ADC_MR_USEQ_NUM_ORDER; + /* enable AD6 + AD7 channels */ + ADC->ADC_CHER = ADC_CHER_CH6 | ADC_CHER_CH7; + /* start conversion */ + ADC->ADC_CR |= ADC_CR_START; +} + +static int card_vcc_adc_process(void) +{ + /* if ADC is triggered, wait for results */ + /* if both results have arrived, trigger again */ + /* convert results to voltage in milli-volts */ + /* report status changes */ + if (ADC->ADC_ISR & ADC_ISR_EOC6) { + cardem_inst[1].vcc_adc = ADC->ADC_CDR[6] & 0xFFF; + //printf("AD6=%u\n", cardem_inst[1].vcc_adc); + } + + if (ADC->ADC_ISR & ADC_ISR_EOC7) { + cardem_inst[0].vcc_adc = ADC->ADC_CDR[7] & 0xFFF; + printf("AD7=%u\n", cardem_inst[0].vcc_adc); + } +} + /*********************************************************************** * Core USB / mainloop integration ***********************************************************************/ @@ -412,6 +450,8 @@ void mode_cardemu_run(void) TRACE_ERROR("Rx%02x\r\n", byte); } + card_vcc_adc_process(); + queue = card_emu_get_usb_tx_queue(ci->ch); int usb_pending = llist_count(queue); if (usb_pending != ci->usb_pending_old) { @@ -427,4 +467,5 @@ void mode_cardemu_run(void) process_any_usb_commands(queue, ci); } + }