11#ifdef EFI_SOFTWARE_KNOCK
12#include "knock_config.h"
23#define SLOW_ADC_OVERSAMPLE 8
25#ifndef EFI_INTERNAL_SLOW_ADC_BACKGROUND
26#define EFI_INTERNAL_SLOW_ADC_BACKGROUND FALSE
34#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == TRUE)
45#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == TRUE)
53 .cr2 = ADC_CR2_SWSTART,
56 ADC_SMPR1_SMP_VBAT(ADC_SAMPLE_144) |
57 ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_144) |
58 ADC_SMPR1_SMP_VREF(ADC_SAMPLE_144),
76#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == TRUE)
84 .cr2 = ADC_CR2_SWSTART,
87 ADC_SMPR1_SMP_VBAT(ADC_SAMPLE_144),
110 float degrees = volts / 0.0025f;
138#if defined(STM32F4XX)
145#if defined(STM32F7XX)
157#ifndef ADC_SAMPLING_SLOW
158#define ADC_SAMPLING_SLOW ADC_SAMPLE_56
188#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == TRUE)
196 .cr2 = ADC_CR2_SWSTART,
199 ADC_SMPR1_SMP_AN10(ADC_SAMPLING_SLOW) |
200 ADC_SMPR1_SMP_AN11(ADC_SAMPLING_SLOW) |
201 ADC_SMPR1_SMP_AN12(ADC_SAMPLING_SLOW) |
202 ADC_SMPR1_SMP_AN13(ADC_SAMPLING_SLOW) |
203 ADC_SMPR1_SMP_AN14(ADC_SAMPLING_SLOW) |
204 ADC_SMPR1_SMP_AN15(ADC_SAMPLING_SLOW),
206 ADC_SMPR2_SMP_AN0(ADC_SAMPLING_SLOW) |
207 ADC_SMPR2_SMP_AN1(ADC_SAMPLING_SLOW) |
208 ADC_SMPR2_SMP_AN2(ADC_SAMPLING_SLOW) |
209 ADC_SMPR2_SMP_AN3(ADC_SAMPLING_SLOW) |
210 ADC_SMPR2_SMP_AN4(ADC_SAMPLING_SLOW) |
211 ADC_SMPR2_SMP_AN5(ADC_SAMPLING_SLOW) |
212 ADC_SMPR2_SMP_AN6(ADC_SAMPLING_SLOW) |
213 ADC_SMPR2_SMP_AN7(ADC_SAMPLING_SLOW) |
214 ADC_SMPR2_SMP_AN8(ADC_SAMPLING_SLOW) |
215 ADC_SMPR2_SMP_AN9(ADC_SAMPLING_SLOW),
219 .sqr1 = ADC_SQR1_SQ13_N(12) | ADC_SQR1_SQ14_N(13) | ADC_SQR1_SQ15_N(14) | ADC_SQR1_SQ16_N(15),
220 .sqr2 = ADC_SQR2_SQ7_N(6) | ADC_SQR2_SQ8_N(7) | ADC_SQR2_SQ9_N(8) | ADC_SQR2_SQ10_N(9) | ADC_SQR2_SQ11_N(10) | ADC_SQR2_SQ12_N(11),
221 .sqr3 = ADC_SQR3_SQ1_N(0) | ADC_SQR3_SQ2_N(1) | ADC_SQR3_SQ3_N(2) | ADC_SQR3_SQ4_N(3) | ADC_SQR3_SQ5_N(4) | ADC_SQR3_SQ6_N(5),
224#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == TRUE)
262 if (adcIsBufferComplete(adcp)) {
265 adcp->state = ADC_READY;
283 adcSTM32DisableVBATE();
287 adcSTM32EnableVBATE();
291 chSysUnlockFromISR();
297#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == FALSE)
301 if (result != MSG_OK) {
309 adcSTM32EnableVBATE();
311 adcSTM32DisableVBATE();
318 for (
size_t j = 0; j < SLOW_ADC_OVERSAMPLE; j++) {
324 convertedSamples[i] = value;
336 #if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == FALSE)
341 #if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == FALSE)
367 uint32_t channelAdcIndex = hwChannel - EFI_ADC_0;
393#ifdef EFI_SOFTWARE_KNOCK
396 if (adcIsBufferComplete(adcp)) {
407 ADC_SMPR1_SMP_AN10(KNOCK_SAMPLE_TIME) |
408 ADC_SMPR1_SMP_AN11(KNOCK_SAMPLE_TIME) |
409 ADC_SMPR1_SMP_AN12(KNOCK_SAMPLE_TIME) |
410 ADC_SMPR1_SMP_AN13(KNOCK_SAMPLE_TIME) |
411 ADC_SMPR1_SMP_AN14(KNOCK_SAMPLE_TIME) |
412 ADC_SMPR1_SMP_AN15(KNOCK_SAMPLE_TIME);
415 ADC_SMPR2_SMP_AN0(KNOCK_SAMPLE_TIME) |
416 ADC_SMPR2_SMP_AN1(KNOCK_SAMPLE_TIME) |
417 ADC_SMPR2_SMP_AN2(KNOCK_SAMPLE_TIME) |
418 ADC_SMPR2_SMP_AN3(KNOCK_SAMPLE_TIME) |
419 ADC_SMPR2_SMP_AN4(KNOCK_SAMPLE_TIME) |
420 ADC_SMPR2_SMP_AN5(KNOCK_SAMPLE_TIME) |
421 ADC_SMPR2_SMP_AN6(KNOCK_SAMPLE_TIME) |
422 ADC_SMPR2_SMP_AN7(KNOCK_SAMPLE_TIME) |
423 ADC_SMPR2_SMP_AN8(KNOCK_SAMPLE_TIME) |
424 ADC_SMPR2_SMP_AN9(KNOCK_SAMPLE_TIME);
432 .cr2 = ADC_CR2_SWSTART,
443 .sqr3 = ADC_SQR3_SQ1_N(KNOCK_ADC_CH1)
454 .cr2 = ADC_CR2_SWSTART,
465 .sqr3 = ADC_SQR3_SQ1_N(KNOCK_ADC_CH2)
489 adcStart(&
ADCD1, NULL);
492 adcSTM32EnableTSVREFE();
494#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == TRUE)
500 adcStart(&
ADCD2, NULL);
503#if defined(STM32F7XX)
507 adcSTM32DisableVBATE();
516 if ((adcgrpcfgSlow.error_cb == NULL) &&
519 nvicDisableVector(STM32_ADC_NUMBER);
523#ifdef EFI_SOFTWARE_KNOCK
524 adcStart(&KNOCK_ADC,
nullptr);
int adcConversionGroupSetSeqInput(ADCConversionGroup *cfg, size_t sqn, size_t input)
Low level ChibiOS ADC helpers header.
static ADCConversionGroup adcgrpcfgFast
AdcToken getAdcChannelToken(adc_channel_e hwChannel)
adcsample_t getAdcValueByToken(AdcToken token)
TunerStudioOutputChannels outputChannels
Single output pin reference and state.
void initPin(const char *msg, brain_pin_e brainPin, pin_output_mode_e outputMode, bool forceInitWithFatalError=false)
void setValue(const char *msg, int logicValue, bool isForce=false)
static EngineAccessor engine
static constexpr engine_configuration_s * engineConfiguration
adcerror_t
Possible ADC failure causes.
ADCDriver ADCD2
ADC2 driver identifier.
uint16_t adcsample_t
ADC sample data type.
ADCDriver ADCD1
ADC1 driver identifier.
static union @47 NO_CACHE
void assertInterruptPriority(const char *func, uint8_t expectedPrio)
state("state", SensorCategory.SENSOR_INPUTS, FieldType.INT8, 1886, 1.0, -1.0, -1.0, "")
void onKnockSamplingComplete()
const ADCConversionGroup * getKnockConversionGroup(uint8_t channelIdx)
static const uint32_t smpr1
float getMcuVbatVoltage()
bool readSlowAnalogInputs(adcsample_t *convertedSamples)
static ADCConversionGroup convGroupSlow
static volatile NO_CACHE adcsample_t aux2SensorSamples[adcAux2ChannelCount *auxSensorOversample]
static const ADCConversionGroup aux2ConvGroup
constexpr size_t adcAux1ChannelCount
static void slowAdcEndCB(ADCDriver *adcp)
AdcToken enableFastAdcChannel(const char *, adc_channel_e hwChannel)
static constexpr int auxSensorOversample
static void slowAdcErrorCB(ADCDriver *, adcerror_t)
static volatile NO_CACHE adcsample_t aux1SensorSamples[adcAux1ChannelCount *auxSensorOversample]
adcsample_t getFastAdc(AdcToken token)
static bool readBatch(adcsample_t *convertedSamples, adcsample_t *b)
static const ADCConversionGroup aux1ConvGroup
static const ADCConversionGroup adcConvGroupCh2
static void knockCompletionCallback(ADCDriver *adcp)
static void slowAdcEnableDisableChannel(adc_channel_e hwChannel, bool en)
constexpr size_t adcAux2ChannelCount
static const uint32_t smpr2
static slowAdcState_t slowAdcState
static volatile NO_CACHE adcsample_t slowSampleBufferMuxed[SLOW_ADC_OVERSAMPLE *adcChannelCount]
static OutputPin muxControl
static slowAdcState_t slowAdcGetNextState(slowAdcState_t state)
float getMcuVrefVoltage()
constexpr size_t adcChannelCount
static volatile NO_CACHE adcsample_t slowSampleBuffer[SLOW_ADC_OVERSAMPLE *adcChannelCount]
static void knockErrorCallback(ADCDriver *, adcerror_t)
float getMcuTemperature()
static const ADCConversionGroup adcConvGroupCh1
uint8_t slowAdcErrorCount
uint8_t slowAdcOverrunCount