arch/arm/src/stm32f7: port ADC driver from arch/stm32

This change adds support for the following features:
  - injected channels (default: 0)
  - ADC resolution (default: 12bit)
  - ADC low-level operations
  - ADC external triggers
  - custom ADC interrupts
  - ADC sample time configuration
  - configurable ADC SCAN mode (default on if DMA)
  - configurable ADC DMA mode (default: one shot mode)
  - reset the ADC block only if all ADC instances are closed
This commit is contained in:
raiden00pl 2022-07-30 18:20:20 +02:00 committed by Xiang Xiao
parent 60042fea74
commit 08b8234e9e
5 changed files with 2126 additions and 401 deletions

View File

@ -6089,12 +6089,66 @@ endmenu
menu "ADC Configuration"
depends on STM32F7_ADC
config STM32F7_ADC1_RESOLUTION
int "ADC1 resolution"
depends on STM32F7_ADC1
default 0
range 0 3
---help---
ADC1 resolution. 0 - 12 bit, 1 - 10 bit, 2 - 8 bit, 3 - 6 bit
config STM32F7_ADC2_RESOLUTION
int "ADC2 resolution"
depends on STM32F7_ADC2
default 0
range 0 3
---help---
ADC2 resolution. 0 - 12 bit, 1 - 10 bit, 2 - 8 bit, 3 - 6 bit
config STM32F7_ADC3_RESOLUTION
int "ADC3 resolution"
depends on STM32F7_ADC3
default 0
range 0 3
---help---
ADC3 resolution. 0 - 12 bit, 1 - 10 bit, 2 - 8 bit, 3 - 6 bit
config STM32F7_ADC_MAX_SAMPLES
int "The maximum number of channels that can be sampled"
default 16
---help---
The maximum number of samples which can be handled without
overrun depends on various factors. This is the user's
responsibility to correctly select this value.
Since the interface to update the sampling time is available
for all supported devices, the user can change the default
values in the board initialization logic and avoid ADC overrun.
config STM32F7_ADC_NO_STARTUP_CONV
bool "Do not start conversion when opening ADC device"
default n
---help---
Do not start conversion when opening ADC device.
config STM32F7_ADC_NOIRQ
bool "Do not use default ADC interrupts"
default n
---help---
Do not use default ADC interrupts handlers.
config STM32F7_ADC_LL_OPS
bool "ADC low-level operations"
default n
---help---
Enable low-level ADC ops.
config STM32F7_ADC_CHANGE_SAMPLETIME
bool "ADC sample time configuration"
default n
depends on STM32F7_ADC_LL_OPS
---help---
Enable ADC sample time configuration (SMPRx registers).
config STM32F7_ADC1_DMA
bool "ADC1 DMA"
depends on STM32F7_ADC1 && STM32F7_HAVE_ADC1_DMA
@ -6104,6 +6158,30 @@ config STM32F7_ADC1_DMA
DMA transfer, which is necessary if multiple channels are read
or if very high trigger frequencies are used.
config STM32F7_ADC1_SCAN
bool "ADC1 scan mode"
depends on STM32F7_ADC1
default y if STM32F7_ADC1_DMA
default n
config STM32F7_ADC1_DMA_CFG
int "ADC1 DMA configuration"
depends on STM32F7_ADC1_DMA
range 0 1
default 0
---help---
0 - ADC1 DMA in One Shot Mode, 1 - ADC1 DMA in Circular Mode
config STM32F7_ADC1_ANIOC_TRIGGER
int "ADC1 software trigger (ANIOC_TRIGGER) configuration"
depends on STM32F7_ADC1
range 1 3
default 3
---help---
1 - ANIOC_TRIGGER only starts regular conversion
2 - ANIOC_TRIGGER only starts injected conversion
3 - ANIOC_TRIGGER starts both regular and injected conversions
config STM32F7_ADC2_DMA
bool "ADC2 DMA"
depends on STM32F7_ADC2 && STM32F7_HAVE_ADC2_DMA
@ -6113,6 +6191,30 @@ config STM32F7_ADC2_DMA
DMA transfer, which is necessary if multiple channels are read
or if very high trigger frequencies are used.
config STM32F7_ADC2_SCAN
bool "ADC2 scan mode"
depends on STM32F7_ADC2
default y if STM32F7_ADC2_DMA
default n
config STM32F7_ADC2_DMA_CFG
int "ADC2 DMA configuration"
depends on STM32F7_ADC2_DMA
range 0 1
default 0
---help---
0 - ADC2 DMA in One Shot Mode, 1 - ADC2 DMA in Circular Mode
config STM32F7_ADC2_ANIOC_TRIGGER
int "ADC2 software trigger (ANIOC_TRIGGER) configuration"
depends on STM32F7_ADC2
range 1 3
default 3
---help---
1 - ANIOC_TRIGGER only starts regular conversion
2 - ANIOC_TRIGGER only starts injected conversion
3 - ANIOC_TRIGGER starts both regular and injected conversions
config STM32F7_ADC3_DMA
bool "ADC3 DMA"
depends on STM32F7_ADC3 && STM32F7_HAVE_ADC3_DMA
@ -6122,6 +6224,96 @@ config STM32F7_ADC3_DMA
DMA transfer, which is necessary if multiple channels are read
or if very high trigger frequencies are used.
config STM32F7_ADC3_SCAN
bool "ADC3 scan mode"
depends on STM32F7_ADC3
default y if STM32F7_ADC3_DMA
default n
config STM32F7_ADC3_DMA_CFG
int "ADC3 DMA configuration"
depends on STM32F7_ADC3_DMA
range 0 1
default 0
---help---
0 - ADC3 DMA in One Shot Mode, 1 - ADC3 DMA in Circular Mode
config STM32F7_ADC3_ANIOC_TRIGGER
int "ADC3 software trigger (ANIOC_TRIGGER) configuration"
depends on STM32F7_ADC3
range 1 3
default 3
---help---
1 - ANIOC_TRIGGER only starts regular conversion
2 - ANIOC_TRIGGER only starts injected conversion
3 - ANIOC_TRIGGER starts both regular and injected conversions
config STM32F7_ADC1_INJECTED_CHAN
int "ADC1 injected channels"
depends on STM32F7_ADC1
range 0 4
default 0
---help---
Support for ADC1 injected channels.
config STM32F7_ADC2_INJECTED_CHAN
int "ADC2 injected channels"
depends on STM32F7_ADC2
range 0 4
default 0
---help---
Support for ADC2 injected channels.
config STM32F7_ADC3_INJECTED_CHAN
int "ADC3 injected channels"
depends on STM32F7_ADC3
range 0 4
default 0
---help---
Support for ADC3 injected channels.
config STM32F7_ADC1_EXTSEL
bool "ADC1 external trigger for regular group"
depends on STM32F7_ADC1 && !STM32F7_HAVE_ADC1_TIMER
default n
---help---
Enable EXTSEL for ADC1.
config STM32F7_ADC2_EXTSEL
bool "ADC2 external trigger for regular group"
depends on STM32F7_ADC2 && !STM32F7_HAVE_ADC2_TIMER
default n
---help---
Enable EXTSEL for ADC2.
config STM32F7_ADC3_EXTSEL
bool "ADC3 external trigger for regular group"
depends on STM32F7_ADC3 && !STM32F7_HAVE_ADC3_TIMER
default n
---help---
Enable EXTSEL for ADC3.
config STM32F7_ADC1_JEXTSEL
bool "ADC1 external trigger for injected group"
depends on STM32F7_ADC1
default n
---help---
Enable JEXTSEL for ADC1.
config STM32F7_ADC2_JEXTSEL
bool "ADC2 external trigger for injected group"
depends on STM32F7_ADC2
default n
---help---
Enable JEXTSEL for ADC2.
config STM32F7_ADC3_JEXTSEL
bool "ADC3 external trigger for injected group"
depends on STM32F7_ADC3
default n
---help---
Enable JEXTSEL for ADC3.
endmenu # "ADC Configuration"
menu "Ethernet MAC configuration"

