11#ifdef EFI_SOFTWARE_KNOCK
12#include "knock_config.h"
22#define SLOW_ADC_OVERSAMPLE 8
24#ifndef EFI_INTERNAL_SLOW_ADC_BACKGROUND
25#define EFI_INTERNAL_SLOW_ADC_BACKGROUND FALSE
33#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == TRUE)
44#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == TRUE)
52 .cr2 = ADC_CR2_SWSTART,
55 ADC_SMPR1_SMP_VBAT(ADC_SAMPLE_144) |
56 ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_144) |
57 ADC_SMPR1_SMP_VREF(ADC_SAMPLE_144),
77#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == FALSE)
91 float degrees = volts / 0.0025f;
115#ifndef ADC_SAMPLING_SLOW
116#define ADC_SAMPLING_SLOW ADC_SAMPLE_56
146#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == TRUE)
154 .cr2 = ADC_CR2_SWSTART,
157 ADC_SMPR1_SMP_AN10(ADC_SAMPLING_SLOW) |
158 ADC_SMPR1_SMP_AN11(ADC_SAMPLING_SLOW) |
159 ADC_SMPR1_SMP_AN12(ADC_SAMPLING_SLOW) |
160 ADC_SMPR1_SMP_AN13(ADC_SAMPLING_SLOW) |
161 ADC_SMPR1_SMP_AN14(ADC_SAMPLING_SLOW) |
162 ADC_SMPR1_SMP_AN15(ADC_SAMPLING_SLOW),
164 ADC_SMPR2_SMP_AN0(ADC_SAMPLING_SLOW) |
165 ADC_SMPR2_SMP_AN1(ADC_SAMPLING_SLOW) |
166 ADC_SMPR2_SMP_AN2(ADC_SAMPLING_SLOW) |
167 ADC_SMPR2_SMP_AN3(ADC_SAMPLING_SLOW) |
168 ADC_SMPR2_SMP_AN4(ADC_SAMPLING_SLOW) |
169 ADC_SMPR2_SMP_AN5(ADC_SAMPLING_SLOW) |
170 ADC_SMPR2_SMP_AN6(ADC_SAMPLING_SLOW) |
171 ADC_SMPR2_SMP_AN7(ADC_SAMPLING_SLOW) |
172 ADC_SMPR2_SMP_AN8(ADC_SAMPLING_SLOW) |
173 ADC_SMPR2_SMP_AN9(ADC_SAMPLING_SLOW),
177 .sqr1 = ADC_SQR1_SQ13_N(12) | ADC_SQR1_SQ14_N(13) | ADC_SQR1_SQ15_N(14) | ADC_SQR1_SQ16_N(15),
178 .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),
179 .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),
182#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == TRUE)
217 if (adcIsBufferComplete(adcp)) {
220 adcp->state = ADC_READY;
241 chSysUnlockFromISR();
247#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == FALSE)
251 if (result != MSG_OK) {
260 for (
size_t j = 0; j < SLOW_ADC_OVERSAMPLE; j++) {
266 convertedSamples[i] = value;
278 #if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == FALSE)
283 #if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == FALSE)
309 uint32_t channelAdcIndex = hwChannel - EFI_ADC_0;
335#ifdef EFI_SOFTWARE_KNOCK
338 if (adcIsBufferComplete(adcp)) {
347 ADC_SMPR1_SMP_AN10(KNOCK_SAMPLE_TIME) |
348 ADC_SMPR1_SMP_AN11(KNOCK_SAMPLE_TIME) |
349 ADC_SMPR1_SMP_AN12(KNOCK_SAMPLE_TIME) |
350 ADC_SMPR1_SMP_AN13(KNOCK_SAMPLE_TIME) |
351 ADC_SMPR1_SMP_AN14(KNOCK_SAMPLE_TIME) |
352 ADC_SMPR1_SMP_AN15(KNOCK_SAMPLE_TIME);
355 ADC_SMPR2_SMP_AN0(KNOCK_SAMPLE_TIME) |
356 ADC_SMPR2_SMP_AN1(KNOCK_SAMPLE_TIME) |
357 ADC_SMPR2_SMP_AN2(KNOCK_SAMPLE_TIME) |
358 ADC_SMPR2_SMP_AN3(KNOCK_SAMPLE_TIME) |
359 ADC_SMPR2_SMP_AN4(KNOCK_SAMPLE_TIME) |
360 ADC_SMPR2_SMP_AN5(KNOCK_SAMPLE_TIME) |
361 ADC_SMPR2_SMP_AN6(KNOCK_SAMPLE_TIME) |
362 ADC_SMPR2_SMP_AN7(KNOCK_SAMPLE_TIME) |
363 ADC_SMPR2_SMP_AN8(KNOCK_SAMPLE_TIME) |
364 ADC_SMPR2_SMP_AN9(KNOCK_SAMPLE_TIME);
372 .cr2 = ADC_CR2_SWSTART,
383 .sqr3 = ADC_SQR3_SQ1_N(KNOCK_ADC_CH1)
394 .cr2 = ADC_CR2_SWSTART,
405 .sqr3 = ADC_SQR3_SQ1_N(KNOCK_ADC_CH2)
429 adcStart(&
ADCD1, NULL);
432 adcSTM32EnableTSVREFE();
434#if (EFI_INTERNAL_SLOW_ADC_BACKGROUND == TRUE)
440 adcStart(&
ADCD2, NULL);
443#if defined(STM32F7XX)
447 adcSTM32DisableVBATE();
456 if ((adcgrpcfgSlow.error_cb == NULL) &&
459 nvicDisableVector(STM32_ADC_NUMBER);
463#ifdef EFI_SOFTWARE_KNOCK
464 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
state("state", SensorCategory.SENSOR_INPUTS, FieldType.INT8, 1871, 1.0, -1.0, -1.0, "")
void onKnockSamplingComplete()
const ADCConversionGroup * getKnockConversionGroup(uint8_t channelIdx)
static const uint32_t smpr1
bool readSlowAnalogInputs(adcsample_t *convertedSamples)
static ADCConversionGroup convGroupSlow
static void slowAdcEndCB(ADCDriver *adcp)
AdcToken enableFastAdcChannel(const char *, adc_channel_e hwChannel)
static constexpr int auxSensorOversample
static void slowAdcErrorCB(ADCDriver *, adcerror_t)
adcsample_t getFastAdc(AdcToken token)
static const ADCConversionGroup auxConvGroup
static bool readBatch(adcsample_t *convertedSamples, adcsample_t *b)
static const ADCConversionGroup adcConvGroupCh2
static void knockCompletionCallback(ADCDriver *adcp)
static void slowAdcEnableDisableChannel(adc_channel_e hwChannel, bool en)
constexpr size_t adcAuxChannelCount
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)
static volatile NO_CACHE adcsample_t auxSensorSamples[adcAuxChannelCount *auxSensorOversample]
float getMcuTemperature()
static const ADCConversionGroup adcConvGroupCh1
uint8_t slowAdcErrorCount
uint8_t slowAdcOverrunCount