diff options
| author | Wooohaaa <[email protected]> | 2026-11-09 09:29:17 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-11-09 09:29:17 +0800 |
| commit | b3a0eb5e12c6dca8145fc49d76c4785478c9e55b (patch) | |
| tree | 1fe1441f1d9f9d42f5a806fcc9fdb0776f255775 | |
| parent | adbf7de5d1813f7201dfcd69d7955eb017117277 (diff) | |
[bsp][bouffalo] Validate ADC DMA sample channels (#12003)
* fix(bouffalo): validate ADC DMA channel indexes
* fix(bouffalo): validate configured ADC channels
* fix(bouffalo): keep ADC channel validation warning-free
| -rw-r--r-- | bsp/bouffalo_lab/libraries/rt_drivers/drv_adc.c | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/bsp/bouffalo_lab/libraries/rt_drivers/drv_adc.c b/bsp/bouffalo_lab/libraries/rt_drivers/drv_adc.c index c9b5db6d4f..9922b31c2a 100644 --- a/bsp/bouffalo_lab/libraries/rt_drivers/drv_adc.c +++ b/bsp/bouffalo_lab/libraries/rt_drivers/drv_adc.c @@ -23,7 +23,9 @@ #endif static struct bflb_dma_channel_lli_pool_s lli[1]; -static volatile uint32_t raw_data[16 + 10]; +#define BL_ADC_DMA_CHANNEL_OFFSET (10U) +#define BL_ADC_DMA_CHANNEL_COUNT (16U) +static volatile uint32_t raw_data[BL_ADC_DMA_CHANNEL_COUNT + BL_ADC_DMA_CHANNEL_OFFSET]; static struct bflb_adc_result_s adc_value[10]; static struct bflb_adc_config_s adc_config = @@ -110,6 +112,38 @@ static struct _adc_channel_cfg chan[] = { #endif }; +static rt_bool_t bl_adc_channel_is_valid(rt_int8_t channel) +{ + if (channel < 0) + { + return RT_FALSE; + } + + if ((rt_size_t)channel >= BL_ADC_DMA_CHANNEL_COUNT) + { + return RT_FALSE; + } + +#if defined(BSP_USING_ADC_CH0) || defined(BSP_USING_ADC_CH1) || \ + defined(BSP_USING_ADC_CH2) || defined(BSP_USING_ADC_CH3) || \ + defined(BSP_USING_ADC_CH4) || defined(BSP_USING_ADC_CH5) || \ + defined(BSP_USING_ADC_CH6) || defined(BSP_USING_ADC_CH7) || \ + defined(BSP_USING_ADC_CH8) || defined(BSP_USING_ADC_CH9) || \ + defined(BSP_USING_ADC_CH10) + rt_size_t i; + + for (i = 0; i < sizeof(chan) / sizeof(chan[0]); i++) + { + if (chan[i].chan.pos_chan == (rt_uint8_t)channel) + { + return RT_TRUE; + } + } +#endif + + return RT_FALSE; +} + static void bl_adc_pin_init(void) { struct bflb_device_s *gpio; @@ -127,6 +161,11 @@ static rt_err_t bl_adc_enabled(struct rt_adc_device *device, rt_int8_t channel, struct bl_adc *_adc; struct bflb_dma_channel_lli_transfer_s transfers[1]; _adc = (struct bl_adc *)device->parent.user_data; + if (!bl_adc_channel_is_valid(channel)) + { + return -RT_EINVAL; + } + struct bflb_adc_channel_s chan; chan.pos_chan = channel; chan.neg_chan = ADC_CHANNEL_GND; @@ -155,15 +194,22 @@ static rt_err_t bl_adc_enabled(struct rt_adc_device *device, rt_int8_t channel, static rt_err_t bl_adc_get_value(struct rt_adc_device *device, rt_int8_t channel, rt_uint32_t *value) { struct bl_adc *_adc; + rt_size_t sample_index; RT_ASSERT(device != RT_NULL); RT_ASSERT(value != RT_NULL); + if (!bl_adc_channel_is_valid(channel)) + { + return -RT_EINVAL; + } + _adc = device->parent.user_data; + sample_index = BL_ADC_DMA_CHANNEL_OFFSET + (rt_size_t)channel; rt_sem_take(_adc->sem, RT_WAITING_FOREVER); /* get ADC value */ - *value = (rt_uint32_t)raw_data[10 + channel]; + *value = (rt_uint32_t)raw_data[sample_index]; return RT_EOK; } |
