mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-24 17:28:32 +03:00
WIP: Use ADC to determine VCC voltage
This commit is contained in:
@@ -36,6 +36,7 @@ struct cardem_inst {
|
|||||||
uint8_t ep_in;
|
uint8_t ep_in;
|
||||||
uint8_t ep_int;
|
uint8_t ep_int;
|
||||||
const Pin pin_insert;
|
const Pin pin_insert;
|
||||||
|
uint16_t vcc_adc;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct cardem_inst cardem_inst[] = {
|
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;
|
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
|
* Core USB / mainloop integration
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
@@ -412,6 +450,8 @@ void mode_cardemu_run(void)
|
|||||||
TRACE_ERROR("Rx%02x\r\n", byte);
|
TRACE_ERROR("Rx%02x\r\n", byte);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
card_vcc_adc_process();
|
||||||
|
|
||||||
queue = card_emu_get_usb_tx_queue(ci->ch);
|
queue = card_emu_get_usb_tx_queue(ci->ch);
|
||||||
int usb_pending = llist_count(queue);
|
int usb_pending = llist_count(queue);
|
||||||
if (usb_pending != ci->usb_pending_old) {
|
if (usb_pending != ci->usb_pending_old) {
|
||||||
@@ -427,4 +467,5 @@ void mode_cardemu_run(void)
|
|||||||
process_any_usb_commands(queue, ci);
|
process_any_usb_commands(queue, ci);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user