MYNEWT-391 STM32F4 ADC driver and ADC HAL support - More cleanup - Removing asserts from config functions - Checking failure of gpio init function instead of asserting
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/5d11ead1 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/5d11ead1 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/5d11ead1 Branch: refs/heads/sterly_refactor Commit: 5d11ead1aaf3e32c14316d8dfc230ce448e26f20 Parents: 01fb015 Author: Vipul Rahane <vi...@runtime.io> Authored: Thu Sep 22 20:19:18 2016 -0700 Committer: Vipul Rahane <vi...@runtime.io> Committed: Thu Sep 22 20:21:03 2016 -0700 ---------------------------------------------------------------------- drivers/adc/adc_stm32f4/pkg.yml | 3 +- drivers/adc/adc_stm32f4/src/adc_stm32f4.c | 80 +++++++++++++++----------- drivers/adc/include/adc/adc.h | 1 - 3 files changed, 47 insertions(+), 37 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5d11ead1/drivers/adc/adc_stm32f4/pkg.yml ---------------------------------------------------------------------- diff --git a/drivers/adc/adc_stm32f4/pkg.yml b/drivers/adc/adc_stm32f4/pkg.yml index bb24fd7..25a2c71 100644 --- a/drivers/adc/adc_stm32f4/pkg.yml +++ b/drivers/adc/adc_stm32f4/pkg.yml @@ -26,8 +26,9 @@ pkg.features: - ADC_STM32F4 pkg.apis: - ADC_HW_IMPL +pkg.deps: + - drivers/adc pkg.deps.TEST: - hw/hal - hw/mcu/stm/stm32f4xx - - drivers/adc - libs/testutil http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5d11ead1/drivers/adc/adc_stm32f4/src/adc_stm32f4.c ---------------------------------------------------------------------- diff --git a/drivers/adc/adc_stm32f4/src/adc_stm32f4.c b/drivers/adc/adc_stm32f4/src/adc_stm32f4.c index 480464a..a2edfa8 100644 --- a/drivers/adc/adc_stm32f4/src/adc_stm32f4.c +++ b/drivers/adc/adc_stm32f4/src/adc_stm32f4.c @@ -19,7 +19,6 @@ #include <hal/hal_bsp.h> -#include <adc/adc.h> #include <assert.h> #include <os/os.h> #include <bsp/cmsis_nvic.h> @@ -31,6 +30,11 @@ #include "adc_stm32f4/adc_stm32f4.h" #include "stm32f4xx_hal_dma.h" #include "mcu/stm32f4xx_mynewt_hal.h" +#include "syscfg/syscfg.h" + +#if MYNEWT_VAL(ADC_1)||MYNEWT_VAL(ADC_2)||MYNEWT_VAL(ADC_3) +#include <adc/adc.h> +#endif #define STM32F4_IS_DMA_ADC_CHANNEL(CHANNEL) ((CHANNEL) <= DMA_CHANNEL_2) @@ -88,13 +92,14 @@ stm32f4_adc_clk_disable(ADC_HandleTypeDef *hadc) { } } -static GPIO_InitTypeDef -stm32f4_resolve_adc_gpio(ADC_HandleTypeDef *adc, uint8_t cnum) +static int +stm32f4_resolve_adc_gpio(ADC_HandleTypeDef *adc, uint8_t cnum, GPIO_InitTypeDef *gpio) { uintptr_t adc_addr = (uintptr_t)adc->Instance; uint32_t pin; - GPIO_InitTypeDef gpio_td; + int rc; + rc = OS_OK; switch (adc_addr) { case (uintptr_t)ADC1: case (uintptr_t)ADC2: @@ -180,16 +185,17 @@ stm32f4_resolve_adc_gpio(ADC_HandleTypeDef *adc, uint8_t cnum) goto done; } default: - assert(0); + rc = OS_EINVAL; + return rc; } done: - gpio_td = (GPIO_InitTypeDef){ + *gpio = (GPIO_InitTypeDef) { .Pin = pin, .Mode = GPIO_MODE_ANALOG, .Pull = GPIO_NOPULL, .Alternate = pin }; - return gpio_td; + return rc; } static IRQn_Type @@ -311,7 +317,7 @@ HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) ++stm32f4_adc_stats.adc_dma_xfer_complete; adc = adc_dma[stm32f4_resolve_dma_handle_idx(hdma)]; - cfg = adc->ad_dev_cfg; + cfg = (struct stm32f4_adc_dev_cfg *)adc->ad_dev.od_init_arg; buf = cfg->primarybuf; /** @@ -364,26 +370,18 @@ stm32f4_adc_dma_init(ADC_HandleTypeDef* hadc) } static void -stm32f4_adc_init(void *arg) +stm32f4_adc_init(struct adc_dev *dev) { - struct adc_dev *dev; struct stm32f4_adc_dev_cfg *adc_config; ADC_HandleTypeDef *hadc; - GPIO_InitTypeDef gpio_td; - uint8_t cnum; - assert(arg); + assert(dev); - dev = (struct adc_dev *)arg; - adc_config = (struct stm32f4_adc_dev_cfg *)dev->ad_dev_cfg; + adc_config = (struct stm32f4_adc_dev_cfg *)dev->ad_dev.od_init_arg; hadc = adc_config->sac_adc_handle; - cnum = dev->ad_chans->c_cnum; stm32f4_adc_dma_init(hadc); - gpio_td = stm32f4_resolve_adc_gpio(hadc, cnum); - hal_gpio_init_stm(gpio_td.Pin, &gpio_td); - if (HAL_ADC_Init(hadc) != HAL_OK) { assert(0); } @@ -399,17 +397,11 @@ stm32f4_adc_uninit(struct adc_dev *dev) uint8_t cnum; assert(dev); - cfg = dev->ad_dev_cfg; + cfg = (struct stm32f4_adc_dev_cfg *)dev->ad_dev.od_init_arg; hadc = cfg->sac_adc_handle; hdma = hadc->DMA_Handle; cnum = dev->ad_chans->c_cnum; - gpio_td = stm32f4_resolve_adc_gpio(hadc, cnum); - - if(hal_gpio_deinit_stm(gpio_td.Pin, &gpio_td)) { - assert(0); - } - __HAL_RCC_DMA2_CLK_DISABLE(); if (HAL_DMA_DeInit(hdma) != HAL_OK) { assert(0); @@ -417,6 +409,17 @@ stm32f4_adc_uninit(struct adc_dev *dev) stm32f4_adc_clk_disable(hadc); NVIC_DisableIRQ(stm32f4_resolve_adc_dma_irq(hdma)); + + if (stm32f4_resolve_adc_gpio(hadc, cnum, &gpio_td)) { + goto err; + } + + if(hal_gpio_deinit_stm(gpio_td.Pin, &gpio_td)) { + goto err; + } + +err: + return; } /** @@ -460,7 +463,7 @@ stm32f4_adc_open(struct os_dev *odev, uint32_t wait, void *arg) stm32f4_adc_init(dev); - cfg = dev->ad_dev_cfg; + cfg = (struct stm32f4_adc_dev_cfg *)dev->ad_dev.od_init_arg; hadc = cfg->sac_adc_handle; hdma = hadc->DMA_Handle; @@ -513,14 +516,15 @@ stm32f4_adc_configure_channel(struct adc_dev *dev, uint8_t cnum, ADC_HandleTypeDef *hadc; struct stm32f4_adc_dev_cfg *cfg; struct adc_chan_config *chan_cfg; + GPIO_InitTypeDef gpio_td; rc = OS_EINVAL; - if (dev != NULL && IS_ADC_CHANNEL(cnum)) { + if (dev == NULL && !IS_ADC_CHANNEL(cnum)) { goto err; } - cfg = dev->ad_dev_cfg; + cfg = (struct stm32f4_adc_dev_cfg *)dev->ad_dev.od_init_arg; hadc = cfg->sac_adc_handle; chan_cfg = cfg->sac_chans; @@ -533,6 +537,13 @@ stm32f4_adc_configure_channel(struct adc_dev *dev, uint8_t cnum, dev->ad_chans[cnum].c_res = chan_cfg->c_res; dev->ad_chans[cnum].c_refmv = chan_cfg->c_refmv; dev->ad_chans[cnum].c_configured = 1; + dev->ad_chans[cnum].c_cnum = cnum; + + if (stm32f4_resolve_adc_gpio(hadc, cnum, &gpio_td)) { + goto err; + } + + hal_gpio_init_stm(gpio_td.Pin, &gpio_td); #if 0 if (HAL_ADC_Start_IT(hadc) != HAL_OK) { @@ -562,9 +573,9 @@ stm32f4_adc_set_buffer(struct adc_dev *dev, void *buf1, void *buf2, assert(dev != NULL && buf1 != NULL); rc = OS_OK; - buflen /= sizeof(uint16_t); + buflen /= sizeof(uint32_t); - cfg = dev->ad_dev_cfg; + cfg = (struct stm32f4_adc_dev_cfg *)dev->ad_dev.od_init_arg; cfg->primarybuf = buf1; cfg->secondarybuf = buf2; @@ -580,7 +591,7 @@ stm32f4_adc_release_buffer(struct adc_dev *dev, void *buf, int buf_len) struct stm32f4_adc_dev_cfg *cfg; assert(dev); - cfg = dev->ad_dev_cfg; + cfg = (struct stm32f4_adc_dev_cfg *)dev->ad_dev.od_init_arg; hadc = cfg->sac_adc_handle; HAL_ADC_Stop_DMA(hadc); @@ -602,7 +613,7 @@ stm32f4_adc_sample(struct adc_dev *dev) struct stm32f4_adc_dev_cfg *cfg; assert(dev); - cfg = dev->ad_dev_cfg; + cfg = (struct stm32f4_adc_dev_cfg *)dev->ad_dev.od_init_arg; hadc = cfg->sac_adc_handle; rc = OS_EINVAL; @@ -632,7 +643,7 @@ stm32f4_adc_read_channel(struct adc_dev *dev, uint8_t cnum, int *result) struct stm32f4_adc_dev_cfg *cfg; assert(dev != NULL && result != NULL); - cfg = dev->ad_dev_cfg; + cfg = (struct stm32f4_adc_dev_cfg *)dev->ad_dev.od_init_arg; hadc = cfg->sac_adc_handle; *result = HAL_ADC_GetValue(hadc); @@ -708,7 +719,6 @@ stm32f4_adc_dev_init(struct os_dev *odev, void *arg) OS_DEV_SETHANDLERS(odev, stm32f4_adc_open, stm32f4_adc_close); af = &dev->ad_funcs; - dev->ad_dev_cfg = arg; af->af_configure_channel = stm32f4_adc_configure_channel; af->af_sample = stm32f4_adc_sample; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5d11ead1/drivers/adc/include/adc/adc.h ---------------------------------------------------------------------- diff --git a/drivers/adc/include/adc/adc.h b/drivers/adc/include/adc/adc.h index 60df1ad..2ffb6cd 100644 --- a/drivers/adc/include/adc/adc.h +++ b/drivers/adc/include/adc/adc.h @@ -154,7 +154,6 @@ struct adc_dev { struct os_mutex ad_lock; struct adc_driver_funcs ad_funcs; struct adc_chan_config *ad_chans; - void *ad_dev_cfg; int ad_chan_count; adc_event_handler_func_t ad_event_handler_func; void *ad_event_handler_arg;