drivers: adc: stm32: Perform calibration if set in sequence
The calibration bit previously did nothing. Move calibration to allow call in start_read. Signed-off-by: Lasse Sangild <lsangild@gmail.com>
This commit is contained in:
parent
e4463a7d9e
commit
ec174d41b6
1 changed files with 42 additions and 29 deletions
|
@ -277,6 +277,35 @@ static void adc_stm32_start_conversion(const struct device *dev)
|
|||
#endif
|
||||
}
|
||||
|
||||
#if !defined(CONFIG_SOC_SERIES_STM32F2X) && \
|
||||
!defined(CONFIG_SOC_SERIES_STM32F4X) && \
|
||||
!defined(CONFIG_SOC_SERIES_STM32F7X) && \
|
||||
!defined(CONFIG_SOC_SERIES_STM32F1X) && \
|
||||
!defined(CONFIG_SOC_SERIES_STM32L1X)
|
||||
static void adc_stm32_calib(const struct device *dev)
|
||||
{
|
||||
const struct adc_stm32_cfg *config =
|
||||
(const struct adc_stm32_cfg *)dev->config;
|
||||
ADC_TypeDef *adc = config->base;
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32F3X) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32L4X) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32WBX) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32G4X)
|
||||
LL_ADC_StartCalibration(adc, LL_ADC_SINGLE_ENDED);
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32F0X) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32G0X) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32L0X) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32WLX)
|
||||
LL_ADC_StartCalibration(adc);
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
LL_ADC_StartCalibration(adc, LL_ADC_CALIB_OFFSET, LL_ADC_SINGLE_ENDED);
|
||||
#endif
|
||||
while (LL_ADC_IsCalibrationOnGoing(adc)) {
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int start_read(const struct device *dev,
|
||||
const struct adc_sequence *sequence)
|
||||
{
|
||||
|
@ -384,6 +413,19 @@ static int start_read(const struct device *dev,
|
|||
LL_ADC_SetResolution(adc, resolution);
|
||||
#endif
|
||||
|
||||
if (sequence->calibrate) {
|
||||
#if !defined(CONFIG_SOC_SERIES_STM32F2X) && \
|
||||
!defined(CONFIG_SOC_SERIES_STM32F4X) && \
|
||||
!defined(CONFIG_SOC_SERIES_STM32F7X) && \
|
||||
!defined(CONFIG_SOC_SERIES_STM32F1X) && \
|
||||
!defined(CONFIG_SOC_SERIES_STM32L1X)
|
||||
adc_stm32_calib(dev);
|
||||
#else
|
||||
LOG_ERR("Calibration not supported");
|
||||
return -ENOTSUP;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32F0X) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32F3X) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32L0X) || \
|
||||
|
@ -585,35 +627,6 @@ static int adc_stm32_channel_setup(const struct device *dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if !defined(CONFIG_SOC_SERIES_STM32F2X) && \
|
||||
!defined(CONFIG_SOC_SERIES_STM32F4X) && \
|
||||
!defined(CONFIG_SOC_SERIES_STM32F7X) && \
|
||||
!defined(CONFIG_SOC_SERIES_STM32F1X) && \
|
||||
!defined(CONFIG_SOC_SERIES_STM32L1X)
|
||||
static void adc_stm32_calib(const struct device *dev)
|
||||
{
|
||||
const struct adc_stm32_cfg *config =
|
||||
(const struct adc_stm32_cfg *)dev->config;
|
||||
ADC_TypeDef *adc = config->base;
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_STM32F3X) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32L4X) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32WBX) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32G4X)
|
||||
LL_ADC_StartCalibration(adc, LL_ADC_SINGLE_ENDED);
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32F0X) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32G0X) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32L0X) || \
|
||||
defined(CONFIG_SOC_SERIES_STM32WLX)
|
||||
LL_ADC_StartCalibration(adc);
|
||||
#elif defined(CONFIG_SOC_SERIES_STM32H7X)
|
||||
LL_ADC_StartCalibration(adc, LL_ADC_CALIB_OFFSET, LL_ADC_SINGLE_ENDED);
|
||||
#endif
|
||||
while (LL_ADC_IsCalibrationOnGoing(adc)) {
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int adc_stm32_init(const struct device *dev)
|
||||
{
|
||||
struct adc_stm32_data *data = dev->data;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue