diff --git a/make/source.mk b/make/source.mk index cefd2a170..b468f6849 100644 --- a/make/source.mk +++ b/make/source.mk @@ -61,6 +61,7 @@ COMMON_SRC = \ io/statusindicator.c \ io/transponder_ir.c \ msp/msp_serial.c \ + pg/adc.c \ scheduler/scheduler.c \ sensors/battery.c \ sensors/current.c \ diff --git a/src/main/drivers/adc.h b/src/main/drivers/adc.h index f57bc891f..dee5be99c 100644 --- a/src/main/drivers/adc.h +++ b/src/main/drivers/adc.h @@ -61,7 +61,7 @@ typedef enum { ADC_CHANNEL_COUNT } AdcChannel; -typedef struct adc_config_s { +typedef struct adcOperatingConfig_s { ioTag_t tag; uint8_t adcChannel; // ADC1_INxx channel number uint8_t dmaIndex; // index into DMA buffer in case of sparse channels @@ -69,20 +69,8 @@ typedef struct adc_config_s { uint8_t sampleTime; } adcOperatingConfig_t; -typedef struct adcChannelConfig_t { - bool enabled; - ioTag_t ioTag; -} adcChannelConfig_t; - -typedef struct adcConfig_s { - adcChannelConfig_t vbat; - adcChannelConfig_t rssi; - adcChannelConfig_t current; - adcChannelConfig_t external1; - int8_t device; // ADCDevice -} adcConfig_t; - -void adcInit(const adcConfig_t *config); +struct adcConfig_s; +void adcInit(const struct adcConfig_s *config); uint16_t adcGetChannel(uint8_t channel); #ifndef SITL diff --git a/src/main/drivers/adc_impl.h b/src/main/drivers/adc_impl.h index c6b12baa1..84e6be975 100644 --- a/src/main/drivers/adc_impl.h +++ b/src/main/drivers/adc_impl.h @@ -17,8 +17,9 @@ #pragma once +#include "drivers/adc.h" #include "drivers/io_types.h" -#include "rcc_types.h" +#include "drivers/rcc_types.h" #if defined(STM32F4) || defined(STM32F7) #define ADC_TAG_MAP_COUNT 16 diff --git a/src/main/drivers/adc_stm32f10x.c b/src/main/drivers/adc_stm32f10x.c index 6159af708..aae72e0cd 100644 --- a/src/main/drivers/adc_stm32f10x.c +++ b/src/main/drivers/adc_stm32f10x.c @@ -33,6 +33,9 @@ #include "rcc.h" #include "dma.h" +#include "pg/adc.h" + + const adcDevice_t adcHardware[] = { { .ADCx = ADC1, .rccADC = RCC_APB2(ADC1), .DMAy_Channelx = DMA1_Channel1 } }; diff --git a/src/main/drivers/adc_stm32f30x.c b/src/main/drivers/adc_stm32f30x.c index dd15960c5..ed92e4fe5 100644 --- a/src/main/drivers/adc_stm32f30x.c +++ b/src/main/drivers/adc_stm32f30x.c @@ -33,6 +33,9 @@ #include "common/utils.h" +#include "pg/adc.h" + + const adcDevice_t adcHardware[] = { { .ADCx = ADC1, .rccADC = RCC_AHB(ADC12), .DMAy_Channelx = DMA1_Channel1 }, #ifdef ADC24_DMA_REMAP diff --git a/src/main/drivers/adc_stm32f4xx.c b/src/main/drivers/adc_stm32f4xx.c index a089047d2..a34f9fb16 100644 --- a/src/main/drivers/adc_stm32f4xx.c +++ b/src/main/drivers/adc_stm32f4xx.c @@ -34,6 +34,9 @@ #include "adc.h" #include "adc_impl.h" +#include "pg/adc.h" + + const adcDevice_t adcHardware[] = { { .ADCx = ADC1, .rccADC = RCC_APB2(ADC1), .DMAy_Streamx = ADC1_DMA_STREAM, .channel = DMA_Channel_0 }, #if !defined(STM32F411xE) diff --git a/src/main/drivers/adc_stm32f7xx.c b/src/main/drivers/adc_stm32f7xx.c index ff33f78ec..24c5ad39a 100644 --- a/src/main/drivers/adc_stm32f7xx.c +++ b/src/main/drivers/adc_stm32f7xx.c @@ -34,6 +34,9 @@ #include "adc.h" #include "adc_impl.h" +#include "pg/adc.h" + + #ifndef ADC_INSTANCE #define ADC_INSTANCE ADC1 #endif diff --git a/src/main/fc/config.c b/src/main/fc/config.c index d00b515d3..7bda793f0 100644 --- a/src/main/fc/config.c +++ b/src/main/fc/config.c @@ -145,9 +145,6 @@ PG_RESET_TEMPLATE(systemConfig_t, systemConfig, #endif -#ifdef USE_ADC -PG_REGISTER_WITH_RESET_FN(adcConfig_t, adcConfig, PG_ADC_CONFIG, 0); -#endif #ifdef USE_PWM PG_REGISTER_WITH_RESET_FN(pwmConfig_t, pwmConfig, PG_PWM_CONFIG, 0); #endif @@ -180,35 +177,6 @@ PG_RESET_TEMPLATE(sdcardConfig_t, sdcardConfig, // no template required since defaults are zero PG_REGISTER(vcdProfile_t, vcdProfile, PG_VCD_CONFIG, 0); -#ifdef USE_ADC -void pgResetFn_adcConfig(adcConfig_t *adcConfig) -{ - adcConfig->device = ADC_DEV_TO_CFG(adcDeviceByInstance(ADC_INSTANCE)); - -#ifdef VBAT_ADC_PIN - adcConfig->vbat.enabled = true; - adcConfig->vbat.ioTag = IO_TAG(VBAT_ADC_PIN); -#endif - -#ifdef EXTERNAL1_ADC_PIN - adcConfig->external1.enabled = true; - adcConfig->external1.ioTag = IO_TAG(EXTERNAL1_ADC_PIN); -#endif - -#ifdef CURRENT_METER_ADC_PIN - adcConfig->current.enabled = true; - adcConfig->current.ioTag = IO_TAG(CURRENT_METER_ADC_PIN); -#endif - -#ifdef RSSI_ADC_PIN - adcConfig->rssi.enabled = true; - adcConfig->rssi.ioTag = IO_TAG(RSSI_ADC_PIN); -#endif - -} -#endif // USE_ADC - - #if defined(USE_PWM) || defined(USE_PPM) void pgResetFn_ppmConfig(ppmConfig_t *ppmConfig) { diff --git a/src/main/fc/config.h b/src/main/fc/config.h index 53858ff99..acc4eb5a4 100644 --- a/src/main/fc/config.h +++ b/src/main/fc/config.h @@ -22,7 +22,6 @@ #include "config/parameter_group.h" -#include "drivers/adc.h" #include "drivers/flash.h" #include "drivers/rx_pwm.h" #include "drivers/sdcard.h" @@ -84,7 +83,6 @@ typedef struct systemConfig_s { PG_DECLARE(pilotConfig_t, pilotConfig); PG_DECLARE(systemConfig_t, systemConfig); -PG_DECLARE(adcConfig_t, adcConfig); PG_DECLARE(beeperDevConfig_t, beeperDevConfig); PG_DECLARE(flashConfig_t, flashConfig); PG_DECLARE(ppmConfig_t, ppmConfig); diff --git a/src/main/fc/fc_init.c b/src/main/fc/fc_init.c index 3faee7e2d..8dcb73170 100644 --- a/src/main/fc/fc_init.c +++ b/src/main/fc/fc_init.c @@ -80,6 +80,8 @@ #include "msp/msp_serial.h" +#include "pg/adc.h" + #include "rx/rx.h" #include "rx/rx_spi.h" #include "rx/spektrum.h" diff --git a/src/main/interface/cli.c b/src/main/interface/cli.c index 5d6c0a0f3..4948cc1b0 100644 --- a/src/main/interface/cli.c +++ b/src/main/interface/cli.c @@ -116,6 +116,8 @@ extern uint8_t __config_end; #include "io/vtx_control.h" #include "io/vtx.h" +#include "pg/adc.h" + #include "rx/rx.h" #include "rx/spektrum.h" #include "../rx/cc2500_frsky_common.h" diff --git a/src/main/interface/settings.c b/src/main/interface/settings.c index 74e85146d..d5244c41a 100644 --- a/src/main/interface/settings.c +++ b/src/main/interface/settings.c @@ -31,6 +31,7 @@ #include "config/parameter_group.h" #include "config/parameter_group_ids.h" +#include "drivers/adc.h" #include "drivers/bus_i2c.h" #include "drivers/bus_spi.h" #include "drivers/light_led.h" @@ -64,6 +65,8 @@ #include "io/vtx_control.h" #include "io/vtx_rtc6705.h" +#include "pg/adc.h" + #include "rx/rx.h" #include "rx/cc2500_frsky_common.h" #include "rx/spektrum.h" diff --git a/src/main/osd_slave/osd_slave_init.c b/src/main/osd_slave/osd_slave_init.c index af432c83a..03cd8c09e 100644 --- a/src/main/osd_slave/osd_slave_init.c +++ b/src/main/osd_slave/osd_slave_init.c @@ -77,6 +77,8 @@ #include "osd_slave/osd_slave_init.h" +#include "pg/adc.h" + #include "scheduler/scheduler.h" #include "sensors/acceleration.h" diff --git a/src/main/pg/adc.c b/src/main/pg/adc.c new file mode 100644 index 000000000..dca2e92bc --- /dev/null +++ b/src/main/pg/adc.c @@ -0,0 +1,61 @@ +/* + * This file is part of Cleanflight. + * + * Cleanflight is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Cleanflight is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cleanflight. If not, see . + */ + +#include +#include + +#include "platform.h" + +#ifdef USE_ADC + +#include "config/parameter_group.h" +#include "config/parameter_group_ids.h" + +#include "drivers/adc_impl.h" +#include "drivers/io.h" + +#include "pg/adc.h" + + +PG_REGISTER_WITH_RESET_FN(adcConfig_t, adcConfig, PG_ADC_CONFIG, 0); + +void pgResetFn_adcConfig(adcConfig_t *adcConfig) +{ + adcConfig->device = ADC_DEV_TO_CFG(adcDeviceByInstance(ADC_INSTANCE)); + +#ifdef VBAT_ADC_PIN + adcConfig->vbat.enabled = true; + adcConfig->vbat.ioTag = IO_TAG(VBAT_ADC_PIN); +#endif + +#ifdef EXTERNAL1_ADC_PIN + adcConfig->external1.enabled = true; + adcConfig->external1.ioTag = IO_TAG(EXTERNAL1_ADC_PIN); +#endif + +#ifdef CURRENT_METER_ADC_PIN + adcConfig->current.enabled = true; + adcConfig->current.ioTag = IO_TAG(CURRENT_METER_ADC_PIN); +#endif + +#ifdef RSSI_ADC_PIN + adcConfig->rssi.enabled = true; + adcConfig->rssi.ioTag = IO_TAG(RSSI_ADC_PIN); +#endif + +} +#endif // USE_ADC diff --git a/src/main/pg/adc.h b/src/main/pg/adc.h new file mode 100644 index 000000000..be02ea048 --- /dev/null +++ b/src/main/pg/adc.h @@ -0,0 +1,39 @@ +/* + * This file is part of Cleanflight. + * + * Cleanflight is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Cleanflight is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cleanflight. If not, see . + */ + +#pragma once + +#include +#include + +#include "config/parameter_group.h" +#include "drivers/io_types.h" + +typedef struct adcChannelConfig_t { + bool enabled; + ioTag_t ioTag; +} adcChannelConfig_t; + +typedef struct adcConfig_s { + adcChannelConfig_t vbat; + adcChannelConfig_t rssi; + adcChannelConfig_t current; + adcChannelConfig_t external1; + int8_t device; // ADCDevice +} adcConfig_t; + +PG_DECLARE(adcConfig_t, adcConfig); diff --git a/src/main/rx/cc2500_frsky_d.c b/src/main/rx/cc2500_frsky_d.c index ed8eaf157..b2c3da163 100644 --- a/src/main/rx/cc2500_frsky_d.c +++ b/src/main/rx/cc2500_frsky_d.c @@ -30,6 +30,7 @@ #include "common/maths.h" #include "common/utils.h" +#include "drivers/adc.h" #include "drivers/cc2500.h" #include "drivers/io.h" #include "drivers/system.h" diff --git a/src/main/target/BLUEJAYF4/config.c b/src/main/target/BLUEJAYF4/config.c index 479df6107..185883b3d 100644 --- a/src/main/target/BLUEJAYF4/config.c +++ b/src/main/target/BLUEJAYF4/config.c @@ -33,6 +33,8 @@ #include "sensors/acceleration.h" #include "sensors/gyro.h" +#include "pg/adc.h" + #include "hardware_revision.h" // alternative defaults settings for BlueJayF4 targets diff --git a/src/main/target/YUPIF4/config.c b/src/main/target/YUPIF4/config.c index 4438c91be..858703b63 100644 --- a/src/main/target/YUPIF4/config.c +++ b/src/main/target/YUPIF4/config.c @@ -24,6 +24,7 @@ #include "blackbox/blackbox.h" #include "fc/config.h" #include "flight/pid.h" +#include "pg/adc.h" #include "telemetry/telemetry.h" #include "hardware_revision.h"