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;
159#if defined(EFI_INTERNAL_FAST_ADC_PWM)
164 .
frequency = GPT_FREQ_FAST * ADC_BUF_DEPTH_FAST,
165 .period = GPT_PERIOD_FAST,
168 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr},
169 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr},
170 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr},
171 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr}
178#elif defined (EFI_INTERNAL_FAST_ADC_GPT)
201 #error Please define EFI_INTERNAL_FAST_ADC_PWM or EFI_INTERNAL_FAST_ADC_GPT for Fast ADC
213#if defined(EFI_INTERNAL_FAST_ADC_PWM)
215 pwmStart(EFI_INTERNAL_FAST_ADC_PWM, &
pwmcfg);
216 pwmEnableChannel(EFI_INTERNAL_FAST_ADC_PWM, 0, 1);
218#elif defined (EFI_INTERNAL_FAST_ADC_GPT)
220 gptStartContinuous(EFI_INTERNAL_FAST_ADC_GPT, GPT_PERIOD_FAST);
226 criticalError(
"Too many ADC channels configured");
235 size_t channelAdcIndex = hwChannel - EFI_ADC_0;
238 if (logicChannel < 6) {
239 hwConfig->sqr3 |= channelAdcIndex << (5 * logicChannel);
240 }
else if (logicChannel < 12) {
241 hwConfig->sqr2 |= channelAdcIndex << (5 * (logicChannel - 6));
242 }
else if (logicChannel < 18) {
243 hwConfig->sqr1 |= channelAdcIndex << (5 * (logicChannel - 12));
245#if ADC_MAX_CHANNELS_COUNT > 16
246 else if (logicChannel < 24) {
247 hwConfig->sqr4 |= channelAdcIndex << (5 * (logicChannel - 18));
249 else if (logicChannel < 30) {
250 hwConfig->sqr5 |= channelAdcIndex << (5 * (logicChannel - 24));
254 return channelAdcIndex;
269 chSysUnlockFromISR();
274 int numChannels =
size();
277 criticalError(
"Fast ADC attempt to read unconfigured input %d.", hwChannel);
281 for (
size_t i = 0; i <
depth; i++) {
283 if (sample > ADC_MAX_VALUE) {
285 criticalError(
"ADC unexpected sample %d at %ld uptime.",
290 index += numChannels;
298 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
void assertInterruptPriority(const char *func, uint8_t expectedPrio)
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