WIP: Use ADC to determine VCC voltage

This commit is contained in:
Harald Welte
2016-03-20 10:04:03 +01:00
parent ff16065047
commit 419eb8acf2

View File

@@ -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);
}
}