View File

@ -372,8 +372,10 @@
#define ADC_JSQR_JSQ3_MASK (0x1f << ADC_JSQR_JSQ3_SHIFT)
#define ADC_JSQR_JSQ4_SHIFT (15) /* Bits 19-15: 4th conversion in injected sequence */
#define ADC_JSQR_JSQ4_MASK (0x1f << ADC_JSQR_JSQ4_SHIFT)
#define ADC_JSQR_JSQ_SHIFT (5) /* Shift between JSQx bits */
#define ADC_JSQR_JL_SHIFT (20) /* Bits 21-20: Injected Sequence length */
#define ADC_JSQR_JL_MASK (3 << ADC_JSQR_JL_SHIFT)
# define ADC_JSQR_JL(n) (((n) - 1) << ADC_JSQR_JL_SHIFT) /* n=1..4 */
/* ADC injected data register 1-4 */

View File

@ -372,8 +372,10 @@
#define ADC_JSQR_JSQ3_MASK (0x1f << ADC_JSQR_JSQ3_SHIFT)
#define ADC_JSQR_JSQ4_SHIFT (15) /* Bits 19-15: 4th conversion in injected sequence */
#define ADC_JSQR_JSQ4_MASK (0x1f << ADC_JSQR_JSQ4_SHIFT)
#define ADC_JSQR_JSQ_SHIFT (5) /* Shift between JSQx bits */
#define ADC_JSQR_JL_SHIFT (20) /* Bits 21-20: Injected Sequence length */
#define ADC_JSQR_JL_MASK (3 << ADC_JSQR_JL_SHIFT)
# define ADC_JSQR_JL(n) (((n) - 1) << ADC_JSQR_JL_SHIFT) /* n=1..4 */
/* ADC injected data register 1-4 */

