From 56dca947fe8df47310b1d25c2dfceb4e5cb9e550 Mon Sep 17 00:00:00 2001 From: jzlv Date: Mon, 26 Jul 2021 10:43:17 +0800 Subject: [PATCH] [feat][adc] add adc irq function --- drivers/bl702_driver/hal_drv/inc/hal_adc.h | 11 ++++- drivers/bl702_driver/hal_drv/src/hal_adc.c | 55 +++++++++++++++++++--- 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/drivers/bl702_driver/hal_drv/inc/hal_adc.h b/drivers/bl702_driver/hal_drv/inc/hal_adc.h index 9f806e17..0a49fade 100644 --- a/drivers/bl702_driver/hal_drv/inc/hal_adc.h +++ b/drivers/bl702_driver/hal_drv/inc/hal_adc.h @@ -41,12 +41,21 @@ enum adc_index_type { ADC_MAX_INDEX }; -enum ADC_event_type { +enum adc_event_type { ADC_EVENT_FIFO_READY, ADC_EVENT_OVERRUN, ADC_EVENT_UNDERRUN, ADC_EVEN_INT_POS_SATURATION, ADC_EVEN_INT_NEG_SATURATION, + ADC_EVEN_MAX, +}; + +enum adc_it_type { + ADC_EVENT_FIFO_READY_IT = 1 << 0, + ADC_EVENT_OVERRUN_IT = 1 << 1, + ADC_EVENT_UNDERRUN_IT = 1 << 2, + ADC_EVEN_INT_POS_SATURATION_IT = 1 << 3, + ADC_EVEN_INT_NEG_SATURATION_IT = 1 << 4, }; #define adc_channel_start(dev) device_control(dev, DEVICE_CTRL_ADC_CHANNEL_START, NULL) diff --git a/drivers/bl702_driver/hal_drv/src/hal_adc.c b/drivers/bl702_driver/hal_drv/src/hal_adc.c index 528947d0..0453da49 100644 --- a/drivers/bl702_driver/hal_drv/src/hal_adc.c +++ b/drivers/bl702_driver/hal_drv/src/hal_adc.c @@ -28,6 +28,10 @@ #include "bl702_adc.h" #include "adc_config.h" +#ifdef BSP_USING_ADC0 +static void ADC_IRQ(void); +#endif + static adc_device_t adcx_device[ADC_MAX_INDEX] = { #ifdef BSP_USING_ADC0 ADC0_CONFIG, @@ -119,6 +123,10 @@ int adc_open(struct device *dev, uint16_t oflag) adc_fifo_cfg.fifoThreshold = adc_device->fifo_threshold; +#ifdef BSP_USING_ADC0 + Interrupt_Handler_Register(GPADC_DMA_IRQn, ADC_IRQ); +#endif + ADC_Disable(); ADC_Enable(); @@ -155,13 +163,48 @@ int adc_control(struct device *dev, int cmd, void *args) adc_device_t *adc_device = (adc_device_t *)dev; adc_channel_cfg_t *adc_channel_cfg = (adc_channel_cfg_t *)args; uint8_t rlt = 0; + uint32_t mask = 0; switch (cmd) { case DEVICE_CTRL_SET_INT /* constant-expression */: + mask = (uint32_t)args; + if (mask & ADC_EVENT_FIFO_READY_IT) { + ADC_IntMask(ADC_EVENT_FIFO_READY, UNMASK); + } + if (mask & ADC_EVENT_OVERRUN_IT) { + ADC_IntMask(ADC_EVENT_OVERRUN, UNMASK); + } + if (mask & ADC_EVENT_UNDERRUN_IT) { + ADC_IntMask(ADC_EVENT_UNDERRUN, UNMASK); + } + if (mask & ADC_EVEN_INT_POS_SATURATION_IT) { + ADC_IntMask(ADC_EVEN_INT_POS_SATURATION, UNMASK); + } + if (mask & ADC_EVEN_INT_NEG_SATURATION_IT) { + ADC_IntMask(ADC_EVEN_INT_NEG_SATURATION, UNMASK); + } + NVIC_EnableIRQ(GPADC_DMA_IRQn); break; case DEVICE_CTRL_CLR_INT /* constant-expression */: + mask = (uint32_t)args; + + if (mask & ADC_EVENT_FIFO_READY_IT) { + ADC_IntMask(ADC_EVENT_FIFO_READY, MASK); + } + if (mask & ADC_EVENT_OVERRUN_IT) { + ADC_IntMask(ADC_EVENT_OVERRUN, MASK); + } + if (mask & ADC_EVENT_UNDERRUN_IT) { + ADC_IntMask(ADC_EVENT_UNDERRUN, MASK); + } + if (mask & ADC_EVEN_INT_POS_SATURATION_IT) { + ADC_IntMask(ADC_EVEN_INT_POS_SATURATION, MASK); + } + if (mask & ADC_EVEN_INT_NEG_SATURATION_IT) { + ADC_IntMask(ADC_EVEN_INT_NEG_SATURATION, MASK); + } break; @@ -232,7 +275,7 @@ int adc_control(struct device *dev, int cmd, void *args) */ int adc_read(struct device *dev, uint32_t pos, void *buffer, uint32_t size) { - if (dev->oflag & DEVICE_OFLAG_STREAM_RX) { + if (dev->oflag & DEVICE_OFLAG_STREAM_RX || dev->oflag & DEVICE_OFLAG_INT_RX) { while (ADC_Get_FIFO_Count() == 0) ; @@ -302,28 +345,28 @@ void adc_isr(adc_device_t *handle) return; if (ADC_GetIntStatus(ADC_INT_POS_SATURATION) == SET && ADC_IntGetMask(ADC_INT_POS_SATURATION) == UNMASK) { + handle->parent.callback(&handle->parent, NULL, 0, ADC_EVEN_INT_POS_SATURATION); ADC_IntClr(ADC_INT_POS_SATURATION); - handle->parent.callback(&handle->parent, NULL, 0, ADC_INT_POS_SATURATION); } if (ADC_GetIntStatus(ADC_INT_NEG_SATURATION) == SET && ADC_IntGetMask(ADC_INT_NEG_SATURATION) == UNMASK) { + handle->parent.callback(&handle->parent, NULL, 0, ADC_EVEN_INT_NEG_SATURATION); ADC_IntClr(ADC_INT_NEG_SATURATION); - handle->parent.callback(&handle->parent, NULL, 0, ADC_INT_NEG_SATURATION); } if (ADC_GetIntStatus(ADC_INT_FIFO_UNDERRUN) == SET && ADC_IntGetMask(ADC_INT_FIFO_UNDERRUN) == UNMASK) { + handle->parent.callback(&handle->parent, NULL, 0, ADC_EVENT_UNDERRUN); ADC_IntClr(ADC_INT_FIFO_UNDERRUN); - handle->parent.callback(&handle->parent, NULL, 0, ADC_INT_FIFO_UNDERRUN); } if (ADC_GetIntStatus(ADC_INT_FIFO_OVERRUN) == SET && ADC_IntGetMask(ADC_INT_FIFO_OVERRUN) == UNMASK) { + handle->parent.callback(&handle->parent, NULL, 0, ADC_EVENT_OVERRUN); ADC_IntClr(ADC_INT_FIFO_OVERRUN); - handle->parent.callback(&handle->parent, NULL, 0, ADC_INT_FIFO_OVERRUN); } if (ADC_GetIntStatus(ADC_INT_FIFO_READY) == SET && ADC_IntGetMask(ADC_INT_FIFO_READY) == UNMASK) { + handle->parent.callback(&handle->parent, NULL, 0, ADC_EVENT_FIFO_READY); ADC_IntClr(ADC_INT_FIFO_READY); - handle->parent.callback(&handle->parent, NULL, 0, ADC_INT_FIFO_READY); } } #ifdef BSP_USING_ADC0