You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2016/09/27 22:36:23 UTC

[07/10] incubator-mynewt-core git commit: MYNEWT-391 STM32F4 ADC driver and ADC HAL support

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/bebcf110
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/bebcf110
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/bebcf110

Branch: refs/heads/develop
Commit: bebcf110db30a5b87b997493730f8842839b80c3
Parents: bc6437c
Author: Vipul Rahane <vi...@runtime.io>
Authored: Thu Sep 22 20:19:18 2016 -0700
Committer: Vipul Rahane <vi...@runtime.io>
Committed: Tue Sep 27 13:34:07 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/bebcf110/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/bebcf110/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/bebcf110/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;