File diff suppressed because it is too large Load Diff

View File

@ -34,6 +34,25 @@
* Pre-processor Definitions
****************************************************************************/
/* Generalized definitions for ADC *****************************************/
#define STM32_ADC_DMAREG_OFFSET STM32_ADC_CR2_OFFSET
#define ADC_DMAREG_DMA ADC_CR2_DMA
#define STM32_ADC_EXTREG_OFFSET STM32_ADC_CR2_OFFSET
#define ADC_EXTREG_EXTSEL_MASK ADC_CR2_EXTSEL_MASK
#define ADC_EXTREG_EXTSEL_SHIFT ADC_CR2_EXTSEL_SHIFT
#define STM32_ADC_JEXTREG_OFFSET STM32_ADC_CR2_OFFSET
#define ADC_JEXTREG_JEXTSEL_MASK ADC_CR2_JEXTSEL_MASK
#define ADC_EXTREG_JEXTSEL_SHIFT ADC_CR2_JEXTSEL_SHIFT
#define STM32_ADC_ISR_OFFSET STM32_ADC_SR_OFFSET
#define STM32_ADC_IER_OFFSET STM32_ADC_CR1_OFFSET
#define ADC_EXTREG_EXTEN_MASK ADC_CR2_EXTEN_MASK
#define ADC_EXTREG_EXTEN_NONE ADC_CR2_EXTEN_NONE
#define ADC_EXTREG_EXTEN_DEFAULT ADC_CR2_EXTEN_RISING
#define ADC_JEXTREG_JEXTEN_MASK ADC_CR2_JEXTEN_MASK
#define ADC_JEXTREG_JEXTEN_NONE ADC_CR2_JEXTEN_NONE
#define ADC_JEXTREG_JEXTEN_DEFAULT ADC_CR2_JEXTEN_RISING
/* Configuration ************************************************************/
/* Timer devices may be used for different purposes. One special purpose is
@ -87,18 +106,6 @@
/* Up to 3 ADC interfaces are supported */
#if STM32F7_NADC < 3
# undef CONFIG_STM32F7_ADC3
#endif
#if STM32F7_NADC < 2
# undef CONFIG_STM32F7_ADC2
#endif
#if STM32F7_NADC < 1
# undef CONFIG_STM32F7_ADC1
#endif
#if defined(CONFIG_STM32F7_ADC1) || defined(CONFIG_STM32F7_ADC2) || \
defined(CONFIG_STM32F7_ADC3)
@ -128,6 +135,14 @@
# undef ADC3_HAVE_DMA
#endif
/* Injected channels support */
#if (defined(CONFIG_STM32F7_ADC1) && (CONFIG_STM32F7_ADC1_INJECTED_CHAN > 0)) || \
(defined(CONFIG_STM32F7_ADC2) && (CONFIG_STM32F7_ADC2_INJECTED_CHAN > 0)) || \
(defined(CONFIG_STM32F7_ADC3) && (CONFIG_STM32F7_ADC3_INJECTED_CHAN > 0))
# define ADC_HAVE_INJECTED
#endif
/* Timer configuration: If a timer trigger is specified, then get
* information about the timer.
*/
@ -175,35 +190,35 @@
#endif
#if defined(CONFIG_STM32F7_TIM1_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM1_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB2_TIM1_CLKIN
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM1_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB2_TIM1_CLKIN
#elif defined(CONFIG_STM32F7_TIM2_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM2_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM2_CLKIN
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM2_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM2_CLKIN
#elif defined(CONFIG_STM32F7_TIM3_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM3_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM3_CLKIN
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM3_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM3_CLKIN
#elif defined(CONFIG_STM32F7_TIM4_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM4_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM4_CLKIN
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM4_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM4_CLKIN
#elif defined(CONFIG_STM32F7_TIM5_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM5_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM5_CLKIN
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM5_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM5_CLKIN
#elif defined(CONFIG_STM32F7_TIM6_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM6_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM6_CLKIN
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM6_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM6_CLKIN
#elif defined(CONFIG_STM32F7_TIM8_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM8_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB2_TIM8_CLKIN
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM8_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB2_TIM8_CLKIN
#else
# undef ADC2_HAVE_TIMER
# undef ADC2_HAVE_TIMER
#endif
#ifdef ADC2_HAVE_TIMER
@ -217,35 +232,31 @@
#endif
#if defined(CONFIG_STM32F7_TIM1_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM1_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB2_TIM1_CLKIN
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM1_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB2_TIM1_CLKIN
#elif defined(CONFIG_STM32F7_TIM2_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM2_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM2_CLKIN
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM2_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM2_CLKIN
#elif defined(CONFIG_STM32F7_TIM3_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM3_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM3_CLKIN
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM3_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM3_CLKIN
#elif defined(CONFIG_STM32F7_TIM4_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM4_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM4_CLKIN
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM4_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM4_CLKIN
#elif defined(CONFIG_STM32F7_TIM5_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM5_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM5_CLKIN
#elif defined(CONFIG_STM32F7_TIM6_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM6_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM6_CLKIN
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM5_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM5_CLKIN
#elif defined(CONFIG_STM32F7_TIM8_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM8_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB2_TIM8_CLKIN
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM8_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB2_TIM8_CLKIN
#else
# undef ADC3_HAVE_TIMER
# undef ADC3_HAVE_TIMER
#endif
#ifdef ADC3_HAVE_TIMER
@ -390,7 +401,15 @@
#define ADC3_EXTSEL_T8CC3 ADC_CR2_EXTSEL_T8CC3
#define ADC3_EXTSEL_T8CC4 ADC_CR2_EXTSEL_T8CC4
#define ADC3_EXTSEL_T8TRGO ADC_CR2_EXTSEL_T8TRGO
#define ADC3_EXTSEL_T8TRGO2 ADC_CR2_EXTSEL_T8TRGO2
#define ADC3_EXTSEL_T8TRGO2 ADC_CR2_EXTSEL_T8TRGO2
/* EXTSEL configuration *****************************************************/
/* NOTE:
* this configuration if used only if CONFIG_STM32F7_TIMx_ADCy is selected.
* You can still connect the ADC with a timer trigger using the
* CONFIG_STM32F7_ADCx_EXTSEL option.
*/
#if defined(CONFIG_STM32F7_TIM1_ADC1)
# if CONFIG_STM32F7_ADC1_TIMTRIG == 0
@ -704,10 +723,288 @@
# endif
#endif
/* Regular channels external trigger support */
#ifdef ADC1_EXTSEL_VALUE
# define ADC1_HAVE_EXTCFG 1
# define ADC1_EXTCFG_VALUE (ADC1_EXTSEL_VALUE | ADC_EXTREG_EXTEN_DEFAULT)
#elif defined(CONFIG_STM32F7_ADC1_EXTSEL)
# define ADC1_HAVE_EXTCFG 1
# define ADC1_EXTCFG_VALUE 0
#else
# undef ADC1_HAVE_EXTCFG
#endif
#ifdef ADC2_EXTSEL_VALUE
# define ADC2_HAVE_EXTCFG 1
# define ADC2_EXTCFG_VALUE (ADC2_EXTSEL_VALUE | ADC_EXTREG_EXTEN_DEFAULT)
#elif defined(CONFIG_STM32F7_ADC2_EXTSEL)
# define ADC2_HAVE_EXTCFG 1
# define ADC2_EXTCFG_VALUE 0
#else
# undef ADC2_HAVE_EXTCFG
#endif
#ifdef ADC3_EXTSEL_VALUE
# define ADC3_HAVE_EXTCFG 1
# define ADC3_EXTCFG_VALUE (ADC3_EXTSEL_VALUE | ADC_EXTREG_EXTEN_DEFAULT)
#elif defined(CONFIG_STM32F7_ADC3_EXTSEL)
# define ADC3_HAVE_EXTCFG 1
# define ADC3_EXTCFG_VALUE 0
#else
# undef ADC3_HAVE_EXTCFG
#endif
#if defined(ADC1_HAVE_EXTCFG) || defined(ADC2_HAVE_EXTCFG) || \
defined(ADC3_HAVE_EXTCFG) || defined(ADC3_HAVE_EXTCFG)
# define ADC_HAVE_EXTCFG
#endif
/* JEXTSEL configuration ****************************************************/
/* There is no automatic timer tirgger configuration from Kconfig for
* injected channels conversion.
*/
/* Injected channels external trigger support */
#ifdef ADC1_JEXTSEL_VALUE
# define ADC1_HAVE_JEXTCFG 1
# define ADC1_JEXTCFG_VALUE (ADC1_JEXTSEL_VALUE | ADC_JEXTREG_JEXTEN_DEFAULT)
#elif defined(CONFIG_STM32F7_ADC1_JEXTSEL)
# define ADC1_HAVE_JEXTCFG 1
# define ADC1_JEXTCFG_VALUE 0
#else
# undef ADC1_HAVE_JEXTCFG
#endif
#ifdef ADC2_JEXTSEL_VALUE
# define ADC2_HAVE_JEXTCFG 1
# define ADC2_JEXTCFG_VALUE (ADC2_JEXTSEL_VALUE | ADC_JEXTREG_JEXTEN_DEFAULT)
#elif defined(CONFIG_STM32F7_ADC2_JEXTSEL)
# define ADC2_HAVE_JEXTCFG 1
# define ADC2_JEXTCFG_VALUE 0
#else
# undef ADC2_HAVE_JEXTCFG
#endif
#ifdef ADC3_JEXTSEL_VALUE
# define ADC3_HAVE_JEXTCFG 1
# define ADC3_JEXTCFG_VALUE (ADC3_JEXTSEL_VALUE | ADC_JEXTREG_JEXTEN_DEFAULT)
#elif defined(CONFIG_STM32F7_ADC3_JEXTSEL)
# define ADC3_HAVE_JEXTCFG 1
# define ADC3_JEXTCFG_VALUE 0
#else
# undef ADC3_HAVE_JEXTCFG
#endif
#if defined(ADC1_HAVE_JEXTCFG) || defined(ADC2_HAVE_JEXTCFG) || \
defined(ADC3_HAVE_JEXTCFG)
# define ADC_HAVE_JEXTCFG
#endif
/* ADC interrupts ***********************************************************/
#define ADC_ISR_EOC ADC_SR_EOC
#define ADC_IER_EOC ADC_CR1_EOCIE
#define ADC_ISR_AWD ADC_SR_AWD
#define ADC_IER_AWD ADC_CR1_AWDIE
#define ADC_ISR_JEOC ADC_SR_JEOC
#define ADC_IER_JEOC ADC_CR1_JEOCIE
#define ADC_ISR_JEOS 0 /* No JEOS */
#define ADC_IER_JEOS 0 /* No JEOS */
#define ADC_ISR_OVR ADC_SR_OVR
#define ADC_IER_OVR ADC_CR1_OVRIE
#define ADC_ISR_ALLINTS (ADC_ISR_EOC | ADC_ISR_AWD | ADC_ISR_JEOC | \
ADC_ISR_JEOS | ADC_ISR_OVR)
#define ADC_IER_ALLINTS (ADC_IER_EOC | ADC_IER_AWD | ADC_IER_JEOC | \
ADC_IER_JEOS | ADC_IER_OVR)
/* Low-level ops helpers ****************************************************/
#define STM32_ADC_INT_ACK(adc, source) \
(adc)->llops->int_ack(adc, source)
#define STM32_ADC_INT_GET(adc) \
(adc)->llops->int_get(adc)
#define STM32_ADC_INT_ENABLE(adc, source) \
(adc)->llops->int_en(adc, source)
#define STM32_ADC_INT_DISABLE(adc, source) \
(adc)->llops->int_dis(adc, source)
#define STM32_ADC_REGDATA_GET(adc) \
(adc)->llops->val_get(adc)
#define STM32_ADC_REGBUF_REGISTER(adc, buffer, len) \
(adc)->llops->regbuf_reg(adc, buffer, len)
#define STM32_ADC_REG_STARTCONV(adc, state) \
(adc)->llops->reg_startconv(adc, state)
#define STM32_ADC_OFFSET_SET(adc, ch, i, o) \
(adc)->llops->offset_set(adc, ch, i, o)
#define STM32_ADC_EXTCFG_SET(adc, c) \
(adc)->llops->extcfg_set(adc, c)
#define STM32_ADC_INJ_STARTCONV(adc, state) \
(adc)->llops->inj_startconv(adc, state)
#define STM32_ADC_INJDATA_GET(adc, chan) \
(adc)->llops->inj_get(adc, chan)
#define STM32_ADC_JEXTCFG_SET(adc, c) \
(adc)->llops->jextcfg_set(adc, c)
#define STM32_ADC_SAMPLETIME_SET(adc, time_samples) \
(adc)->llops->stime_set(adc, time_samples)
#define STM32_ADC_SAMPLETIME_WRITE(adc) \
(adc)->llops->stime_write(adc)
#define STM32_ADC_DUMP_REGS(adc) \
(adc)->llops->dump_regs(adc)
#define STM32_ADC_SETUP(adc) \
(adc)->llops->setup(adc)
#define STM32_ADC_SHUTDOWN(adc) \
(adc)->llops->shutdown(adc)
/****************************************************************************
* Public Types
****************************************************************************/
enum adc_io_cmds_e
{
IO_STOP_ADC,
IO_START_ADC,
IO_START_CONV,
IO_TRIGGER_REG,
#ifdef ADC_HAVE_INJECTED
IO_TRIGGER_INJ,
#endif
};
/* ADC resolution can be reduced in order to perform faster conversion */
enum stm32_adc_resoluton_e
{
ADC_RESOLUTION_12BIT = 0, /* 12 bit */
ADC_RESOLUTION_10BIT = 1, /* 10 bit */
ADC_RESOLUTION_8BIT = 2, /* 8 bit */
ADC_RESOLUTION_6BIT = 3 /* 6 bit */
};
#ifdef CONFIG_STM32F7_ADC_LL_OPS
#ifdef CONFIG_STM32F7_ADC_CHANGE_SAMPLETIME
/* Channel and sample time pair */
typedef struct adc_channel_s
{
uint8_t channel:5;
/* Sampling time individually for each channel */
uint8_t sample_time:3;
} adc_channel_t;
/* This structure will be used while setting channels to specified by the
* "channel-sample time" pairs' values
*/
struct adc_sample_time_s
{
adc_channel_t *channel; /* Array of channels */
uint8_t channels_nbr:5; /* Number of channels in array */
bool all_same:1; /* All channels will get the
* same value of the sample time */
uint8_t all_ch_sample_time:3; /* Sample time for all channels */
};
#endif /* CONFIG_STM32F7_ADC_CHANGE_SAMPLETIME */
/* This structure provides the publicly visible representation of the
* "lower-half" ADC driver structure.
*/
struct stm32_adc_dev_s
{
/* Publicly visible portion of the "lower-half" ADC driver structure */
const struct stm32_adc_ops_s *llops;
/* Require cast-compatibility with private "lower-half" ADC structure */
};
/* Low-level operations for ADC */
struct stm32_adc_ops_s
{
/* Low-level ADC setup */
int (*setup)(struct stm32_adc_dev_s *dev);
/* Low-level ADC shutdown */
void (*shutdown)(struct stm32_adc_dev_s *dev);
/* Acknowledge interrupts */
void (*int_ack)(struct stm32_adc_dev_s *dev, uint32_t source);
/* Get pending interrupts */
uint32_t (*int_get)(struct stm32_adc_dev_s *dev);
/* Enable interrupts */
void (*int_en)(struct stm32_adc_dev_s *dev, uint32_t source);
/* Disable interrupts */
void (*int_dis)(struct stm32_adc_dev_s *dev, uint32_t source);
/* Get current ADC data register */
uint32_t (*val_get)(struct stm32_adc_dev_s *dev);
/* Register buffer for ADC DMA transfer */
int (*regbuf_reg)(struct stm32_adc_dev_s *dev,
uint16_t *buffer, uint8_t len);
/* Start/stop regular conversion */
void (*reg_startconv)(struct stm32_adc_dev_s *dev, bool state);
/* Set offset for channel */
int (*offset_set)(struct stm32_adc_dev_s *dev, uint8_t ch, uint8_t i,
uint16_t offset);
#ifdef ADC_HAVE_EXTCFG
/* Configure the ADC external trigger for regular conversion */
void (*extcfg_set)(struct stm32_adc_dev_s *dev, uint32_t extcfg);
#endif
#ifdef ADC_HAVE_JEXTCFG
/* Configure the ADC external trigger for injected conversion */
void (*jextcfg_set)(struct stm32_adc_dev_s *dev, uint32_t jextcfg);
#endif
#ifdef ADC_HAVE_INJECTED
/* Get current ADC injected data register */
uint32_t (*inj_get)(struct stm32_adc_dev_s *dev, uint8_t chan);
/* Start/stop injected conversion */
void (*inj_startconv)(struct stm32_adc_dev_s *dev, bool state);
#endif
#ifdef CONFIG_STM32F7_ADC_CHANGE_SAMPLETIME
/* Set ADC sample time */
void (*stime_set)(struct stm32_adc_dev_s *dev,
struct adc_sample_time_s *time_samples);
/* Write ADC sample time */
void (*stime_write)(struct stm32_adc_dev_s *dev);
#endif
void (*dump_regs)(struct stm32_adc_dev_s *dev);
};
#endif /* CONFIG_STM32F7_ADC_LL_OPS */
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
@ -722,15 +1019,15 @@ extern "C"
#endif
/****************************************************************************
* Name: stm32_adc_initialiize
* Name: stm32_adc_initialize
*
* Description:
* Initialize the ADC.
* Initialize the ADC. See stm32_adc.c for more details.
*
* Input Parameters:
* intf - Could be {1,2,3} for ADC1, ADC2, or ADC3
* chanlist - The list of channels
* nchannels - Number of channels
* intf - Could be {1,2,3} for ADC1, ADC2, ADC3
* chanlist - The list of channels (regular + injected)
* nchannels - Number of channels (regular + injected)
*
* Returned Value:
* Valid ADC device structure reference on success; a NULL on failure
@ -741,6 +1038,7 @@ struct adc_dev_s;
struct adc_dev_s *stm32_adc_initialize(int intf,
const uint8_t *chanlist,
int nchannels);
#undef EXTERN
#ifdef __cplusplus
}