32#ifndef ADC_MAX_CHANNELS_COUNT
33#define ADC_MAX_CHANNELS_COUNT 16
39#ifndef ADC_FAST_DEVICE
40#define ADC_FAST_DEVICE ADCD2
44#ifndef ADC_BUF_DEPTH_FAST
45#define ADC_BUF_DEPTH_FAST 4
49#ifndef ADC_SAMPLING_FAST
50#define ADC_SAMPLING_FAST ADC_SAMPLE_28
62#if ADC_MAX_CHANNELS_COUNT > 16
73#if defined(EFI_INTERNAL_FAST_ADC_PWM)
75#elif defined (EFI_INTERNAL_FAST_ADC_GPT)
83#if defined(EFI_INTERNAL_FAST_ADC_PWM)
87 .cr2 = ADC_CR2_EXTEN_0 | (13 << ADC_CR2_EXTSEL_Pos),
88#elif defined (EFI_INTERNAL_FAST_ADC_GPT)
90 .cr2 = ADC_CR2_SWSTART,
99 ADC_SMPR1_SMP_AN10(ADC_SAMPLING_FAST) |
100 ADC_SMPR1_SMP_AN11(ADC_SAMPLING_FAST) |
101 ADC_SMPR1_SMP_AN12(ADC_SAMPLING_FAST) |
102 ADC_SMPR1_SMP_AN13(ADC_SAMPLING_FAST) |
103 ADC_SMPR1_SMP_AN14(ADC_SAMPLING_FAST) |
104 ADC_SMPR1_SMP_AN15(ADC_SAMPLING_FAST),
107 ADC_SMPR2_SMP_AN0(ADC_SAMPLING_FAST) |
108 ADC_SMPR2_SMP_AN1(ADC_SAMPLING_FAST) |
109 ADC_SMPR2_SMP_AN2(ADC_SAMPLING_FAST) |
110 ADC_SMPR2_SMP_AN3(ADC_SAMPLING_FAST) |
111 ADC_SMPR2_SMP_AN4(ADC_SAMPLING_FAST) |
112 ADC_SMPR2_SMP_AN5(ADC_SAMPLING_FAST) |
113 ADC_SMPR2_SMP_AN6(ADC_SAMPLING_FAST) |
114 ADC_SMPR2_SMP_AN7(ADC_SAMPLING_FAST) |
115 ADC_SMPR2_SMP_AN8(ADC_SAMPLING_FAST) |
116 ADC_SMPR2_SMP_AN9(ADC_SAMPLING_FAST),
122#if ADC_MAX_CHANNELS_COUNT > 16
136 if (adcIsBufferComplete(adcp)) {
138 efitick_t diff = nowTick -
lastTick;
157#if defined(EFI_INTERNAL_FAST_ADC_PWM)
162 .
frequency = GPT_FREQ_FAST * ADC_BUF_DEPTH_FAST,
163 .period = GPT_PERIOD_FAST,
166 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr},
167 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr},
168 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr},
169 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr}
176#elif defined (EFI_INTERNAL_FAST_ADC_GPT)
198 #error Please define EFI_INTERNAL_FAST_ADC_PWM or EFI_INTERNAL_FAST_ADC_GPT for Fast ADC
210#if defined(EFI_INTERNAL_FAST_ADC_PWM)
212 pwmStart(EFI_INTERNAL_FAST_ADC_PWM, &
pwmcfg);
213 pwmEnableChannel(EFI_INTERNAL_FAST_ADC_PWM, 0, 1);
215#elif defined (EFI_INTERNAL_FAST_ADC_GPT)
217 gptStartContinuous(EFI_INTERNAL_FAST_ADC_GPT, GPT_PERIOD_FAST);
223 criticalError(
"Too many ADC channels configured");
232 size_t channelAdcIndex = hwChannel - EFI_ADC_0;
235 if (logicChannel < 6) {
236 hwConfig->sqr3 |= channelAdcIndex << (5 * logicChannel);
237 }
else if (logicChannel < 12) {
238 hwConfig->sqr2 |= channelAdcIndex << (5 * (logicChannel - 6));
239 }
else if (logicChannel < 18) {
240 hwConfig->sqr1 |= channelAdcIndex << (5 * (logicChannel - 12));
242#if ADC_MAX_CHANNELS_COUNT > 16
243 else if (logicChannel < 24) {
244 hwConfig->sqr4 |= channelAdcIndex << (5 * (logicChannel - 18));
246 else if (logicChannel < 30) {
247 hwConfig->sqr5 |= channelAdcIndex << (5 * (logicChannel - 24));
251 return channelAdcIndex;
266 chSysUnlockFromISR();
271 int numChannels =
size();
274 criticalError(
"Fast ADC attempt to read unconfigured input %d.", hwChannel);
278 for (
size_t i = 0; i <
depth; i++) {
280 if (sample > ADC_MAX_VALUE) {
282 criticalError(
"ADC unexpected sample %d at %ld uptime.",
287 index += numChannels;
295 for (
size_t idx = EFI_ADC_0; idx < EFI_ADC_TOTAL_CHANNELS; idx++) {
static void fastAdcStartTrigger(GPTDriver *)
static const PWMConfig pwmcfg
AdcDevice fastAdc & ADC_FAST_DEVICE
static volatile NO_CACHE adcsample_t fastAdcSampleBuf[ADC_BUF_DEPTH_FAST *ADC_MAX_CHANNELS_COUNT]
static efitick_t lastTick
static const GPTConfig fast_adc_config
static void fastAdcDoneCB(ADCDriver *adcp)
static void fastAdcErrorCB(ADCDriver *, adcerror_t err)
static ADCConversionGroup adcgrpcfgFast
void startConversionI(void)
uint8_t internalAdcIndexByHardwareIndex[EFI_ADC_TOTAL_CHANNELS]
adc_channel_e getAdcChannelByInternalIndex(int index) const
AdcToken getAdcChannelToken(adc_channel_e hwChannel)
int enableChannel(adc_channel_e hwChannel)
ADCConversionGroup * hwConfig
adcsample_t getAvgAdcValue(adc_channel_e hwChannel)
AdcDevice(ADCDriver *p_adcp, ADCConversionGroup *p_hwConfig, volatile adcsample_t *p_buf, size_t p_depth)
volatile adcsample_t * samples
TunerStudioOutputChannels outputChannels
efitimesec_t getTimeNowS()
Current system time in seconds (32 bits)
static EngineAccessor engine
adcerror_t
Possible ADC failure causes.
uint16_t adcsample_t
ADC sample data type.
gptfreq_t frequency
Timer clock in Hz.
void onFastAdcComplete(adcsample_t *)
static union @47 NO_CACHE
Driver configuration structure.
Structure representing a GPT driver.
Type of a PWM driver configuration structure.
uint32_t frequency
Timer clock in Hz.
uint8_t fastAdcErrorCount
uint16_t fastAdcConversionCount
uint8_t fastAdcOverrunCount