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;