diff --git a/src/main/drivers/adc.c b/src/main/drivers/adc.c index 958c9815d4..dd41e49c2b 100644 --- a/src/main/drivers/adc.c +++ b/src/main/drivers/adc.c @@ -29,7 +29,7 @@ #include "build/build_config.h" #include "build/debug.h" -#include "drivers/adc_impl.h" +#include "platform/adc_impl.h" #include "drivers/io.h" #include "pg/adc.h" @@ -40,11 +40,7 @@ adcOperatingConfig_t adcOperatingConfig[ADC_CHANNEL_COUNT]; -#if defined(STM32F7) volatile FAST_DATA_ZERO_INIT uint16_t adcValues[ADC_CHANNEL_COUNT]; -#else -volatile uint16_t adcValues[ADC_CHANNEL_COUNT]; -#endif uint8_t adcChannelByTag(ioTag_t ioTag) { diff --git a/src/main/drivers/adc.h b/src/main/drivers/adc.h index 9e272d9e19..f21317f170 100644 --- a/src/main/drivers/adc.h +++ b/src/main/drivers/adc.h @@ -22,6 +22,7 @@ #include +#include "platform.h" #include "drivers/io_types.h" #include "drivers/time.h" @@ -29,20 +30,6 @@ #define ADC_INSTANCE ADC1 #endif -#if defined(STM32F4) || defined(STM32F7) || defined(APM32F4) -#ifndef ADC1_DMA_STREAM -#define ADC1_DMA_STREAM DMA2_Stream4 // ST0 or ST4 -#endif - -#ifndef ADC2_DMA_STREAM -#define ADC2_DMA_STREAM DMA2_Stream3 // ST2 or ST3 -#endif - -#ifndef ADC3_DMA_STREAM -#define ADC3_DMA_STREAM DMA2_Stream0 // ST0 or ST1 -#endif -#endif - typedef enum ADCDevice { ADCINVALID = -1, ADCDEV_1 = 0, @@ -69,28 +56,24 @@ typedef enum { ADC_CURRENT = 1, ADC_EXTERNAL1 = 2, ADC_RSSI = 3, -#if defined(STM32H7) || defined(STM32G4) +#if PLATFORM_TRAIT_ADC_INTERNAL // On H7 and G4, internal sensors are treated in the similar fashion as regular ADC inputs ADC_CHANNEL_INTERNAL_FIRST_ID = 4, - ADC_TEMPSENSOR = 4, ADC_VREFINT = 5, +#if PLATFORM_TRAIT_ADC_INTERNAL_VBAT4 ADC_VBAT4 = 6, -#elif defined(AT32F435) - ADC_CHANNEL_INTERNAL_FIRST_ID = 4, - - ADC_TEMPSENSOR = 4, - ADC_VREFINT = 5, - // ADC_VBAT4 = 6, - +#endif #endif ADC_CHANNEL_COUNT } AdcChannel; typedef struct adcOperatingConfig_s { ioTag_t tag; -#if defined(STM32H7) || defined(STM32G4) || defined(AT32F435) +#if PLATFORM_TRAIT_ADC_DEVICE ADCDevice adcDevice; // ADCDEV_x for this input +#endif +#if PLATFORM_TRAIT_ADC_CHANNEL_32BIT uint32_t adcChannel; // Channel number for this input. Note that H7 and G4 HAL requires this to be 32-bit encoded number. #else uint8_t adcChannel; // ADCy_INxx channel number for this input (XXX May be consolidated with uint32_t case) @@ -113,6 +96,4 @@ uint16_t adcInternalCompensateVref(uint16_t vrefAdcValue); int16_t adcInternalComputeTemperature(uint16_t tempAdcValue, uint16_t vrefValue); #endif -#if !defined(SIMULATOR_BUILD) ADCDevice adcDeviceByInstance(const ADC_TypeDef *instance); -#endif diff --git a/src/main/pg/adc.c b/src/main/pg/adc.c index b32de9545f..31f724e192 100644 --- a/src/main/pg/adc.c +++ b/src/main/pg/adc.c @@ -29,7 +29,6 @@ #include "pg/pg_ids.h" #include "drivers/adc.h" -#include "drivers/adc_impl.h" #include "drivers/io.h" #include "pg/adc.h" @@ -81,7 +80,7 @@ void pgResetFn_adcConfig(adcConfig_t *adcConfig) #ifdef ADC_CURR_PIN adcConfig->current.enabled = true; adcConfig->current.ioTag = IO_TAG(ADC_CURR_PIN); -#if defined(STM32H7) +#if PLATFORM_TRAIT_ADC_CURRENT_DEVICE #ifdef ADC_CURR_INSTANCE adcConfig->current.device = ADC_DEV_TO_CFG(adcDeviceByInstance(ADC_CURR_INSTANCE)); #else @@ -93,7 +92,7 @@ void pgResetFn_adcConfig(adcConfig_t *adcConfig) #ifdef ADC_RSSI_PIN adcConfig->rssi.enabled = true; adcConfig->rssi.ioTag = IO_TAG(ADC_RSSI_PIN); -#if defined(STM32H7) +#if PLATFORM_TRAIT_ADC_RSSI_DEVICE #ifdef ADC_RSSI_INSTANCE adcConfig->rssi.device = ADC_DEV_TO_CFG(adcDeviceByInstance(ADC_RSSI_INSTANCE)); #else diff --git a/src/platform/APM32/adc_apm32f4xx.c b/src/platform/APM32/adc_apm32f4xx.c index 38004b23be..89344a61f8 100644 --- a/src/platform/APM32/adc_apm32f4xx.c +++ b/src/platform/APM32/adc_apm32f4xx.c @@ -36,7 +36,7 @@ #include "drivers/dma.h" #include "drivers/sensor.h" #include "drivers/adc.h" -#include "drivers/adc_impl.h" +#include "platform/adc_impl.h" #include "pg/adc.h" diff --git a/src/platform/APM32/include/platform/platform.h b/src/platform/APM32/include/platform/platform.h index 89697bf23d..8545a6b2c4 100644 --- a/src/platform/APM32/include/platform/platform.h +++ b/src/platform/APM32/include/platform/platform.h @@ -150,6 +150,18 @@ #if defined(APM32F4) +#ifndef ADC1_DMA_STREAM +#define ADC1_DMA_STREAM DMA2_Stream4 +#endif + +#ifndef ADC2_DMA_STREAM +#define ADC2_DMA_STREAM DMA2_Stream3 +#endif + +#ifndef ADC3_DMA_STREAM +#define ADC3_DMA_STREAM DMA2_Stream0 +#endif + //speed is packed inside modebits 5 and 2, #define IO_CONFIG(mode, speed, pupd) ((mode) | ((speed) << 2) | ((pupd) << 5)) @@ -211,4 +223,5 @@ #define FLASH_CONFIG_BUFFER_TYPE uint32_t #define DMA_STCH_STRING "Stream" + #endif diff --git a/src/platform/AT32/adc_at32f43x.c b/src/platform/AT32/adc_at32f43x.c index 13e13b3c5e..ce5afa8ef9 100644 --- a/src/platform/AT32/adc_at32f43x.c +++ b/src/platform/AT32/adc_at32f43x.c @@ -61,7 +61,7 @@ #include "drivers/sensor.h" #include "drivers/adc.h" -#include "drivers/adc_impl.h" +#include "platform/adc_impl.h" #include "pg/adc.h" @@ -163,14 +163,14 @@ static int adcFindTagMapEntry(const ioTag_t tag) /** * Setup the scaling offsets and factors used in adc.c * @see src/main/drivers/adc.c - * @see src/main/drivers/adc_impl.h + * @see src/platform/common/stm32/platform/adc_impl.h * * There are a number of global calibration/scaling factors used in src/main/drivers/adc.c that need to * be set to appropriate values if we want to re-use existing code, e.g. adcInternalComputeTemperature * (the alternative would be to duplicate the code into ST and AT specific versions). * This is made a little confusing since the implementation based on ST datasheets approaches the calculation with * different formula and express the scaling factors in different units compared to the AT datasheets. - * The constants are defined in src/main/drivers/adc_impl.h. It seems clearest to use the units from + * The constants are defined in src/platform/common/stm32/platform/adc_impl.h. It seems clearest to use the units from * the datasheet when defining those values, so here we have to convert to what's expected in * adcInternalComputeTemperature. */ diff --git a/src/platform/AT32/include/platform/platform.h b/src/platform/AT32/include/platform/platform.h index f5c31dbc0d..49dae4a95f 100644 --- a/src/platform/AT32/include/platform/platform.h +++ b/src/platform/AT32/include/platform/platform.h @@ -69,6 +69,11 @@ typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; #define READ_REG(REG) ((REG)) #define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) +#define PLATFORM_TRAIT_ADC_INTERNAL 1 +#define PLATFORM_TRAIT_ADC_INTERNAL_VBAT4 0 + +#define PLATFORM_TRAIT_ADC_DEVICE 1 +#define PLATFORM_TRAIT_ADC_CHANNEL_32BIT 1 #endif #define USE_USB_MSC diff --git a/src/platform/SIMULATOR/sitl.c b/src/platform/SIMULATOR/sitl.c index 638f799d00..1920282f3e 100644 --- a/src/platform/SIMULATOR/sitl.c +++ b/src/platform/SIMULATOR/sitl.c @@ -32,7 +32,6 @@ #include "build/debug.h" -#include "drivers/adc_impl.h" #include "drivers/io.h" #include "drivers/dma.h" #include "drivers/motor_impl.h" diff --git a/src/platform/STM32/adc_stm32f4xx.c b/src/platform/STM32/adc_stm32f4xx.c index f8c46d83e6..faf1e42bc7 100644 --- a/src/platform/STM32/adc_stm32f4xx.c +++ b/src/platform/STM32/adc_stm32f4xx.c @@ -35,7 +35,7 @@ #include "drivers/dma.h" #include "drivers/sensor.h" #include "drivers/adc.h" -#include "drivers/adc_impl.h" +#include "platform/adc_impl.h" #include "pg/adc.h" diff --git a/src/platform/STM32/adc_stm32f7xx.c b/src/platform/STM32/adc_stm32f7xx.c index 0ef61b3f32..28027532b0 100644 --- a/src/platform/STM32/adc_stm32f7xx.c +++ b/src/platform/STM32/adc_stm32f7xx.c @@ -34,7 +34,7 @@ #include "drivers/sensor.h" #include "drivers/adc.h" -#include "drivers/adc_impl.h" +#include "platform/adc_impl.h" #include "pg/adc.h" diff --git a/src/platform/STM32/adc_stm32g4xx.c b/src/platform/STM32/adc_stm32g4xx.c index c378d9cbbd..dbd981e9a1 100644 --- a/src/platform/STM32/adc_stm32g4xx.c +++ b/src/platform/STM32/adc_stm32g4xx.c @@ -38,7 +38,7 @@ #include "drivers/sensor.h" #include "drivers/adc.h" -#include "drivers/adc_impl.h" +#include "platform/adc_impl.h" #include "pg/adc.h" diff --git a/src/platform/STM32/adc_stm32h7xx.c b/src/platform/STM32/adc_stm32h7xx.c index 96a3327628..d752957add 100644 --- a/src/platform/STM32/adc_stm32h7xx.c +++ b/src/platform/STM32/adc_stm32h7xx.c @@ -38,7 +38,7 @@ #include "drivers/sensor.h" #include "drivers/adc.h" -#include "drivers/adc_impl.h" +#include "platform/adc_impl.h" #include "pg/adc.h" diff --git a/src/platform/STM32/include/platform/platform.h b/src/platform/STM32/include/platform/platform.h index eb7d303710..f5cb11d548 100644 --- a/src/platform/STM32/include/platform/platform.h +++ b/src/platform/STM32/include/platform/platform.h @@ -466,8 +466,36 @@ extern uint8_t _dmaram_end__; #if defined(STM32H7) || defined(STM32G4) #define DMA_CHANREQ_STRING "Request" + +#define PLATFORM_TRAIT_ADC_INTERNAL 1 +#define PLATFORM_TRAIT_ADC_INTERNAL_VBAT4 1 + +#define PLATFORM_TRAIT_ADC_DEVICE 1 +#define PLATFORM_TRAIT_ADC_CHANNEL_32BIT 1 + +#if defined(STM32H7) +#define PLATFORM_TRAIT_ADC_CURRENT_DEVICE 1 +#define PLATFORM_TRAIT_ADC_RSSI_DEVICE 1 +#endif #endif #if defined(STM32F4) || defined(STM32F7) || defined(STM32H7) #define DMA_STCH_STRING "Stream" #endif + +#if defined(STM32F4) || defined(STM32F7) +#ifndef ADC1_DMA_STREAM +#define ADC1_DMA_STREAM DMA2_Stream4 +// ST0 or ST4 +#endif + +#ifndef ADC2_DMA_STREAM +#define ADC2_DMA_STREAM DMA2_Stream3 +// ST2 or ST3 +#endif + +#ifndef ADC3_DMA_STREAM +#define ADC3_DMA_STREAM DMA2_Stream0 +// ST0 or ST1 +#endif +#endif \ No newline at end of file diff --git a/src/main/drivers/adc_impl.h b/src/platform/common/stm32/platform/adc_impl.h similarity index 99% rename from src/main/drivers/adc_impl.h rename to src/platform/common/stm32/platform/adc_impl.h index add1083bf2..90a64580ce 100644 --- a/src/main/drivers/adc_impl.h +++ b/src/platform/common/stm32/platform/adc_impl.h @@ -162,5 +162,6 @@ void adcGetChannelValues(void); #define TEMPSENSOR_CAL_VREFANALOG (3300U) #define TEMPSENSOR_CAL1_TEMP (25U) #define TEMPSENSOR_CAL1_V (1.27f) -#define TEMPSENSOR_SLOPE (-4.13f) // mV/C +// mV/C +#define TEMPSENSOR_SLOPE (-4.13f) #endif