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:17 UTC
[01/10] incubator-mynewt-core git commit: MYNEWT-391 STM32F4 ADC
driver and ADC HAL support
Repository: incubator-mynewt-core
Updated Branches:
refs/heads/develop 896970925 -> 201dfeb86
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
- Completing incomplete comment
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/2ee660fe
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/2ee660fe
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/2ee660fe
Branch: refs/heads/develop
Commit: 2ee660fea5a17e45ca27cbfee14d4f786849cdc7
Parents: adec81c
Author: Vipul Rahane <vi...@runtime.io>
Authored: Tue Sep 27 13:32:42 2016 -0700
Committer: Vipul Rahane <vi...@runtime.io>
Committed: Tue Sep 27 13:34:07 2016 -0700
----------------------------------------------------------------------
drivers/adc/adc_stm32f4/src/adc_stm32f4.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/2ee660fe/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 77526c0..fba9dd2 100644
--- a/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
+++ b/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
@@ -673,7 +673,9 @@ stm32f4_adc_read_buffer(struct adc_dev *dev, void *buf, int buf_len, int off,
* Callback to return size of buffer
*
* @param1 ADC device ptr
- * @param2
+ * @param2 Total number of channels
+ * @param3 Total number of samples
+ * @return Length of buffer in bytes
*/
static int
stm32f4_adc_size_buffer(struct adc_dev *dev, int chans, int samples)
[10/10] incubator-mynewt-core git commit: This closes #107. Merge
remote-tracking branch 'vrahane/stm_adc' into develop
Posted by cc...@apache.org.
This closes #107.
Merge remote-tracking branch 'vrahane/stm_adc' into develop
* vrahane/stm_adc:
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
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/201dfeb8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/201dfeb8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/201dfeb8
Branch: refs/heads/develop
Commit: 201dfeb8610c69d60a06e8052fe51fa6cb7c5fb4
Parents: 8969709 2ee660f
Author: Christopher Collins <cc...@apache.org>
Authored: Tue Sep 27 15:35:46 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Tue Sep 27 15:35:46 2016 -0700
----------------------------------------------------------------------
apps/sblinky/pkg.yml | 4 -
apps/sblinky/src/main.c | 186 ++++-
.../include/adc_stm32f4/adc_stm32f4.h | 62 ++
drivers/adc/adc_stm32f4/pkg.yml | 34 +
drivers/adc/adc_stm32f4/src/adc_stm32f4.c | 735 +++++++++++++++++++
drivers/adc/include/adc/adc.h | 1 +
drivers/adc/pkg.yml | 2 +-
.../olimex_stm32-e407_devboard.ld | 2 +-
hw/bsp/olimex_stm32-e407_devboard/pkg.yml | 31 +-
hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c | 228 ++++++
.../include/mcu/stm32f4xx_mynewt_hal.h | 1 +
hw/mcu/stm/stm32f4xx/pkg.yml | 2 +-
hw/mcu/stm/stm32f4xx/src/hal_gpio.c | 33 +-
hw/mcu/stm/stm32f4xx/src/hal_spi.c | 4 +-
14 files changed, 1260 insertions(+), 65 deletions(-)
----------------------------------------------------------------------
[02/10] incubator-mynewt-core git commit: MYNEWT-391 STM32F4 ADC
driver and ADC HAL support
Posted by cc...@apache.org.
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
- Correcting ADC config
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/adec81c0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/adec81c0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/adec81c0
Branch: refs/heads/develop
Commit: adec81c046ce85b340a6696b40eb6d5414d1e942
Parents: bebcf11
Author: Vipul Rahane <vi...@runtime.io>
Authored: Fri Sep 23 15:53:38 2016 -0700
Committer: Vipul Rahane <vi...@runtime.io>
Committed: Tue Sep 27 13:34:07 2016 -0700
----------------------------------------------------------------------
drivers/adc/adc_stm32f4/src/adc_stm32f4.c | 2 +-
hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c | 32 ++++++++++-----------
2 files changed, 17 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/adec81c0/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 a2edfa8..77526c0 100644
--- a/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
+++ b/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
@@ -526,7 +526,7 @@ stm32f4_adc_configure_channel(struct adc_dev *dev, uint8_t cnum,
cfg = (struct stm32f4_adc_dev_cfg *)dev->ad_dev.od_init_arg;
hadc = cfg->sac_adc_handle;
- chan_cfg = cfg->sac_chans;
+ chan_cfg = &((struct adc_chan_config *)cfg->sac_chans)[cnum];
cfgdata = (ADC_ChannelConfTypeDef *)cfgdata;
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/adec81c0/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c b/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c
index 3edb114..67d3d50 100644
--- a/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c
+++ b/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c
@@ -88,10 +88,10 @@ extern struct stm32f4_uart_cfg *bsp_uart_config(int port);
* adc_handle is defined earlier because the DMA handle's
* parent needs to be pointing to the adc_handle
*/
-ADC_HandleTypeDef adc1_handle;
+extern ADC_HandleTypeDef adc1_handle;
-#define STM32F4_DEFAULT_DMA40_HANDLE {\
- .Instance = DMA2_Stream4,\
+#define STM32F4_DEFAULT_DMA00_HANDLE {\
+ .Instance = DMA2_Stream0,\
.Init.Channel = DMA_CHANNEL_0,\
.Init.Direction = DMA_PERIPH_TO_MEMORY,\
.Init.PeriphInc = DMA_PINC_DISABLE,\
@@ -107,12 +107,12 @@ ADC_HandleTypeDef adc1_handle;
.Parent = &adc1_handle,\
}
-DMA_HandleTypeDef adc1_dma40_handle = STM32F4_DEFAULT_DMA40_HANDLE;
+DMA_HandleTypeDef adc1_dma00_handle = STM32F4_DEFAULT_DMA00_HANDLE;
#endif
#if MYNEWT_VAL(ADC_2)
-ADC_HandleTypeDef adc2_handle;
+extern ADC_HandleTypeDef adc2_handle;
#define STM32F4_DEFAULT_DMA21_HANDLE {\
.Instance = DMA2_Stream2,\
@@ -137,10 +137,10 @@ DMA_HandleTypeDef adc2_dma21_handle = STM32F4_DEFAULT_DMA21_HANDLE;
#if MYNEWT_VAL(ADC_3)
-ADC_HandleTypeDef adc3_handle;
+extern ADC_HandleTypeDef adc3_handle;
-#define STM32F4_DEFAULT_DMA02_HANDLE {\
- .Instance = DMA2_Stream0,\
+#define STM32F4_DEFAULT_DMA12_HANDLE {\
+ .Instance = DMA2_Stream1,\
.Init.Channel = DMA_CHANNEL_2,\
.Init.Direction = DMA_PERIPH_TO_MEMORY,\
.Init.PeriphInc = DMA_PINC_DISABLE,\
@@ -156,7 +156,7 @@ ADC_HandleTypeDef adc3_handle;
.Parent = &adc3_handle,\
}
-DMA_HandleTypeDef adc3_dma02_handle = STM32F4_DEFAULT_DMA02_HANDLE;
+DMA_HandleTypeDef adc3_dma12_handle = STM32F4_DEFAULT_DMA12_HANDLE;
#endif
#define STM32F4_ADC_DEFAULT_INIT_TD {\
@@ -166,10 +166,10 @@ DMA_HandleTypeDef adc3_dma02_handle = STM32F4_DEFAULT_DMA02_HANDLE;
.ScanConvMode = DISABLE,\
.EOCSelection = DISABLE,\
.ContinuousConvMode = ENABLE,\
- .NbrOfConversion = 2,\
+ .NbrOfConversion = 1,\
.DiscontinuousConvMode = DISABLE,\
.NbrOfDiscConversion = 0,\
- .ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1,\
+ .ExternalTrigConv = ADC_SOFTWARE_START,\
.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE,\
.DMAContinuousRequests = ENABLE\
}
@@ -181,7 +181,7 @@ DMA_HandleTypeDef adc3_dma02_handle = STM32F4_DEFAULT_DMA02_HANDLE;
.Init = STM32F4_ADC_DEFAULT_INIT_TD,\
.Instance = ADC1,\
.NbrOfCurrentConversionRank = 0,\
- .DMA_Handle = &adc1_dma40_handle,\
+ .DMA_Handle = &adc1_dma00_handle,\
.Lock = HAL_UNLOCKED,\
.State = 0,\
.ErrorCode = 0\
@@ -200,7 +200,7 @@ struct adc_chan_config adc1_chan10_config = STM32F4_ADC1_DEFAULT_SAC;
#define STM32F4_ADC1_DEFAULT_CONFIG {\
.sac_chan_count = 16,\
- .sac_chans = &adc1_chan10_config,\
+ .sac_chans = (struct adc_chan_config [16]){{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},STM32F4_ADC1_DEFAULT_SAC},\
.sac_adc_handle = &adc1_handle,\
}
@@ -234,7 +234,7 @@ struct adc_chan_config adc2_chan1_config = STM32F4_ADC2_DEFAULT_SAC;
#define STM32F4_ADC2_DEFAULT_CONFIG {\
.sac_chan_count = 16,\
- .sac_chans = &adc2_chan1_config,\
+ .sac_chans = (struct adc_chan_config [16]){{0},STM32F4_ADC1_DEFAULT_SAC}\
.sac_adc_handle = &adc2_handle,\
}
@@ -248,7 +248,7 @@ struct stm32f4_adc_dev_cfg adc2_config = STM32F4_ADC2_DEFAULT_CONFIG;
.Init = STM32F4_ADC_DEFAULT_INIT_TD,\
.Instance = ADC3,\
.NbrOfCurrentConversionRank = 0,\
- .DMA_Handle = &adc3_dma02_handle,\
+ .DMA_Handle = &adc3_dma12_handle,\
.Lock = HAL_UNLOCKED,\
.State = 0,\
.ErrorCode = 0\
@@ -267,7 +267,7 @@ struct adc_chan_config adc3_chan4_config = STM32F4_ADC3_DEFAULT_SAC;
#define STM32F4_ADC3_DEFAULT_CONFIG {\
.sac_chan_count = 16,\
- .sac_chans = &adc3_chan4_config,\
+ .sac_chans = (struct adc_chan_config [16]){{0},{0},{0},{0},STM32F4_ADC3_DEFAULT_SAC},\
.sac_adc_handle = &adc3_handle,\
}
[04/10] incubator-mynewt-core git commit: MYNEWT-391 STM32F4 ADC
driver and ADC HAL support
Posted by cc...@apache.org.
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
- STM32F4 ADC Initial Commit
- Adding driver
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/65fb04e1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/65fb04e1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/65fb04e1
Branch: refs/heads/develop
Commit: 65fb04e1b3d5b4b1fd72cb0a4821cb25a8f80d29
Parents: 8969709
Author: Vipul Rahane <vi...@runtime.io>
Authored: Fri Sep 2 13:38:23 2016 -0700
Committer: Vipul Rahane <vi...@runtime.io>
Committed: Tue Sep 27 13:34:07 2016 -0700
----------------------------------------------------------------------
.../include/adc_stm32f4/adc_stm32f4.h | 39 +++
drivers/adc/adc_stm32f4/pkg.yml | 33 +++
drivers/adc/adc_stm32f4/src/adc_stm32f4.c | 245 +++++++++++++++++++
3 files changed, 317 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/65fb04e1/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h
----------------------------------------------------------------------
diff --git a/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h b/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h
new file mode 100644
index 0000000..e5a494f
--- /dev/null
+++ b/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef __ADC_STM32F4_H__
+#define __ADC_STM32F4_H__
+
+#include <adc/adc.h>
+
+struct stm32f4_adc_dev_cfg {
+ uint8_t sac_chan_count;
+ uint8_t *sac_chans;
+ ADC_InitTypeDef sac_init;
+};
+
+struct stm32f4_adc_dev {
+ struct adc_dev sad_dev;
+ ADC_TypeDef *sad_adc;
+ ADC_InitTypeDef *sad_init;
+};
+
+int stm32f4_adc_dev_init(struct os_dev *, void *);
+
+#endif /* __ADC_H__ */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/65fb04e1/drivers/adc/adc_stm32f4/pkg.yml
----------------------------------------------------------------------
diff --git a/drivers/adc/adc_stm32f4/pkg.yml b/drivers/adc/adc_stm32f4/pkg.yml
new file mode 100644
index 0000000..205dfa8
--- /dev/null
+++ b/drivers/adc/adc_stm32f4/pkg.yml
@@ -0,0 +1,33 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+pkg.name: drivers/adc/adc_stm32f4
+pkg.description: ADC driver for the STM32F4 series of processors.
+pkg.author: "Apache Mynewt <de...@mynewt.incubator.apache.org>"
+pkg.homepage: "http://mynewt.apache.org/"
+pkg.keywords:
+pkg.features:
+ - ADC_STM32F4
+pkg.apis:
+ - ADC_HW_IMPL
+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/65fb04e1/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
new file mode 100644
index 0000000..95a068e
--- /dev/null
+++ b/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
@@ -0,0 +1,245 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+#include <hal/hal_bsp.h>
+#include <adc/adc.h>
+#include <assert.h>
+#include <os/os.h>
+#include <bsp/cmsis_nvic.h>
+
+struct stm32f4_adc_stats {
+ uint16_t adc_events;
+ uint16_t adc_events_failed;
+};
+static struct stm32f4_adc_stats stm32f4_adc_stats;
+
+
+/**
+ * Open the STM32F4 ADC device
+ *
+ * This function locks the device for access from other tasks.
+ *
+ * @param odev The OS device to open
+ * @param wait The time in MS to wait. If 0 specified, returns immediately
+ * if resource unavailable. If OS_WAIT_FOREVER specified, blocks
+ * until resource is available.
+ * @param arg Argument provided by higher layer to open.
+ *
+ * @return 0 on success, non-zero on failure.
+ */
+static int
+stm32f4_adc_open(struct os_dev *odev, uint32_t wait, void *arg)
+{
+ struct adc_dev *dev;
+ int rc;
+
+ dev = (struct adc_dev *) odev;
+
+ if (os_started()) {
+ rc = os_mutex_pend(&dev->ad_lock, wait);
+ if (rc != OS_OK) {
+ goto err;
+ }
+ }
+
+ if (odev->od_status & OS_DEV_STATUS_OPEN) {
+ os_mutex_release(&dev->ad_lock);
+ rc = OS_EBUSY;
+ goto err;
+ }
+
+ return (0);
+err:
+ return (rc);
+}
+
+
+/**
+ * Close the STM32F4 ADC device.
+ *
+ * This function unlocks the device.
+ *
+ * @param odev The device to close.
+ */
+static int
+stm32f4_adc_close(struct os_dev *odev)
+{
+ struct adc_dev *dev;
+
+ dev = (struct adc_dev *) odev;
+
+ if (os_started()) {
+ os_mutex_release(&dev->ad_lock);
+ }
+
+ return (0);
+}
+
+/**
+ * Configure an ADC channel on the Nordic ADC.
+ *
+ * @param dev The ADC device to configure
+ * @param cnum The channel on the ADC device to configure
+ * @param cfgdata An opaque pointer to channel config, expected to be
+ * a nrf_saadc_channel_config_t
+ *
+ * @return 0 on success, non-zero on failure.
+ */
+static int
+stm32f4_adc_configure_channel(struct adc_dev *dev, uint8_t cnum,
+ void *cfgdata)
+{
+ uint16_t refmv;
+ uint8_t res;
+ int rc;
+
+ /* XXX: Dummy values prior to implementation. */
+ res = 16;
+ refmv = 2800;
+
+ /* Store these values in channel definitions, for conversions to
+ * milivolts.
+ */
+ dev->ad_chans[cnum].c_res = res;
+ dev->ad_chans[cnum].c_refmv = refmv;
+ dev->ad_chans[cnum].c_configured = 1;
+
+ return (0);
+err:
+ return (rc);
+}
+
+/**
+ * Set buffer to read data into. Implementation of setbuffer handler.
+ * Sets both the primary and secondary buffers for DMA.
+ */
+static int
+stm32f4_adc_set_buffer(struct adc_dev *dev, void *buf1, void *buf2,
+ int buf_len)
+{
+ int rc;
+
+ rc = OS_EINVAL;
+ goto err;
+
+ return (0);
+err:
+ return (rc);
+}
+
+static int
+stm32f4_adc_release_buffer(struct adc_dev *dev, void *buf, int buf_len)
+{
+ int rc;
+
+ rc = OS_EINVAL;
+ goto err;
+
+ return (0);
+err:
+ return (rc);
+}
+
+/**
+ * Trigger an ADC sample.
+ */
+static int
+stm32f4_adc_sample(struct adc_dev *dev)
+{
+ return (0);
+}
+
+/**
+ * Blocking read of an ADC channel, returns result as an integer.
+ */
+static int
+stm32f4_adc_read_channel(struct adc_dev *dev, uint8_t cnum, int *result)
+{
+ int rc;
+
+ rc = OS_EINVAL;
+ goto err;
+
+ return (0);
+err:
+ return (rc);
+}
+
+static int
+stm32f4_adc_read_buffer(struct adc_dev *dev, void *buf, int buf_len, int off,
+ int *result)
+{
+ return (0);
+}
+
+static int
+stm32f4_adc_size_buffer(struct adc_dev *dev, int chans, int samples)
+{
+ return (0 * chans * samples);
+}
+
+
+/**
+ * Callback to initialize an adc_dev structure from the os device
+ * initialization callback. This sets up a nrf52_adc_device(), so
+ * that subsequent lookups to this device allow us to manipulate it.
+ */
+int
+stm32f4_adc_dev_init(struct os_dev *odev, void *arg)
+{
+ struct stm32f4_adc_dev *sad;
+ struct stm32f4_adc_dev_cfg *sac;
+ struct adc_dev *dev;
+ struct adc_driver_funcs *af;
+
+ sad = (struct stm32f4_adc_dev *) odev;
+ sac = (struct stm32f4_adc_dev_cfg *) arg;
+
+ assert(sad != NULL);
+ assert(sac != NULL);
+
+ dev = (struct adc_dev *) &sad->sad_dev;
+
+ os_mutex_init(&dev->ad_lock);
+
+ /* Have a pointer to the init typedef from the configured
+ * value. This allows non-driver specific items to be configured.
+ */
+ sad->sad_init = &sac->sac_init;
+
+ dev->ad_chans = (void *) sac->sac_chans;
+ dev->ad_chan_count = sac->sac_chan_count;
+
+ OS_DEV_SETHANDLERS(odev, stm32f4_adc_open, stm32f4_adc_close);
+
+ af = &dev->ad_funcs;
+
+ af->af_configure_channel = stm32f4_adc_configure_channel;
+ af->af_sample = stm32f4_adc_sample;
+ af->af_read_channel = stm32f4_adc_read_channel;
+ af->af_set_buffer = stm32f4_adc_set_buffer;
+ af->af_release_buffer = stm32f4_adc_release_buffer;
+ af->af_read_buffer = stm32f4_adc_read_buffer;
+ af->af_size_buffer = stm32f4_adc_size_buffer;
+
+ return (0);
+}
+
+
[05/10] incubator-mynewt-core git commit: MYNEWT-391 STM32F4 ADC
driver and ADC HAL support
Posted by cc...@apache.org.
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
- Changing driver to work with config
- Adding deinit gpio to STM32F4 HAL
- Adding support for ADCs to the bsp and adding a default config for
them
- The linked script for the olimex used CCRAM for _ccram_start, we
should be using CCM instead.
- Resolving some compiler warnings.
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/ade26312
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/ade26312
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/ade26312
Branch: refs/heads/develop
Commit: ade26312cf887dbabf9cb8e3836b7f342d919db8
Parents: 65fb04e
Author: Vipul Rahane <vi...@runtime.io>
Authored: Tue Sep 20 18:03:01 2016 -0700
Committer: Vipul Rahane <vi...@runtime.io>
Committed: Tue Sep 27 13:34:07 2016 -0700
----------------------------------------------------------------------
apps/sblinky/pkg.yml | 4 -
apps/sblinky/src/main.c | 176 +++++--
.../include/adc_stm32f4/adc_stm32f4.h | 36 +-
drivers/adc/adc_stm32f4/pkg.yml | 4 +-
drivers/adc/adc_stm32f4/src/adc_stm32f4.c | 522 +++++++++++++++++--
drivers/adc/include/adc/adc.h | 5 +
drivers/adc/pkg.yml | 2 +-
.../olimex_stm32-e407_devboard.ld | 2 +-
hw/bsp/olimex_stm32-e407_devboard/pkg.yml | 33 +-
hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c | 163 ++++++
.../include/mcu/stm32f4xx_mynewt_hal.h | 1 +
hw/mcu/stm/stm32f4xx/pkg.yml | 2 +-
hw/mcu/stm/stm32f4xx/src/hal_gpio.c | 33 +-
hw/mcu/stm/stm32f4xx/src/hal_spi.c | 4 +-
14 files changed, 874 insertions(+), 113 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/apps/sblinky/pkg.yml
----------------------------------------------------------------------
diff --git a/apps/sblinky/pkg.yml b/apps/sblinky/pkg.yml
index 9bc7c96..a1bab7e 100644
--- a/apps/sblinky/pkg.yml
+++ b/apps/sblinky/pkg.yml
@@ -24,12 +24,8 @@ pkg.author: "Apache Mynewt <de...@mynewt.incubator.apache.org>"
pkg.homepage: "http://mynewt.apache.org/"
pkg.keywords:
-pkg.req_apis:
- - ADC_HW_IMPL
-
pkg.deps:
- libs/newtmgr
- - hw/mcu/nordic
- drivers/adc
- fs/nffs
- libs/console/full
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/apps/sblinky/src/main.c
----------------------------------------------------------------------
diff --git a/apps/sblinky/src/main.c b/apps/sblinky/src/main.c
index f9799be..280f410 100755
--- a/apps/sblinky/src/main.c
+++ b/apps/sblinky/src/main.c
@@ -32,24 +32,33 @@
#ifdef ARCH_sim
#include <mcu/mcu_sim.h>
#endif
-#include "nrf.h"
-#include "app_util_platform.h"
-#include "app_error.h"
#ifdef NRF51
+#include "nrf.h"
#include <adc_nrf51/adc_nrf51.h>
#include "nrf_drv_adc.h"
+#include "app_util_platform.h"
+#include "app_error.h"
nrf_drv_adc_config_t adc_config = NRF_DRV_ADC_DEFAULT_CONFIG;
nrf_drv_adc_channel_t g_nrf_adc_chan =
NRF_DRV_ADC_DEFAULT_CHANNEL(NRF_ADC_CONFIG_INPUT_2);
#endif
#ifdef NRF52
+#include "nrf.h"
#include <adc_nrf52/adc_nrf52.h>
#include "nrf_drv_saadc.h"
+#include "app_util_platform.h"
+#include "app_error.h"
nrf_drv_saadc_config_t adc_config = NRF_DRV_SAADC_DEFAULT_CONFIG;
#endif
+#ifdef STM32F4
+#include "stm32f4xx_hal_dma.h"
+#include "stm32f4xx_hal_adc.h"
+#include <adc_stm32f4/adc_stm32f4.h>
+#endif
+
#if defined(NRF52) || defined(NRF51)
/* The spi txrx callback */
struct sblinky_spi_cb_arg
@@ -162,7 +171,7 @@ sblinky_spi_irqs_handler(void *arg, int len)
void
sblinky_spi_cfg(int spi_num)
{
- int spi_id;
+ int spi_id = 0;
struct hal_spi_settings my_spi;
#if MYNEWT_VAL(SPI_MASTER)
@@ -189,8 +198,6 @@ sblinky_spi_cfg(int spi_num)
hal_spi_config(spi_id, &my_spi);
}
-struct adc_dev my_dev;
-
#if 0
#define SAADC_SAMPLES_IN_BUFFER (4)
static nrf_saadc_value_t m_buffer_pool[2][SAADC_SAMPLES_IN_BUFFER];
@@ -227,29 +234,40 @@ saadc_test(void)
}
#endif
-#define ADC_NUMBER_SAMPLES (2)
+
+#define ADC_NUMBER_SAMPLES (16)
#define ADC_NUMBER_CHANNELS (1)
+#if MYNEWT_VAL(ADC_3)
+
+#define STM32F4_ADC_DEFAULT_CHAN_CFG {\
+ .Channel = ADC_CHANNEL_4,\
+ .Rank = 1,\
+ .SamplingTime = ADC_SAMPLETIME_144CYCLES,\
+ .Offset = 0\
+}
+
+ADC_ChannelConfTypeDef adc_chan_cfg = STM32F4_ADC_DEFAULT_CHAN_CFG;
+
uint8_t *sample_buffer1;
uint8_t *sample_buffer2;
-int adc_result;
-int my_result_mv;
+int adc3_result;
+int my_result_mv3[ADC_NUMBER_SAMPLES];
int
-adc_read_event(struct adc_dev *dev, void *arg, uint8_t etype,
+adc3_read_event(struct adc_dev *dev, void *arg, uint8_t etype,
void *buffer, int buffer_len)
{
int i;
- //int result;
int rc;
for (i = 0; i < ADC_NUMBER_SAMPLES; i++) {
- rc = adc_buf_read(dev, buffer, buffer_len, i, &adc_result);
+ rc = adc_buf_read(dev, buffer, buffer_len, i, &adc3_result);
if (rc != 0) {
goto err;
}
- my_result_mv = adc_result_mv(dev, 0, adc_result);
+ my_result_mv3[i] = adc_result_mv(dev, ADC_CHANNEL_4, adc3_result);
}
adc_buf_release(dev, buffer, buffer_len);
@@ -258,13 +276,57 @@ adc_read_event(struct adc_dev *dev, void *arg, uint8_t etype,
err:
return (rc);
}
+#endif
+
+#if MYNEWT_VAL(ADC_1)
+
+#define STM32F4_ADC_DEFAULT_CHAN_CFG10 {\
+ .Channel = ADC_CHANNEL_10,\
+ .Rank = 1,\
+ .SamplingTime = ADC_SAMPLETIME_144CYCLES,\
+ .Offset = 0\
+}
+
+ADC_ChannelConfTypeDef adc_chan_cfg10 = STM32F4_ADC_DEFAULT_CHAN_CFG10;
+
+int adc1_result;
+int my_result_mv1[ADC_NUMBER_SAMPLES];
+uint8_t *sample_buffer3;
+uint8_t *sample_buffer4;
+int
+adc1_read_event(struct adc_dev *dev, void *arg, uint8_t etype,
+ void *buffer, int buffer_len)
+{
+ int i;
+ int rc;
+
+ for (i = 0; i < ADC_NUMBER_SAMPLES; i++) {
+ rc = adc_buf_read(dev, buffer, buffer_len, i, &adc1_result);
+ if (rc != 0) {
+ goto err;
+ }
+ my_result_mv1[i] = adc_result_mv(dev, ADC_CHANNEL_10, adc1_result);
+ }
+
+ adc_buf_release(dev, buffer, buffer_len);
+
+ return (0);
+err:
+ return (rc);
+}
+#endif
void
task1_handler(void *arg)
{
- int rc;
struct os_task *t;
- struct adc_dev *adc;
+#if MYNEWT_VAL(ADC_3)
+ struct adc_dev *adc3;
+#endif
+#if MYNEWT_VAL(ADC_1)
+ struct adc_dev *adc1;
+#endif
+
#if MYNEWT_VAL(SPI_MASTER)
int i;
uint8_t last_val;
@@ -281,14 +343,31 @@ task1_handler(void *arg)
g_led_pin = LED_BLINK_PIN;
hal_gpio_init_out(g_led_pin, 1);
- adc = (struct adc_dev *) os_dev_open("adc0", 1, &adc_config);
- assert(adc != NULL);
+#if MYNEWT_VAL(ADC_3)
+ adc3 = (struct adc_dev *) os_dev_open("adc3", 1, NULL);
+ assert(adc3 != NULL);
+#endif
+
+#if MYNEWT_VAL(ADC_1)
+ adc1 = (struct adc_dev *) os_dev_open("adc1", 1, NULL);
+ assert(adc1 != NULL);
+#endif
#ifdef NRF51
- adc_chan_config(adc, 0, &g_nrf_adc_chan);
+ adc_chan_config(adc3, 0, &g_nrf_adc_chan);
#endif
+
#ifdef NRF52
- adc_chan_config(adc, 0, &cc);
+ adc_chan_config(adc3, 0, &cc);
+#endif
+
+#ifdef STM32F4
+#if MYNEWT_VAL(ADC_3)
+ adc_chan_config(adc3, ADC_CHANNEL_4, &adc_chan_cfg);
+#endif
+#if MYNEWT_VAL(ADC_1)
+ adc_chan_config(adc1, ADC_CHANNEL_10, &adc_chan_cfg10);
+#endif
#endif
#if MYNEWT_VAL(SPI_MASTER)
@@ -298,6 +377,7 @@ task1_handler(void *arg)
hal_spi_enable(0);
#if 1
+ int rc;
/* Send some bytes in a non-blocking manner to SPI using tx val */
g_spi_tx_buf[0] = 0xde;
g_spi_tx_buf[1] = 0xad;
@@ -347,30 +427,56 @@ task1_handler(void *arg)
rc = hal_spi_txrx(SPI_SLAVE_ID, g_spi_tx_buf, g_spi_rx_buf, 32);
assert(rc == 0);
#endif
+#if MYNEWT_VAL(ADC_3)
+ sample_buffer1 = malloc(adc_buf_size(adc3, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+ sample_buffer2 = malloc(adc_buf_size(adc3, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+ memset(sample_buffer1, 0, adc_buf_size(adc3, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+ memset(sample_buffer2, 0, adc_buf_size(adc3, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+#endif
- sample_buffer1 = malloc(adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
- sample_buffer2 = malloc(adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
- memset(sample_buffer1, 0, adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
- memset(sample_buffer2, 0, adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+#if MYNEWT_VAL(ADC_1)
+ sample_buffer3 = malloc(adc_buf_size(adc1, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+ sample_buffer4 = malloc(adc_buf_size(adc1, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+ memset(sample_buffer3, 0, adc_buf_size(adc1, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+ memset(sample_buffer4, 0, adc_buf_size(adc1, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+#endif
#if 1
- adc_buf_set(adc, sample_buffer1, sample_buffer2,
- adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
- adc_event_handler_set(adc, adc_read_event, (void *) NULL);
+#if MYNEWT_VAL(ADC_3)
+ adc_buf_set(adc3, sample_buffer1, sample_buffer2,
+ adc_buf_size(adc3, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+ adc_event_handler_set(adc3, adc3_read_event, NULL);
#endif
-#if 0
- rc = adc_chan_read(adc, 0, &g_result);
- assert(rc == 0);
- g_result_mv = adc_result_mv(adc, 0, g_result);
+#if MYNEWT_VAL(ADC_1)
+ adc_buf_set(adc1, sample_buffer3, sample_buffer4,
+ adc_buf_size(adc1, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+ adc_event_handler_set(adc1, adc1_read_event, NULL);
+#endif
#endif
while (1) {
t = os_sched_get_current_task();
assert(t->t_func == task1_handler);
- adc_sample(adc);
+#if 0
+ int rc;
+ rc = adc_chan_read(adc, 4, &g_result);
+ assert(rc == 0);
+ g_result_mv = adc_result_mv(adc, 4, g_result);
+#endif
+ int rc;
+ rc = OS_OK;
+
+#if MYNEWT_VAL(ADC_3)
+ rc = adc_sample(adc3);
+ assert(rc == OS_OK);
+#endif
+#if MYNEWT_VAL(ADC_1)
+ rc = adc_sample(adc1);
+ assert(rc == OS_OK);
+#endif
++g_task1_loops;
#if MYNEWT_VAL(SPI_MASTER)
@@ -399,8 +505,13 @@ task1_handler(void *arg)
/* Release semaphore to task 2 */
os_sem_release(&g_test_sem);
}
+#if MYNEWT_VAL(ADC_3)
+ os_dev_close((struct os_dev *) adc3);
+#endif
- os_dev_close((struct os_dev *) adc);
+#if MYNEWT_VAL(ADC_1)
+ os_dev_close((struct os_dev *) adc1);
+#endif
}
void
@@ -478,7 +589,6 @@ main(int argc, char **argv)
/* Initialize the sblinky log. */
log_console_handler_init(&log_console_handler);
log_register("sblinky", &my_log, &log_console_handler);
-
#if 0
saadc_test();
#endif
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h
----------------------------------------------------------------------
diff --git a/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h b/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h
index e5a494f..ad5bc86 100644
--- a/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h
+++ b/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h
@@ -22,16 +22,36 @@
#include <adc/adc.h>
+/* Mynewt HAL Port pin mapping */
+#define ADC123_CH0_PIN 0
+#define ADC123_CH1_PIN 1
+#define ADC123_CH2_PIN 2
+#define ADC123_CH3_PIN 3
+#define ADC12_CH4_PIN 4
+#define ADC12_CH5_PIN 5
+#define ADC12_CH6_PIN 6
+#define ADC12_CH7_PIN 7
+#define ADC12_CH8_PIN 16
+#define ADC12_CH9_PIN 17
+#define ADC3_CH4_PIN 86
+#define ADC3_CH5_PIN 87
+#define ADC3_CH6_PIN 88
+#define ADC3_CH7_PIN 89
+#define ADC3_CH8_PIN 90
+#define ADC3_CH9_PIN 83
+#define ADC123_CH10_PIN 32
+#define ADC123_CH11_PIN 33
+#define ADC123_CH12_PIN 34
+#define ADC123_CH13_PIN 35
+#define ADC12_CH14_PIN 36
+#define ADC12_CH15_PIN 37
+#define ADC3_CH14_PIN 84
+#define ADC3_CH15_PIN 85
+
struct stm32f4_adc_dev_cfg {
uint8_t sac_chan_count;
- uint8_t *sac_chans;
- ADC_InitTypeDef sac_init;
-};
-
-struct stm32f4_adc_dev {
- struct adc_dev sad_dev;
- ADC_TypeDef *sad_adc;
- ADC_InitTypeDef *sad_init;
+ void *sac_chans;
+ ADC_HandleTypeDef *sac_adc_handle;
};
int stm32f4_adc_dev_init(struct os_dev *, void *);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/drivers/adc/adc_stm32f4/pkg.yml
----------------------------------------------------------------------
diff --git a/drivers/adc/adc_stm32f4/pkg.yml b/drivers/adc/adc_stm32f4/pkg.yml
index 205dfa8..bb24fd7 100644
--- a/drivers/adc/adc_stm32f4/pkg.yml
+++ b/drivers/adc/adc_stm32f4/pkg.yml
@@ -22,9 +22,9 @@ pkg.description: ADC driver for the STM32F4 series of processors.
pkg.author: "Apache Mynewt <de...@mynewt.incubator.apache.org>"
pkg.homepage: "http://mynewt.apache.org/"
pkg.keywords:
-pkg.features:
+pkg.features:
- ADC_STM32F4
-pkg.apis:
+pkg.apis:
- ADC_HW_IMPL
pkg.deps.TEST:
- hw/hal
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/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 95a068e..029c267 100644
--- a/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
+++ b/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
@@ -23,13 +23,371 @@
#include <assert.h>
#include <os/os.h>
#include <bsp/cmsis_nvic.h>
+#include "stm32f4xx_hal_dma.h"
+#include "stm32f4xx_hal_adc.h"
+#include "stm32f4xx_hal_rcc.h"
+#include "stm32f4xx_hal_cortex.h"
+#include "stm32f4xx_hal.h"
+#include "adc_stm32f4/adc_stm32f4.h"
+#include "stm32f4xx_hal_dma.h"
+#include "mcu/stm32f4xx_mynewt_hal.h"
+
+#define STM32F4_IS_DMA_ADC_CHANNEL(CHANNEL) ((CHANNEL) <= DMA_CHANNEL_2)
+
+static DMA_HandleTypeDef *dma_handle[5];
+static struct adc_dev *adc_dma[5];
struct stm32f4_adc_stats {
uint16_t adc_events;
- uint16_t adc_events_failed;
+ uint16_t adc_DMA_xfer_failed;
+ uint16_t adc_DMA_xfer_aborted;
+ uint16_t adc_DMA_xfer_complete;
+ uint16_t adc_error;
};
+
static struct stm32f4_adc_stats stm32f4_adc_stats;
+static void
+stm32f4_adc_clk_enable(ADC_HandleTypeDef *hadc) {
+ uintptr_t adc_addr = (uintptr_t)hadc->Instance;
+
+ switch (adc_addr) {
+ case (uintptr_t)ADC1:
+ __HAL_RCC_ADC1_CLK_ENABLE();
+ break;
+ case (uintptr_t)ADC2:
+ __HAL_RCC_ADC2_CLK_ENABLE();
+ break;
+ case (uintptr_t)ADC3:
+ __HAL_RCC_ADC3_CLK_ENABLE();
+ break;
+ default:
+ assert(0);
+ }
+}
+
+static void
+stm32f4_adc_clk_disable(ADC_HandleTypeDef *hadc) {
+ uintptr_t adc_addr = (uintptr_t)hadc->Instance;
+
+ switch (adc_addr) {
+ case (uintptr_t)ADC1:
+ __HAL_RCC_ADC1_CLK_DISABLE();
+ break;
+ case (uintptr_t)ADC2:
+ __HAL_RCC_ADC2_CLK_DISABLE();
+ break;
+ case (uintptr_t)ADC3:
+ __HAL_RCC_ADC3_CLK_DISABLE();
+ break;
+ default:
+ assert(0);
+ }
+}
+
+static GPIO_InitTypeDef
+stm32f4_resolve_adc_gpio(ADC_HandleTypeDef *adc, uint8_t cnum)
+{
+ uintptr_t adc_addr = (uintptr_t)adc->Instance;
+ uint32_t pin;
+ GPIO_InitTypeDef gpio_td;
+
+ switch (adc_addr) {
+ case (uintptr_t)ADC1:
+ case (uintptr_t)ADC2:
+ switch(cnum) {
+ case ADC_CHANNEL_4:
+ pin = ADC12_CH4_PIN;
+ goto done;
+ case ADC_CHANNEL_5:
+ pin = ADC12_CH5_PIN;
+ goto done;
+ case ADC_CHANNEL_6:
+ pin = ADC12_CH6_PIN;
+ goto done;
+ case ADC_CHANNEL_7:
+ pin = ADC12_CH7_PIN;
+ goto done;
+ case ADC_CHANNEL_8:
+ pin = ADC12_CH8_PIN;
+ goto done;
+ case ADC_CHANNEL_9:
+ pin = ADC12_CH9_PIN;
+ goto done;
+ case ADC_CHANNEL_14:
+ pin = ADC12_CH14_PIN;
+ goto done;
+ case ADC_CHANNEL_15:
+ pin = ADC12_CH15_PIN;
+ goto done;
+ }
+ case (uintptr_t)ADC3:
+ switch(cnum) {
+ case ADC_CHANNEL_0:
+ pin = ADC123_CH0_PIN;
+ goto done;
+ case ADC_CHANNEL_1:
+ pin = ADC123_CH1_PIN;
+ goto done;
+ case ADC_CHANNEL_2:
+ pin = ADC123_CH2_PIN;
+ goto done;
+ case ADC_CHANNEL_3:
+ pin = ADC123_CH3_PIN;
+ goto done;
+ case ADC_CHANNEL_4:
+ pin = ADC3_CH4_PIN;
+ goto done;
+ case ADC_CHANNEL_5:
+ pin = ADC3_CH5_PIN;
+ goto done;
+ case ADC_CHANNEL_6:
+ pin = ADC3_CH6_PIN;
+ goto done;
+ case ADC_CHANNEL_7:
+ pin = ADC3_CH7_PIN;
+ goto done;
+ case ADC_CHANNEL_8:
+ pin = ADC3_CH8_PIN;
+ goto done;
+ case ADC_CHANNEL_9:
+ pin = ADC3_CH9_PIN;
+ goto done;
+ case ADC_CHANNEL_10:
+ pin = ADC123_CH10_PIN;
+ goto done;
+ case ADC_CHANNEL_11:
+ pin = ADC123_CH11_PIN;
+ goto done;
+ case ADC_CHANNEL_12:
+ pin = ADC123_CH12_PIN;
+ goto done;
+ case ADC_CHANNEL_13:
+ pin = ADC123_CH13_PIN;
+ goto done;
+ case ADC_CHANNEL_14:
+ pin = ADC3_CH14_PIN;
+ goto done;
+ case ADC_CHANNEL_15:
+ pin = ADC3_CH15_PIN;
+ goto done;
+ }
+ default:
+ assert(0);
+ }
+done:
+ gpio_td = (GPIO_InitTypeDef){
+ .Pin = pin,
+ .Mode = GPIO_MODE_ANALOG,
+ .Pull = GPIO_NOPULL,
+ .Alternate = pin
+ };
+ return gpio_td;
+}
+
+static IRQn_Type
+stm32f4_resolve_adc_dma_irq(DMA_HandleTypeDef *hdma)
+{
+ uintptr_t stream_addr = (uintptr_t)hdma->Instance;
+
+ assert(STM32F4_IS_DMA_ADC_CHANNEL(hdma->Init.Channel));
+
+ switch(stream_addr) {
+ /* DMA2 */
+ case (uintptr_t)DMA2_Stream0:
+ return DMA2_Stream0_IRQn;
+ case (uintptr_t)DMA2_Stream1:
+ return DMA2_Stream1_IRQn;
+ case (uintptr_t)DMA2_Stream2:
+ return DMA2_Stream2_IRQn;
+ case (uintptr_t)DMA2_Stream3:
+ return DMA2_Stream3_IRQn;
+ case (uintptr_t)DMA2_Stream4:
+ return DMA2_Stream4_IRQn;
+ default:
+ assert(0);
+ }
+}
+
+static void
+dma2_stream0_irq_handler(void)
+{
+ HAL_DMA_IRQHandler(dma_handle[0]);
+}
+
+static void
+dma2_stream1_irq_handler(void)
+{
+ HAL_DMA_IRQHandler(dma_handle[1]);
+}
+
+static void
+dma2_stream2_irq_handler(void)
+{
+ HAL_DMA_IRQHandler(dma_handle[2]);
+}
+
+static void
+dma2_stream3_irq_handler(void)
+{
+ HAL_DMA_IRQHandler(dma_handle[3]);
+}
+
+static void
+dma2_stream4_irq_handler(void)
+{
+ HAL_DMA_IRQHandler(dma_handle[4]);
+}
+
+uint32_t
+stm32f4_resolve_adc_dma_irq_handler(DMA_HandleTypeDef *hdma)
+{
+ switch((uintptr_t)hdma->Instance) {
+ /* DMA2 */
+ case (uintptr_t)DMA2_Stream0:
+ return (uint32_t)&dma2_stream0_irq_handler;
+ case (uintptr_t)DMA2_Stream1:
+ return (uint32_t)&dma2_stream1_irq_handler;
+ case (uintptr_t)DMA2_Stream2:
+ return (uint32_t)&dma2_stream2_irq_handler;
+ case (uintptr_t)DMA2_Stream3:
+ return (uint32_t)&dma2_stream3_irq_handler;
+ case (uintptr_t)DMA2_Stream4:
+ return (uint32_t)&dma2_stream4_irq_handler;
+ default:
+ assert(0);
+ }
+}
+
+static int
+stm32f4_resolve_dma_handle_idx(DMA_HandleTypeDef *hdma)
+{
+ uintptr_t stream_addr = (uintptr_t)hdma->Instance;
+ return ((stream_addr & 0xFF) - ((uintptr_t)DMA2_Stream0_BASE & 0xFF))/0x18;
+}
+
+static void
+stm32f4_xfer_error_cb(DMA_HandleTypeDef *hdma)
+{
+ /* DMA transfer error callback */
+ stm32f4_adc_stats.adc_DMA_xfer_failed++;
+}
+
+static void
+stm32f4_xfer_abort_cb(DMA_HandleTypeDef *hdma)
+{
+ /* DMA transfer Abort callback */
+ stm32f4_adc_stats.adc_DMA_xfer_aborted++;
+}
+
+void
+HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
+{
+ stm32f4_adc_stats.adc_error++;
+}
+
+void
+HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
+{
+ int rc;
+ struct adc_dev *adc;
+ DMA_HandleTypeDef *hdma;
+
+ assert(hadc);
+ hdma = hadc->DMA_Handle;
+
+ ++stm32f4_adc_stats.adc_DMA_xfer_complete;
+
+ adc = adc_dma[stm32f4_resolve_dma_handle_idx(hdma)];
+
+ rc = adc->ad_event_handler_func(adc, NULL, ADC_EVENT_RESULT, adc->primarybuf,
+ adc->buflen);
+ if (rc) {
+ ++stm32f4_adc_stats.adc_error;
+ }
+}
+
+
+//void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
+static void
+stm32f4_adc_dma_init(ADC_HandleTypeDef* hadc)
+{
+
+ DMA_HandleTypeDef *hdma;
+
+ assert(hadc);
+ hdma = hadc->DMA_Handle;
+
+ stm32f4_adc_clk_enable(hadc);
+ __HAL_RCC_DMA2_CLK_ENABLE();
+
+ HAL_DMA_Init(hdma);
+ dma_handle[stm32f4_resolve_dma_handle_idx(hdma)] = hdma;
+
+ if (HAL_DMA_RegisterCallback(hdma, HAL_DMA_XFER_ERROR_CB_ID,
+ stm32f4_xfer_error_cb) != HAL_OK) {
+ assert(0);
+ }
+
+ if (HAL_DMA_RegisterCallback(hdma, HAL_DMA_XFER_ABORT_CB_ID,
+ stm32f4_xfer_abort_cb) != HAL_OK) {
+ assert(0);
+ }
+
+ NVIC_SetPriority(stm32f4_resolve_adc_dma_irq(hdma),
+ NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0));
+ NVIC_SetVector(stm32f4_resolve_adc_dma_irq(hdma),
+ stm32f4_resolve_adc_dma_irq_handler(hdma));
+ NVIC_EnableIRQ(stm32f4_resolve_adc_dma_irq(hdma));
+
+}
+
+static void
+stm32f4_adc_init(void *arg)
+{
+ struct stm32f4_adc_dev_cfg *adc_config = (struct stm32f4_adc_dev_cfg *)arg;
+ ADC_HandleTypeDef *hadc;
+
+ assert(adc_config);
+
+ hadc = adc_config->sac_adc_handle;
+
+ stm32f4_adc_dma_init(hadc);
+
+ if (HAL_ADC_Init(hadc) != HAL_OK) {
+ assert(0);
+ }
+}
+
+static void
+stm32f4_adc_uninit(struct adc_dev *dev)
+{
+ GPIO_InitTypeDef gpio_td;
+ DMA_HandleTypeDef *hdma;
+ ADC_HandleTypeDef *hadc;
+ struct stm32f4_adc_dev_cfg *cfg;
+ uint8_t cnum;
+
+ assert(dev);
+ cfg = dev->adc_dev_cfg;
+ 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);
+ }
+ stm32f4_adc_clk_disable(hadc);
+
+ NVIC_DisableIRQ(stm32f4_resolve_adc_dma_irq(hdma));
+}
/**
* Open the STM32F4 ADC device
@@ -47,9 +405,14 @@ static struct stm32f4_adc_stats stm32f4_adc_stats;
static int
stm32f4_adc_open(struct os_dev *odev, uint32_t wait, void *arg)
{
+ DMA_HandleTypeDef *hdma;
+ ADC_HandleTypeDef *hadc;
+ struct stm32f4_adc_dev_cfg *cfg;
struct adc_dev *dev;
int rc;
+ assert(odev);
+ rc = OS_OK;
dev = (struct adc_dev *) odev;
if (os_started()) {
@@ -59,13 +422,22 @@ stm32f4_adc_open(struct os_dev *odev, uint32_t wait, void *arg)
}
}
- if (odev->od_status & OS_DEV_STATUS_OPEN) {
+ if (odev->od_flags & OS_DEV_F_STATUS_OPEN) {
os_mutex_release(&dev->ad_lock);
rc = OS_EBUSY;
goto err;
}
- return (0);
+
+ stm32f4_adc_init(dev->adc_dev_cfg);
+
+ cfg = dev->adc_dev_cfg;
+ hadc = cfg->sac_adc_handle;
+ hdma = hadc->DMA_Handle;
+
+ adc_dma[stm32f4_resolve_dma_handle_idx(hdma)] = dev;
+
+ return (OS_OK);
err:
return (rc);
}
@@ -85,20 +457,22 @@ stm32f4_adc_close(struct os_dev *odev)
dev = (struct adc_dev *) odev;
+ stm32f4_adc_uninit(dev);
+
if (os_started()) {
os_mutex_release(&dev->ad_lock);
}
- return (0);
+ return (OS_OK);
}
/**
- * Configure an ADC channel on the Nordic ADC.
+ * Configure an ADC channel on the STM32F4 ADC.
*
* @param dev The ADC device to configure
* @param cnum The channel on the ADC device to configure
* @param cfgdata An opaque pointer to channel config, expected to be
- * a nrf_saadc_channel_config_t
+ * a ADC_ChannelConfTypeDef
*
* @return 0 on success, non-zero on failure.
*/
@@ -106,21 +480,38 @@ static int
stm32f4_adc_configure_channel(struct adc_dev *dev, uint8_t cnum,
void *cfgdata)
{
- uint16_t refmv;
- uint8_t res;
int rc;
+ ADC_HandleTypeDef *hadc;
+ struct stm32f4_adc_dev_cfg *cfg;
+ GPIO_InitTypeDef gpio_td;
+ struct adc_chan_config *chan_cfg;
- /* XXX: Dummy values prior to implementation. */
- res = 16;
- refmv = 2800;
+ assert(dev != NULL && IS_ADC_CHANNEL(cnum));
+ cfg = dev->adc_dev_cfg;
+ hadc = cfg->sac_adc_handle;
+ chan_cfg = cfg->sac_chans;
- /* Store these values in channel definitions, for conversions to
- * milivolts.
- */
- dev->ad_chans[cnum].c_res = res;
- dev->ad_chans[cnum].c_refmv = refmv;
+ // Enable DMA, ADC and related GPIO ports clock
+ gpio_td = stm32f4_resolve_adc_gpio(hadc, cnum);
+ hal_gpio_init_stm(gpio_td.Pin, &gpio_td);
+
+
+ cfgdata = (ADC_ChannelConfTypeDef *)cfgdata;
+
+ if((rc = HAL_ADC_ConfigChannel(hadc, cfgdata)) != HAL_OK) {
+ goto err;
+ }
+
+ 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;
+#if 0
+ if (HAL_ADC_Start_IT(hadc) != HAL_OK) {
+ assert(0);
+ }
+#endif
+
return (0);
err:
return (rc);
@@ -129,32 +520,48 @@ err:
/**
* Set buffer to read data into. Implementation of setbuffer handler.
* Sets both the primary and secondary buffers for DMA.
+ *
+ * For our current implementation we are using DMA in circular mode
+ *
*/
static int
stm32f4_adc_set_buffer(struct adc_dev *dev, void *buf1, void *buf2,
- int buf_len)
+ int buflen)
{
int rc;
- rc = OS_EINVAL;
- goto err;
+ rc = OS_OK;
+ buflen /= sizeof(uint16_t);
- return (0);
-err:
- return (rc);
+ assert(dev != NULL && buf1 != NULL);
+
+ dev->primarybuf = buf1;
+ dev->secondarybuf = buf2;
+ dev->buflen = buflen;
+
+ return rc;
}
static int
stm32f4_adc_release_buffer(struct adc_dev *dev, void *buf, int buf_len)
{
- int rc;
+ ADC_HandleTypeDef *hadc;
+ struct stm32f4_adc_dev_cfg *cfg;
- rc = OS_EINVAL;
- goto err;
+ assert(dev);
+ cfg = dev->adc_dev_cfg;
+ hadc = cfg->sac_adc_handle;
+
+ HAL_ADC_Stop_DMA(hadc);
+
+ if (dev->primarybuf == buf) {
+ if (dev->secondarybuf) {
+ dev->primarybuf = dev->secondarybuf;
+ dev->secondarybuf = buf;
+ }
+ }
return (0);
-err:
- return (rc);
}
/**
@@ -163,7 +570,24 @@ err:
static int
stm32f4_adc_sample(struct adc_dev *dev)
{
- return (0);
+ int rc;
+ ADC_HandleTypeDef *hadc;
+ struct stm32f4_adc_dev_cfg *cfg;
+
+ assert(dev != NULL && dev->primarybuf != NULL);
+ cfg = dev->adc_dev_cfg;
+ hadc = cfg->sac_adc_handle;
+
+ rc = OS_EINVAL;
+
+ if (HAL_ADC_Start_DMA(hadc, dev->primarybuf, dev->buflen) != HAL_OK) {
+ goto err;
+ }
+
+ rc = OS_OK;
+
+err:
+ return rc;
}
/**
@@ -172,57 +596,67 @@ stm32f4_adc_sample(struct adc_dev *dev)
static int
stm32f4_adc_read_channel(struct adc_dev *dev, uint8_t cnum, int *result)
{
- int rc;
+ ADC_HandleTypeDef *hadc;
+ struct stm32f4_adc_dev_cfg *cfg;
- rc = OS_EINVAL;
- goto err;
+ assert(dev != NULL && result != NULL);
+ cfg = dev->adc_dev_cfg;
+ hadc = cfg->sac_adc_handle;
- return (0);
-err:
- return (rc);
+ *result = HAL_ADC_GetValue(hadc);
+
+ return (OS_OK);
}
static int
stm32f4_adc_read_buffer(struct adc_dev *dev, void *buf, int buf_len, int off,
- int *result)
+ int *result)
{
- return (0);
+
+ assert(off < buf_len);
+
+ *result = *((uint32_t *) buf + off);
+
+ return (OS_OK);
}
static int
stm32f4_adc_size_buffer(struct adc_dev *dev, int chans, int samples)
{
- return (0 * chans * samples);
+ return (sizeof(uint32_t) * chans * samples);
}
+#if 0
+void ADC_IRQHandler(void)
+{
+ HAL_ADC_IRQHandler(adc_handle);
+}
+#endif
+
/**
* Callback to initialize an adc_dev structure from the os device
- * initialization callback. This sets up a nrf52_adc_device(), so
+ * initialization callback. This sets up a stm32f4_adc_device(), so
* that subsequent lookups to this device allow us to manipulate it.
*/
int
stm32f4_adc_dev_init(struct os_dev *odev, void *arg)
{
- struct stm32f4_adc_dev *sad;
struct stm32f4_adc_dev_cfg *sac;
struct adc_dev *dev;
struct adc_driver_funcs *af;
- sad = (struct stm32f4_adc_dev *) odev;
sac = (struct stm32f4_adc_dev_cfg *) arg;
- assert(sad != NULL);
assert(sac != NULL);
- dev = (struct adc_dev *) &sad->sad_dev;
+ dev = (struct adc_dev *)odev;
os_mutex_init(&dev->ad_lock);
/* Have a pointer to the init typedef from the configured
* value. This allows non-driver specific items to be configured.
*/
- sad->sad_init = &sac->sac_init;
dev->ad_chans = (void *) sac->sac_chans;
dev->ad_chan_count = sac->sac_chan_count;
@@ -230,6 +664,7 @@ 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->adc_dev_cfg = arg;
af->af_configure_channel = stm32f4_adc_configure_channel;
af->af_sample = stm32f4_adc_sample;
@@ -242,4 +677,3 @@ stm32f4_adc_dev_init(struct os_dev *odev, void *arg)
return (0);
}
-
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/drivers/adc/include/adc/adc.h
----------------------------------------------------------------------
diff --git a/drivers/adc/include/adc/adc.h b/drivers/adc/include/adc/adc.h
index 01727c0..f0d4ad5 100644
--- a/drivers/adc/include/adc/adc.h
+++ b/drivers/adc/include/adc/adc.h
@@ -146,6 +146,7 @@ struct adc_chan_config {
uint16_t c_refmv;
uint8_t c_res;
uint8_t c_configured;
+ uint8_t c_cnum;
};
struct adc_dev {
@@ -153,9 +154,13 @@ struct adc_dev {
struct os_mutex ad_lock;
struct adc_driver_funcs ad_funcs;
struct adc_chan_config *ad_chans;
+ void *adc_dev_cfg;
int ad_chan_count;
adc_event_handler_func_t ad_event_handler_func;
void *ad_event_handler_arg;
+ void *primarybuf;
+ void *secondarybuf;
+ int buflen;
};
int adc_chan_config(struct adc_dev *, uint8_t, void *);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/drivers/adc/pkg.yml
----------------------------------------------------------------------
diff --git a/drivers/adc/pkg.yml b/drivers/adc/pkg.yml
index 94469bc..bf0205a 100644
--- a/drivers/adc/pkg.yml
+++ b/drivers/adc/pkg.yml
@@ -22,5 +22,5 @@ pkg.description: ADC driver interfaces
pkg.author: "Apache Mynewt <de...@mynewt.incubator.apache.org>"
pkg.homepage: "http://mynewt.apache.org/"
pkg.keywords:
-pkg.req_apis:
+pkg.req_apis:
- ADC_HW_IMPL
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/hw/bsp/olimex_stm32-e407_devboard/olimex_stm32-e407_devboard.ld
----------------------------------------------------------------------
diff --git a/hw/bsp/olimex_stm32-e407_devboard/olimex_stm32-e407_devboard.ld b/hw/bsp/olimex_stm32-e407_devboard/olimex_stm32-e407_devboard.ld
index 4c1541d..b07d869 100755
--- a/hw/bsp/olimex_stm32-e407_devboard/olimex_stm32-e407_devboard.ld
+++ b/hw/bsp/olimex_stm32-e407_devboard/olimex_stm32-e407_devboard.ld
@@ -192,7 +192,7 @@ SECTIONS
__HeapLimit = ORIGIN(RAM) + LENGTH(RAM);
_ram_start = ORIGIN(RAM);
- _ccram_start = ORIGIN(CCRAM);
+ _ccram_start = ORIGIN(CCM);
/* .stack_dummy section doesn't contains any symbols. It is only
* used for linker to calculate size of stack sections, and assign
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/hw/bsp/olimex_stm32-e407_devboard/pkg.yml
----------------------------------------------------------------------
diff --git a/hw/bsp/olimex_stm32-e407_devboard/pkg.yml b/hw/bsp/olimex_stm32-e407_devboard/pkg.yml
index a06aaf0..41c0674 100644
--- a/hw/bsp/olimex_stm32-e407_devboard/pkg.yml
+++ b/hw/bsp/olimex_stm32-e407_devboard/pkg.yml
@@ -36,13 +36,18 @@ pkg.debugscript: "olimex_stm32-e407_devboard_debug.sh"
pkg.cflags:
# STM SDK files require these defines.
- '-DSTM32F407xx'
-
+ - '-DHAL_ADC_MODULE_ENABLED'
+ - '-DHAL_DMA_MODULE_ENABLED'
pkg.deps:
- hw/mcu/stm/stm32f4xx
- libs/baselibc
-pkg.deps.ADC_0:
- - drivers/adc/adc_nrf52
+pkg.deps.ADC_1:
+ - drivers/adc/adc_stm32f4
+pkg.deps.ADC_2:
+ - drivers/adc/adc_stm32f4
+pkg.deps.ADC_3:
+ - drivers/adc/adc_stm32f4
pkg.deps.UART_0:
- drivers/uart/uart_hal
@@ -55,19 +60,15 @@ pkg.syscfg_defs:
description: 'TBD'
value: 1000000
- ADC_0:
- description: 'TBD'
- value: 0
- ADC_0_RESOLUTION:
- description: 'TBD'
- value: 'SAADC_CONFIG_RESOLUTION'
- ADC_0_OVERSAMPLE:
- description: 'TBD'
- value: 'SAADC_CONFIG_OVERSAMPLE'
- ADC_0_INTERRUPT_PRIORITY:
- description: 'TBD'
- value: 'SAADC_CONFIG_IRQ_PRIORITY'
-
+ ADC_1:
+ description: "ADC_1"
+ value: 1
+ ADC_2:
+ description: "ADC_2"
+ value: 1
+ ADC_3:
+ description: "ADC_3"
+ value: 1
UART_0:
description: 'TBD'
value: 1
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c b/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c
index ec71236..39b0bac 100644
--- a/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c
+++ b/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c
@@ -30,6 +30,10 @@
#include <uart_hal/uart_hal.h>
#include "bsp/bsp.h"
+#include "syscfg/syscfg.h"
+#include "stm32f4xx_hal_dma.h"
+#include "stm32f4xx_hal_adc.h"
+#include <adc_stm32f4/adc_stm32f4.h>
static struct flash_area bsp_flash_areas[] = {
[FLASH_AREA_BOOTLOADER] = {
@@ -62,9 +66,155 @@ static struct flash_area bsp_flash_areas[] = {
static struct uart_dev hal_uart0;
/* XXX should not be here */
+
+#if MYNEWT_VAL(ADC_1)
+struct adc_dev my_dev_adc1;
+#endif
+
struct stm32f4_uart_cfg;
+#if MYNEWT_VAL(ADC_3)
+struct adc_dev my_dev_adc3;
+#endif
+
extern struct stm32f4_uart_cfg *bsp_uart_config(int port);
+/*****************ADC3 Config ***************/
+
+#if MYNEWT_VAL(ADC_3)
+
+ADC_HandleTypeDef adc_handle;
+
+#define STM32F4_DEFAULT_DMA_HANDLE21 {\
+ .Instance = DMA2_Stream1,\
+ .Init.Channel = DMA_CHANNEL_2,\
+ .Init.Direction = DMA_PERIPH_TO_MEMORY,\
+ .Init.PeriphInc = DMA_PINC_DISABLE,\
+ .Init.MemInc = DMA_MINC_ENABLE,\
+ .Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD,\
+ .Init.MemDataAlignment = DMA_MDATAALIGN_WORD,\
+ .Init.Mode = DMA_CIRCULAR,\
+ .Init.Priority = DMA_PRIORITY_HIGH,\
+ .Init.FIFOMode = DMA_FIFOMODE_DISABLE,\
+ .Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL,\
+ .Init.MemBurst = DMA_MBURST_SINGLE,\
+ .Init.PeriphBurst = DMA_PBURST_SINGLE,\
+ .Parent = &adc_handle,\
+}
+#endif
+
+#if MYNEWT_VAL(ADC_1)
+/*
+ * adc_handle is defined earlier because the DMA handle's
+ * parent needs to be pointing to the adc_handle
+ */
+ADC_HandleTypeDef adc_handle120;
+
+DMA_HandleTypeDef adc_dma_handle21 = STM32F4_DEFAULT_DMA_HANDLE21;
+
+#define STM32F4_DEFAULT_DMA_HANDLE20 {\
+ .Instance = DMA2_Stream0,\
+ .Init.Channel = DMA_CHANNEL_0,\
+ .Init.Direction = DMA_PERIPH_TO_MEMORY,\
+ .Init.PeriphInc = DMA_PINC_DISABLE,\
+ .Init.MemInc = DMA_MINC_ENABLE,\
+ .Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD,\
+ .Init.MemDataAlignment = DMA_MDATAALIGN_WORD,\
+ .Init.Mode = DMA_CIRCULAR,\
+ .Init.Priority = DMA_PRIORITY_HIGH,\
+ .Init.FIFOMode = DMA_FIFOMODE_DISABLE,\
+ .Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL,\
+ .Init.MemBurst = DMA_MBURST_SINGLE,\
+ .Init.PeriphBurst = DMA_PBURST_SINGLE,\
+ .Parent = &adc_handle120,\
+}
+
+DMA_HandleTypeDef adc_dma_handle20 = STM32F4_DEFAULT_DMA_HANDLE20;
+#endif
+
+
+#define STM32F4_ADC_DEFAULT_INIT_TD {\
+ .ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2,\
+ .Resolution = ADC_RESOLUTION12b,\
+ .DataAlign = ADC_DATAALIGN_RIGHT,\
+ .ScanConvMode = DISABLE,\
+ .EOCSelection = DISABLE,\
+ .ContinuousConvMode = ENABLE,\
+ .NbrOfConversion = 2,\
+ .DiscontinuousConvMode = DISABLE,\
+ .NbrOfDiscConversion = 0,\
+ .ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1,\
+ .ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE,\
+ .DMAContinuousRequests = ENABLE\
+}
+
+
+#if MYNEWT_VAL(ADC_3)
+
+#define STM32F4_DEFAULT_ADC_HANDLE {\
+ .Init = STM32F4_ADC_DEFAULT_INIT_TD,\
+ .Instance = ADC3,\
+ .NbrOfCurrentConversionRank = 0,\
+ .DMA_Handle = &adc_dma_handle21,\
+ .Lock = HAL_UNLOCKED,\
+ .State = 0,\
+ .ErrorCode = 0\
+}
+
+ADC_HandleTypeDef adc_handle = STM32F4_DEFAULT_ADC_HANDLE;
+
+#define STM32F4_ADC_DEFAULT_SAC_CHAN {\
+ .c_refmv = 3300,\
+ .c_res = 12,\
+ .c_configured = 1,\
+ .c_cnum = ADC_CHANNEL_4\
+}
+
+struct adc_chan_config def_sac_chan = STM32F4_ADC_DEFAULT_SAC_CHAN;
+
+#define STM32F4_ADC_DEFAULT_CONFIG {\
+ .sac_chan_count = 16,\
+ .sac_chans = &def_sac_chan,\
+ .sac_adc_handle = &adc_handle,\
+}
+
+struct stm32f4_adc_dev_cfg adc_config = STM32F4_ADC_DEFAULT_CONFIG;
+#endif
+
+
+#if MYNEWT_VAL(ADC_1)
+
+/*****************ADC1 Config ***************/
+#define STM32F4_DEFAULT_ADC_HANDLE120 {\
+ .Init = STM32F4_ADC_DEFAULT_INIT_TD,\
+ .Instance = ADC1,\
+ .NbrOfCurrentConversionRank = 0,\
+ .DMA_Handle = &adc_dma_handle20,\
+ .Lock = HAL_UNLOCKED,\
+ .State = 0,\
+ .ErrorCode = 0\
+}
+
+ADC_HandleTypeDef adc_handle120 = STM32F4_DEFAULT_ADC_HANDLE120;
+
+#define STM32F4_ADC_DEFAULT_SAC_CHAN10 {\
+ .c_refmv = 3300,\
+ .c_res = 12,\
+ .c_configured = 1,\
+ .c_cnum = ADC_CHANNEL_10\
+}
+
+struct adc_chan_config def_sac_chan10 = STM32F4_ADC_DEFAULT_SAC_CHAN10;
+
+#define STM32F4_ADC_DEFAULT_CONFIG_1_2_0_10 {\
+ .sac_chan_count = 16,\
+ .sac_chans = &def_sac_chan10,\
+ .sac_adc_handle = &adc_handle120,\
+}
+
+struct stm32f4_adc_dev_cfg adc_config12010 = STM32F4_ADC_DEFAULT_CONFIG_1_2_0_10;
+/*********************************************/
+#endif
+
void _close(int fd);
/*
@@ -97,5 +247,18 @@ bsp_init(void)
rc = os_dev_create((struct os_dev *) &hal_uart0, CONSOLE_UART,
OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)bsp_uart_config(0));
assert(rc == 0);
+#if MYNEWT_VAL(ADC_3)
+ rc = os_dev_create((struct os_dev *) &my_dev_adc3, "adc3",
+ OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+ stm32f4_adc_dev_init, &adc_config);
+ assert(rc == 0);
+#endif
+
+#if MYNEWT_VAL(ADC_1)
+ rc = os_dev_create((struct os_dev *) &my_dev_adc1, "adc1",
+ OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+ stm32f4_adc_dev_init, &adc_config12010);
+ assert(rc == 0);
+#endif
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/hw/mcu/stm/stm32f4xx/include/mcu/stm32f4xx_mynewt_hal.h
----------------------------------------------------------------------
diff --git a/hw/mcu/stm/stm32f4xx/include/mcu/stm32f4xx_mynewt_hal.h b/hw/mcu/stm/stm32f4xx/include/mcu/stm32f4xx_mynewt_hal.h
index 33e82c6..c18decd 100644
--- a/hw/mcu/stm/stm32f4xx/include/mcu/stm32f4xx_mynewt_hal.h
+++ b/hw/mcu/stm/stm32f4xx/include/mcu/stm32f4xx_mynewt_hal.h
@@ -42,6 +42,7 @@
int hal_gpio_init_stm(int pin, GPIO_InitTypeDef *cfg);
+int hal_gpio_deinit_stm(int pin, GPIO_InitTypeDef *cfg);
struct stm32f4_hal_i2c_cfg {
int sda_pin;
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/hw/mcu/stm/stm32f4xx/pkg.yml
----------------------------------------------------------------------
diff --git a/hw/mcu/stm/stm32f4xx/pkg.yml b/hw/mcu/stm/stm32f4xx/pkg.yml
index 952c6ab..83c0742 100644
--- a/hw/mcu/stm/stm32f4xx/pkg.yml
+++ b/hw/mcu/stm/stm32f4xx/pkg.yml
@@ -35,5 +35,5 @@ pkg.ign_dirs:
pkg.deps:
- hw/hal
- - libs/cmsis-core
+ - libs/cmsis-core
- compiler/arm-none-eabi-m4
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/hw/mcu/stm/stm32f4xx/src/hal_gpio.c
----------------------------------------------------------------------
diff --git a/hw/mcu/stm/stm32f4xx/src/hal_gpio.c b/hw/mcu/stm/stm32f4xx/src/hal_gpio.c
index 8778229..9fcc3bd 100644
--- a/hw/mcu/stm/stm32f4xx/src/hal_gpio.c
+++ b/hw/mcu/stm/stm32f4xx/src/hal_gpio.c
@@ -60,7 +60,7 @@
* - Multiply by 16.
* - Add port pin number.
*
- * Ex: PE11 = (4 * 16) + 11 = 75.
+ * Ex: PD11 = (3 * 16) + 11 = 59.
* PA0 = (0 * 16) + 0 = 0
*/
#define GPIO_INDEX(pin) ((pin) & 0x0F)
@@ -395,6 +395,37 @@ hal_gpio_init_stm(int pin, GPIO_InitTypeDef *cfg)
}
/**
+ * hal gpio deinit
+ *
+ * Called to deinitialize a gpio.
+ *
+ * @param pin
+ * @param cfg
+ *
+ * @return int
+ */
+int
+hal_gpio_deinit_stm(int pin, GPIO_InitTypeDef *cfg)
+{
+ int port;
+ uint32_t mcu_pin_mask;
+
+ /* Is this a valid pin? */
+ port = GPIO_PORT(pin);
+ if (port >= HAL_GPIO_NUM_PORTS) {
+ return -1;
+ }
+
+ mcu_pin_mask = GPIO_MASK(pin);
+ cfg->Pin = mcu_pin_mask;
+
+ /* Initialize pin as an input, setting proper mode */
+ HAL_GPIO_DeInit(portmap[port], cfg->Pin);
+
+ return 0;
+}
+
+/**
* gpio init in
*
* Initializes the specified pin as an input
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ade26312/hw/mcu/stm/stm32f4xx/src/hal_spi.c
----------------------------------------------------------------------
diff --git a/hw/mcu/stm/stm32f4xx/src/hal_spi.c b/hw/mcu/stm/stm32f4xx/src/hal_spi.c
index 314a24a..197cf2c 100644
--- a/hw/mcu/stm/stm32f4xx/src/hal_spi.c
+++ b/hw/mcu/stm/stm32f4xx/src/hal_spi.c
@@ -118,7 +118,7 @@ struct stm32f4_hal_spi *stm32f4_hal_spis[STM32F4_HAL_SPI_MAX] = {
}
int
-hal_spi_init(uint8_t spi_num, void *usercfg)
+hal_spi_init(int spi_num, void *usercfg, uint8_t spi_type)
{
struct stm32f4_hal_spi *spi;
struct stm32f4_hal_spi_cfg *cfg;
@@ -238,7 +238,7 @@ stm32f4_spi_resolve_prescaler(uint8_t spi_num, uint32_t baudrate, uint32_t *pres
}
int
-hal_spi_config(uint8_t spi_num, struct hal_spi_settings *settings)
+hal_spi_config(int spi_num, struct hal_spi_settings *settings)
{
struct stm32f4_hal_spi *spi;
SPI_InitTypeDef *init;
[07/10] incubator-mynewt-core git commit: MYNEWT-391 STM32F4 ADC
driver and ADC HAL support
Posted by cc...@apache.org.
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;
[09/10] incubator-mynewt-core git commit: MYNEWT-391 STM32F4 ADC
driver and ADC HAL support
Posted by cc...@apache.org.
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
- Addressing PR review
- moving gpio_init to adc_init and adding comment for intentional
fallthrough for the resolution of the gpios.
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/bc6437c1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/bc6437c1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/bc6437c1
Branch: refs/heads/develop
Commit: bc6437c158b9d5b77d19a1ce9550c18100175a20
Parents: 3db7c48
Author: Vipul Rahane <vi...@runtime.io>
Authored: Thu Sep 22 14:48:50 2016 -0700
Committer: Vipul Rahane <vi...@runtime.io>
Committed: Tue Sep 27 13:34:07 2016 -0700
----------------------------------------------------------------------
drivers/adc/adc_stm32f4/src/adc_stm32f4.c | 38 +++++++++++++++++---------
1 file changed, 25 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/bc6437c1/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 efef0b4..480464a 100644
--- a/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
+++ b/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
@@ -124,6 +124,10 @@ stm32f4_resolve_adc_gpio(ADC_HandleTypeDef *adc, uint8_t cnum)
pin = ADC12_CH15_PIN;
goto done;
}
+ /*
+ * Falling through intentionally as ADC_3 contains seperate pins for
+ * Channels that ADC_1 and ADC_2 contain as well.
+ */
case (uintptr_t)ADC3:
switch(cnum) {
case ADC_CHANNEL_0:
@@ -362,15 +366,24 @@ stm32f4_adc_dma_init(ADC_HandleTypeDef* hadc)
static void
stm32f4_adc_init(void *arg)
{
- struct stm32f4_adc_dev_cfg *adc_config = (struct stm32f4_adc_dev_cfg *)arg;
+ struct adc_dev *dev;
+ struct stm32f4_adc_dev_cfg *adc_config;
ADC_HandleTypeDef *hadc;
+ GPIO_InitTypeDef gpio_td;
+ uint8_t cnum;
- assert(adc_config);
+ assert(arg);
+ dev = (struct adc_dev *)arg;
+ adc_config = (struct stm32f4_adc_dev_cfg *)dev->ad_dev_cfg;
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);
}
@@ -445,8 +458,7 @@ stm32f4_adc_open(struct os_dev *odev, uint32_t wait, void *arg)
goto err;
}
-
- stm32f4_adc_init(dev->ad_dev_cfg);
+ stm32f4_adc_init(dev);
cfg = dev->ad_dev_cfg;
hadc = cfg->sac_adc_handle;
@@ -500,21 +512,21 @@ stm32f4_adc_configure_channel(struct adc_dev *dev, uint8_t cnum,
int rc;
ADC_HandleTypeDef *hadc;
struct stm32f4_adc_dev_cfg *cfg;
- GPIO_InitTypeDef gpio_td;
struct adc_chan_config *chan_cfg;
- assert(dev != NULL && IS_ADC_CHANNEL(cnum));
+ rc = OS_EINVAL;
+
+ if (dev != NULL && IS_ADC_CHANNEL(cnum)) {
+ goto err;
+ }
+
cfg = dev->ad_dev_cfg;
hadc = cfg->sac_adc_handle;
chan_cfg = cfg->sac_chans;
- gpio_td = stm32f4_resolve_adc_gpio(hadc, cnum);
- hal_gpio_init_stm(gpio_td.Pin, &gpio_td);
-
-
cfgdata = (ADC_ChannelConfTypeDef *)cfgdata;
- if ((rc = HAL_ADC_ConfigChannel(hadc, cfgdata)) != HAL_OK) {
+ if ((HAL_ADC_ConfigChannel(hadc, cfgdata)) != HAL_OK) {
goto err;
}
@@ -524,11 +536,11 @@ stm32f4_adc_configure_channel(struct adc_dev *dev, uint8_t cnum,
#if 0
if (HAL_ADC_Start_IT(hadc) != HAL_OK) {
- assert(0);
+ goto err;
}
#endif
- return (0);
+ return (OS_OK);
err:
return (rc);
}
[03/10] incubator-mynewt-core git commit: MYNEWT-391 STM32F4 ADC
driver and ADC HAL support
Posted by cc...@apache.org.
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
- Remove log handling from sblinky(experimental app) to resolve build errors
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/8b783b0b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/8b783b0b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/8b783b0b
Branch: refs/heads/develop
Commit: 8b783b0baa964e4f733fc34a26901d1cde52bd23
Parents: 619cf55
Author: Vipul Rahane <vi...@runtime.io>
Authored: Wed Sep 21 22:23:31 2016 -0700
Committer: Vipul Rahane <vi...@runtime.io>
Committed: Tue Sep 27 13:34:07 2016 -0700
----------------------------------------------------------------------
apps/sblinky/src/main.c | 7 -------
1 file changed, 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/8b783b0b/apps/sblinky/src/main.c
----------------------------------------------------------------------
diff --git a/apps/sblinky/src/main.c b/apps/sblinky/src/main.c
index 4277b70..2358c0d 100755
--- a/apps/sblinky/src/main.c
+++ b/apps/sblinky/src/main.c
@@ -22,7 +22,6 @@
#include "hal/hal_spi.h"
#include "console/console.h"
#include "shell/shell.h"
-#include "log/log.h"
#include "stats/stats.h"
#include "config/config.h"
#include <os/os_dev.h>
@@ -91,9 +90,6 @@ static volatile int g_task1_loops;
struct os_task task2;
os_stack_t stack2[TASK2_STACK_SIZE];
-struct log_handler log_console_handler;
-struct log my_log;
-
static volatile int g_task2_loops;
/* Global test semaphore */
@@ -589,9 +585,6 @@ main(int argc, char **argv)
os_init();
- /* Initialize the sblinky log. */
- log_console_handler_init(&log_console_handler);
- log_register("sblinky", &my_log, &log_console_handler);
#if 0
saadc_test();
#endif
[08/10] incubator-mynewt-core git commit: MYNEWT-391 STM32F4 ADC
driver and ADC HAL support
Posted by cc...@apache.org.
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
- Cleaning up and correcting the dual buf mechanism
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/619cf559
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/619cf559
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/619cf559
Branch: refs/heads/develop
Commit: 619cf55990e64eebc50648bb2ac436f2f6bde202
Parents: ade2631
Author: Vipul Rahane <vi...@runtime.io>
Authored: Wed Sep 21 16:12:20 2016 -0700
Committer: Vipul Rahane <vi...@runtime.io>
Committed: Tue Sep 27 13:34:07 2016 -0700
----------------------------------------------------------------------
apps/sblinky/src/main.c | 29 ++--
.../include/adc_stm32f4/adc_stm32f4.h | 3 +
drivers/adc/adc_stm32f4/src/adc_stm32f4.c | 131 ++++++++------
drivers/adc/include/adc/adc.h | 3 -
hw/bsp/olimex_stm32-e407_devboard/pkg.yml | 2 +-
hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c | 173 +++++++++++++------
6 files changed, 221 insertions(+), 120 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/619cf559/apps/sblinky/src/main.c
----------------------------------------------------------------------
diff --git a/apps/sblinky/src/main.c b/apps/sblinky/src/main.c
index 280f410..4277b70 100755
--- a/apps/sblinky/src/main.c
+++ b/apps/sblinky/src/main.c
@@ -240,14 +240,14 @@ saadc_test(void)
#if MYNEWT_VAL(ADC_3)
-#define STM32F4_ADC_DEFAULT_CHAN_CFG {\
+#define STM32F4_ADC3_DEFAULT_CHAN_CFG {\
.Channel = ADC_CHANNEL_4,\
.Rank = 1,\
.SamplingTime = ADC_SAMPLETIME_144CYCLES,\
.Offset = 0\
}
-ADC_ChannelConfTypeDef adc_chan_cfg = STM32F4_ADC_DEFAULT_CHAN_CFG;
+ADC_ChannelConfTypeDef adc3_chan_cfg = STM32F4_ADC3_DEFAULT_CHAN_CFG;
uint8_t *sample_buffer1;
uint8_t *sample_buffer2;
@@ -280,14 +280,14 @@ err:
#if MYNEWT_VAL(ADC_1)
-#define STM32F4_ADC_DEFAULT_CHAN_CFG10 {\
+#define STM32F4_ADC1_DEFAULT_CHAN_CFG {\
.Channel = ADC_CHANNEL_10,\
.Rank = 1,\
.SamplingTime = ADC_SAMPLETIME_144CYCLES,\
.Offset = 0\
}
-ADC_ChannelConfTypeDef adc_chan_cfg10 = STM32F4_ADC_DEFAULT_CHAN_CFG10;
+ADC_ChannelConfTypeDef adc1_chan_cfg = STM32F4_ADC1_DEFAULT_CHAN_CFG;
int adc1_result;
int my_result_mv1[ADC_NUMBER_SAMPLES];
@@ -363,10 +363,10 @@ task1_handler(void *arg)
#ifdef STM32F4
#if MYNEWT_VAL(ADC_3)
- adc_chan_config(adc3, ADC_CHANNEL_4, &adc_chan_cfg);
+ adc_chan_config(adc3, ADC_CHANNEL_4, &adc3_chan_cfg);
#endif
#if MYNEWT_VAL(ADC_1)
- adc_chan_config(adc1, ADC_CHANNEL_10, &adc_chan_cfg10);
+ adc_chan_config(adc1, ADC_CHANNEL_10, &adc1_chan_cfg);
#endif
#endif
@@ -468,15 +468,16 @@ task1_handler(void *arg)
int rc;
rc = OS_OK;
-#if MYNEWT_VAL(ADC_3)
- rc = adc_sample(adc3);
- assert(rc == OS_OK);
-#endif
#if MYNEWT_VAL(ADC_1)
rc = adc_sample(adc1);
assert(rc == OS_OK);
#endif
+
+#if MYNEWT_VAL(ADC_3)
+ rc = adc_sample(adc3);
+ assert(rc == OS_OK);
+#endif
++g_task1_loops;
#if MYNEWT_VAL(SPI_MASTER)
@@ -505,13 +506,15 @@ task1_handler(void *arg)
/* Release semaphore to task 2 */
os_sem_release(&g_test_sem);
}
-#if MYNEWT_VAL(ADC_3)
- os_dev_close((struct os_dev *) adc3);
-#endif
#if MYNEWT_VAL(ADC_1)
os_dev_close((struct os_dev *) adc1);
#endif
+
+#if MYNEWT_VAL(ADC_3)
+ os_dev_close((struct os_dev *) adc3);
+#endif
+
}
void
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/619cf559/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h
----------------------------------------------------------------------
diff --git a/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h b/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h
index ad5bc86..31f0bb4 100644
--- a/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h
+++ b/drivers/adc/adc_stm32f4/include/adc_stm32f4/adc_stm32f4.h
@@ -51,6 +51,9 @@
struct stm32f4_adc_dev_cfg {
uint8_t sac_chan_count;
void *sac_chans;
+ void *primarybuf;
+ void *secondarybuf;
+ int buflen;
ADC_HandleTypeDef *sac_adc_handle;
};
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/619cf559/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 029c267..d95c4ea 100644
--- a/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
+++ b/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
@@ -39,10 +39,13 @@ static struct adc_dev *adc_dma[5];
struct stm32f4_adc_stats {
uint16_t adc_events;
+ uint16_t adc_error;
uint16_t adc_DMA_xfer_failed;
uint16_t adc_DMA_xfer_aborted;
uint16_t adc_DMA_xfer_complete;
- uint16_t adc_error;
+ uint16_t adc_DMA_start_error;
+ uint16_t adc_DMA_overrun;
+ uint16_t adc_internal_error;
};
static struct stm32f4_adc_stats stm32f4_adc_stats;
@@ -266,32 +269,37 @@ stm32f4_resolve_dma_handle_idx(DMA_HandleTypeDef *hdma)
return ((stream_addr & 0xFF) - ((uintptr_t)DMA2_Stream0_BASE & 0xFF))/0x18;
}
-static void
-stm32f4_xfer_error_cb(DMA_HandleTypeDef *hdma)
-{
- /* DMA transfer error callback */
- stm32f4_adc_stats.adc_DMA_xfer_failed++;
-}
-
-static void
-stm32f4_xfer_abort_cb(DMA_HandleTypeDef *hdma)
-{
- /* DMA transfer Abort callback */
- stm32f4_adc_stats.adc_DMA_xfer_aborted++;
-}
-
void
HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
{
- stm32f4_adc_stats.adc_error++;
+ ++stm32f4_adc_stats.adc_error;
+
+ if (hadc->ErrorCode & HAL_ADC_ERROR_DMA) {
+ /* DMA transfer error */
+ ++stm32f4_adc_stats.adc_DMA_xfer_failed;
+ } else if (hadc->ErrorCode & HAL_ADC_ERROR_OVR) {
+ /* DMA transfer overrun */
+ ++stm32f4_adc_stats.adc_DMA_overrun;
+ } else if (hadc->ErrorCode & HAL_ADC_ERROR_INTERNAL) {
+ /* ADC IP Internal Error */
+ ++stm32f4_adc_stats.adc_internal_error;
+ }
}
+/**
+ * Callback that gets called by the HAL when ADC conversion is complete and
+ * the DMA buffer is full. If a secondary buffer exists it will the buffers.
+ *
+ * @param ADC Handle
+ */
void
HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
int rc;
struct adc_dev *adc;
DMA_HandleTypeDef *hdma;
+ struct stm32f4_adc_dev_cfg *cfg;
+ void *buf;
assert(hadc);
hdma = hadc->DMA_Handle;
@@ -299,16 +307,35 @@ HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
++stm32f4_adc_stats.adc_DMA_xfer_complete;
adc = adc_dma[stm32f4_resolve_dma_handle_idx(hdma)];
+ cfg = adc->adc_dev_cfg;
+
+ buf = cfg->primarybuf;
+ /**
+ * If primary buffer gets full and secondary buffer exists, swap the
+ * buffers and start ADC conversion with DMA with the now primary
+ * buffer(former secondary buffer)
+ * If the secondary buffer(former primary buffer) doesn't get processed
+ * by the application in sampling period required for the primary/secondary buffer
+ * i,e; (sample itvl * ADC_NUMBER_SAMPLES), the buffers would get swapped resulting
+ * in new sample data.
+ */
+ if (cfg->secondarybuf) {
+ cfg->primarybuf = cfg->secondarybuf;
+ cfg->secondarybuf = buf;
+
+ if (HAL_ADC_Start_DMA(hadc, cfg->primarybuf, cfg->buflen) != HAL_OK) {
+ ++stm32f4_adc_stats.adc_DMA_start_error;
+ }
+ }
+
+ rc = adc->ad_event_handler_func(adc, NULL, ADC_EVENT_RESULT, buf,
+ cfg->buflen);
- rc = adc->ad_event_handler_func(adc, NULL, ADC_EVENT_RESULT, adc->primarybuf,
- adc->buflen);
if (rc) {
++stm32f4_adc_stats.adc_error;
}
}
-
-//void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
static void
stm32f4_adc_dma_init(ADC_HandleTypeDef* hadc)
{
@@ -324,16 +351,6 @@ stm32f4_adc_dma_init(ADC_HandleTypeDef* hadc)
HAL_DMA_Init(hdma);
dma_handle[stm32f4_resolve_dma_handle_idx(hdma)] = hdma;
- if (HAL_DMA_RegisterCallback(hdma, HAL_DMA_XFER_ERROR_CB_ID,
- stm32f4_xfer_error_cb) != HAL_OK) {
- assert(0);
- }
-
- if (HAL_DMA_RegisterCallback(hdma, HAL_DMA_XFER_ABORT_CB_ID,
- stm32f4_xfer_abort_cb) != HAL_OK) {
- assert(0);
- }
-
NVIC_SetPriority(stm32f4_resolve_adc_dma_irq(hdma),
NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0));
NVIC_SetVector(stm32f4_resolve_adc_dma_irq(hdma),
@@ -528,16 +545,19 @@ static int
stm32f4_adc_set_buffer(struct adc_dev *dev, void *buf1, void *buf2,
int buflen)
{
+ struct stm32f4_adc_dev_cfg *cfg;
int rc;
+
+ assert(dev != NULL && buf1 != NULL);
rc = OS_OK;
buflen /= sizeof(uint16_t);
- assert(dev != NULL && buf1 != NULL);
+ cfg = dev->adc_dev_cfg;
- dev->primarybuf = buf1;
- dev->secondarybuf = buf2;
- dev->buflen = buflen;
+ cfg->primarybuf = buf1;
+ cfg->secondarybuf = buf2;
+ cfg->buflen = buflen;
return rc;
}
@@ -554,18 +574,14 @@ stm32f4_adc_release_buffer(struct adc_dev *dev, void *buf, int buf_len)
HAL_ADC_Stop_DMA(hadc);
- if (dev->primarybuf == buf) {
- if (dev->secondarybuf) {
- dev->primarybuf = dev->secondarybuf;
- dev->secondarybuf = buf;
- }
- }
-
return (0);
}
/**
* Trigger an ADC sample.
+ *
+ * @param ADC device structure
+ * @return OS_OK on success, non OS_OK on failure
*/
static int
stm32f4_adc_sample(struct adc_dev *dev)
@@ -574,13 +590,14 @@ stm32f4_adc_sample(struct adc_dev *dev)
ADC_HandleTypeDef *hadc;
struct stm32f4_adc_dev_cfg *cfg;
- assert(dev != NULL && dev->primarybuf != NULL);
+ assert(dev);
cfg = dev->adc_dev_cfg;
hadc = cfg->sac_adc_handle;
rc = OS_EINVAL;
- if (HAL_ADC_Start_DMA(hadc, dev->primarybuf, dev->buflen) != HAL_OK) {
+ if (HAL_ADC_Start_DMA(hadc, cfg->primarybuf, cfg->buflen) != HAL_OK) {
+ ++stm32f4_adc_stats.adc_DMA_start_error;
goto err;
}
@@ -592,6 +609,10 @@ err:
/**
* Blocking read of an ADC channel, returns result as an integer.
+ *
+ * @param1 ADC device structure
+ * @param2 channel number
+ * @param3 ADC result ptr
*/
static int
stm32f4_adc_read_channel(struct adc_dev *dev, uint8_t cnum, int *result)
@@ -615,11 +636,23 @@ stm32f4_adc_read_buffer(struct adc_dev *dev, void *buf, int buf_len, int off,
assert(off < buf_len);
- *result = *((uint32_t *) buf + off);
+ /*
+ * If secondary buffer exists the primary buf is going to be cached
+ * in the secondary buffer if the primary buffer is full and we
+ * would be reading that instead since the buffer is specified by
+ * the application
+ */
+ *result = *((uint32_t *)buf + off);
return (OS_OK);
}
+/**
+ * Callback to return size of buffer
+ *
+ * @param1 ADC device ptr
+ * @param2
+ */
static int
stm32f4_adc_size_buffer(struct adc_dev *dev, int chans, int samples)
{
@@ -638,6 +671,10 @@ void ADC_IRQHandler(void)
* Callback to initialize an adc_dev structure from the os device
* initialization callback. This sets up a stm32f4_adc_device(), so
* that subsequent lookups to this device allow us to manipulate it.
+ *
+ * @param1 os device ptr
+ * @param2 stm32f4 ADC device cfg ptr
+ * @return OS_OK on success
*/
int
stm32f4_adc_dev_init(struct os_dev *odev, void *arg)
@@ -654,10 +691,6 @@ stm32f4_adc_dev_init(struct os_dev *odev, void *arg)
os_mutex_init(&dev->ad_lock);
- /* Have a pointer to the init typedef from the configured
- * value. This allows non-driver specific items to be configured.
- */
-
dev->ad_chans = (void *) sac->sac_chans;
dev->ad_chan_count = sac->sac_chan_count;
@@ -674,6 +707,6 @@ stm32f4_adc_dev_init(struct os_dev *odev, void *arg)
af->af_read_buffer = stm32f4_adc_read_buffer;
af->af_size_buffer = stm32f4_adc_size_buffer;
- return (0);
+ return (OS_OK);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/619cf559/drivers/adc/include/adc/adc.h
----------------------------------------------------------------------
diff --git a/drivers/adc/include/adc/adc.h b/drivers/adc/include/adc/adc.h
index f0d4ad5..d81286e 100644
--- a/drivers/adc/include/adc/adc.h
+++ b/drivers/adc/include/adc/adc.h
@@ -158,9 +158,6 @@ struct adc_dev {
int ad_chan_count;
adc_event_handler_func_t ad_event_handler_func;
void *ad_event_handler_arg;
- void *primarybuf;
- void *secondarybuf;
- int buflen;
};
int adc_chan_config(struct adc_dev *, uint8_t, void *);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/619cf559/hw/bsp/olimex_stm32-e407_devboard/pkg.yml
----------------------------------------------------------------------
diff --git a/hw/bsp/olimex_stm32-e407_devboard/pkg.yml b/hw/bsp/olimex_stm32-e407_devboard/pkg.yml
index 41c0674..3cd2cc0 100644
--- a/hw/bsp/olimex_stm32-e407_devboard/pkg.yml
+++ b/hw/bsp/olimex_stm32-e407_devboard/pkg.yml
@@ -65,7 +65,7 @@ pkg.syscfg_defs:
value: 1
ADC_2:
description: "ADC_2"
- value: 1
+ value: 0
ADC_3:
description: "ADC_3"
value: 1
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/619cf559/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c b/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c
index 39b0bac..3edb114 100644
--- a/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c
+++ b/hw/bsp/olimex_stm32-e407_devboard/src/os_bsp.c
@@ -70,23 +70,53 @@ static struct uart_dev hal_uart0;
#if MYNEWT_VAL(ADC_1)
struct adc_dev my_dev_adc1;
#endif
-
-struct stm32f4_uart_cfg;
+#if MYNEWT_VAL(ADC_2)
+struct adc_dev my_dev_adc2;
+#endif
#if MYNEWT_VAL(ADC_3)
struct adc_dev my_dev_adc3;
#endif
+struct stm32f4_uart_cfg;
+
extern struct stm32f4_uart_cfg *bsp_uart_config(int port);
/*****************ADC3 Config ***************/
-#if MYNEWT_VAL(ADC_3)
+#if MYNEWT_VAL(ADC_1)
+/*
+ * adc_handle is defined earlier because the DMA handle's
+ * parent needs to be pointing to the adc_handle
+ */
+ADC_HandleTypeDef adc1_handle;
-ADC_HandleTypeDef adc_handle;
+#define STM32F4_DEFAULT_DMA40_HANDLE {\
+ .Instance = DMA2_Stream4,\
+ .Init.Channel = DMA_CHANNEL_0,\
+ .Init.Direction = DMA_PERIPH_TO_MEMORY,\
+ .Init.PeriphInc = DMA_PINC_DISABLE,\
+ .Init.MemInc = DMA_MINC_ENABLE,\
+ .Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD,\
+ .Init.MemDataAlignment = DMA_MDATAALIGN_WORD,\
+ .Init.Mode = DMA_CIRCULAR,\
+ .Init.Priority = DMA_PRIORITY_HIGH,\
+ .Init.FIFOMode = DMA_FIFOMODE_DISABLE,\
+ .Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL,\
+ .Init.MemBurst = DMA_MBURST_SINGLE,\
+ .Init.PeriphBurst = DMA_PBURST_SINGLE,\
+ .Parent = &adc1_handle,\
+}
-#define STM32F4_DEFAULT_DMA_HANDLE21 {\
- .Instance = DMA2_Stream1,\
- .Init.Channel = DMA_CHANNEL_2,\
+DMA_HandleTypeDef adc1_dma40_handle = STM32F4_DEFAULT_DMA40_HANDLE;
+#endif
+
+#if MYNEWT_VAL(ADC_2)
+
+ADC_HandleTypeDef adc2_handle;
+
+#define STM32F4_DEFAULT_DMA21_HANDLE {\
+ .Instance = DMA2_Stream2,\
+ .Init.Channel = DMA_CHANNEL_1,\
.Init.Direction = DMA_PERIPH_TO_MEMORY,\
.Init.PeriphInc = DMA_PINC_DISABLE,\
.Init.MemInc = DMA_MINC_ENABLE,\
@@ -98,22 +128,20 @@ ADC_HandleTypeDef adc_handle;
.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL,\
.Init.MemBurst = DMA_MBURST_SINGLE,\
.Init.PeriphBurst = DMA_PBURST_SINGLE,\
- .Parent = &adc_handle,\
+ .Parent = &adc2_handle,\
}
+
+DMA_HandleTypeDef adc2_dma21_handle = STM32F4_DEFAULT_DMA21_HANDLE;
#endif
-#if MYNEWT_VAL(ADC_1)
-/*
- * adc_handle is defined earlier because the DMA handle's
- * parent needs to be pointing to the adc_handle
- */
-ADC_HandleTypeDef adc_handle120;
-DMA_HandleTypeDef adc_dma_handle21 = STM32F4_DEFAULT_DMA_HANDLE21;
+#if MYNEWT_VAL(ADC_3)
+
+ADC_HandleTypeDef adc3_handle;
-#define STM32F4_DEFAULT_DMA_HANDLE20 {\
+#define STM32F4_DEFAULT_DMA02_HANDLE {\
.Instance = DMA2_Stream0,\
- .Init.Channel = DMA_CHANNEL_0,\
+ .Init.Channel = DMA_CHANNEL_2,\
.Init.Direction = DMA_PERIPH_TO_MEMORY,\
.Init.PeriphInc = DMA_PINC_DISABLE,\
.Init.MemInc = DMA_MINC_ENABLE,\
@@ -125,13 +153,12 @@ DMA_HandleTypeDef adc_dma_handle21 = STM32F4_DEFAULT_DMA_HANDLE21;
.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL,\
.Init.MemBurst = DMA_MBURST_SINGLE,\
.Init.PeriphBurst = DMA_PBURST_SINGLE,\
- .Parent = &adc_handle120,\
+ .Parent = &adc3_handle,\
}
-DMA_HandleTypeDef adc_dma_handle20 = STM32F4_DEFAULT_DMA_HANDLE20;
+DMA_HandleTypeDef adc3_dma02_handle = STM32F4_DEFAULT_DMA02_HANDLE;
#endif
-
#define STM32F4_ADC_DEFAULT_INIT_TD {\
.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2,\
.Resolution = ADC_RESOLUTION12b,\
@@ -147,74 +174,106 @@ DMA_HandleTypeDef adc_dma_handle20 = STM32F4_DEFAULT_DMA_HANDLE20;
.DMAContinuousRequests = ENABLE\
}
+#if MYNEWT_VAL(ADC_1)
-#if MYNEWT_VAL(ADC_3)
-
-#define STM32F4_DEFAULT_ADC_HANDLE {\
+/*****************ADC1 Config ***************/
+#define STM32F4_DEFAULT_ADC1_HANDLE {\
.Init = STM32F4_ADC_DEFAULT_INIT_TD,\
- .Instance = ADC3,\
+ .Instance = ADC1,\
.NbrOfCurrentConversionRank = 0,\
- .DMA_Handle = &adc_dma_handle21,\
+ .DMA_Handle = &adc1_dma40_handle,\
.Lock = HAL_UNLOCKED,\
.State = 0,\
.ErrorCode = 0\
}
-ADC_HandleTypeDef adc_handle = STM32F4_DEFAULT_ADC_HANDLE;
+ADC_HandleTypeDef adc1_handle = STM32F4_DEFAULT_ADC1_HANDLE;
-#define STM32F4_ADC_DEFAULT_SAC_CHAN {\
+#define STM32F4_ADC1_DEFAULT_SAC {\
.c_refmv = 3300,\
.c_res = 12,\
.c_configured = 1,\
- .c_cnum = ADC_CHANNEL_4\
+ .c_cnum = ADC_CHANNEL_10\
}
-struct adc_chan_config def_sac_chan = STM32F4_ADC_DEFAULT_SAC_CHAN;
+struct adc_chan_config adc1_chan10_config = STM32F4_ADC1_DEFAULT_SAC;
-#define STM32F4_ADC_DEFAULT_CONFIG {\
+#define STM32F4_ADC1_DEFAULT_CONFIG {\
.sac_chan_count = 16,\
- .sac_chans = &def_sac_chan,\
- .sac_adc_handle = &adc_handle,\
+ .sac_chans = &adc1_chan10_config,\
+ .sac_adc_handle = &adc1_handle,\
}
-struct stm32f4_adc_dev_cfg adc_config = STM32F4_ADC_DEFAULT_CONFIG;
+struct stm32f4_adc_dev_cfg adc1_config = STM32F4_ADC1_DEFAULT_CONFIG;
+/*********************************************/
#endif
+#if MYNEWT_VAL(ADC_2)
-#if MYNEWT_VAL(ADC_1)
-
-/*****************ADC1 Config ***************/
-#define STM32F4_DEFAULT_ADC_HANDLE120 {\
+/*****************ADC2 Config ***************/
+#define STM32F4_DEFAULT_ADC2_HANDLE {\
.Init = STM32F4_ADC_DEFAULT_INIT_TD,\
- .Instance = ADC1,\
+ .Instance = ADC2,\
.NbrOfCurrentConversionRank = 0,\
- .DMA_Handle = &adc_dma_handle20,\
+ .DMA_Handle = &adc2_dma21_handle,\
.Lock = HAL_UNLOCKED,\
.State = 0,\
.ErrorCode = 0\
}
-ADC_HandleTypeDef adc_handle120 = STM32F4_DEFAULT_ADC_HANDLE120;
+ADC_HandleTypeDef adc2_handle = STM32F4_DEFAULT_ADC2_HANDLE;
-#define STM32F4_ADC_DEFAULT_SAC_CHAN10 {\
+#define STM32F4_ADC2_DEFAULT_SAC {\
.c_refmv = 3300,\
.c_res = 12,\
.c_configured = 1,\
- .c_cnum = ADC_CHANNEL_10\
+ .c_cnum = ADC_CHANNEL_1\
}
-struct adc_chan_config def_sac_chan10 = STM32F4_ADC_DEFAULT_SAC_CHAN10;
+struct adc_chan_config adc2_chan1_config = STM32F4_ADC2_DEFAULT_SAC;
-#define STM32F4_ADC_DEFAULT_CONFIG_1_2_0_10 {\
+#define STM32F4_ADC2_DEFAULT_CONFIG {\
.sac_chan_count = 16,\
- .sac_chans = &def_sac_chan10,\
- .sac_adc_handle = &adc_handle120,\
+ .sac_chans = &adc2_chan1_config,\
+ .sac_adc_handle = &adc2_handle,\
}
-struct stm32f4_adc_dev_cfg adc_config12010 = STM32F4_ADC_DEFAULT_CONFIG_1_2_0_10;
+struct stm32f4_adc_dev_cfg adc2_config = STM32F4_ADC2_DEFAULT_CONFIG;
/*********************************************/
#endif
+#if MYNEWT_VAL(ADC_3)
+
+#define STM32F4_DEFAULT_ADC3_HANDLE {\
+ .Init = STM32F4_ADC_DEFAULT_INIT_TD,\
+ .Instance = ADC3,\
+ .NbrOfCurrentConversionRank = 0,\
+ .DMA_Handle = &adc3_dma02_handle,\
+ .Lock = HAL_UNLOCKED,\
+ .State = 0,\
+ .ErrorCode = 0\
+}
+
+ADC_HandleTypeDef adc3_handle = STM32F4_DEFAULT_ADC3_HANDLE;
+
+#define STM32F4_ADC3_DEFAULT_SAC {\
+ .c_refmv = 3300,\
+ .c_res = 12,\
+ .c_configured = 1,\
+ .c_cnum = ADC_CHANNEL_4\
+}
+
+struct adc_chan_config adc3_chan4_config = STM32F4_ADC3_DEFAULT_SAC;
+
+#define STM32F4_ADC3_DEFAULT_CONFIG {\
+ .sac_chan_count = 16,\
+ .sac_chans = &adc3_chan4_config,\
+ .sac_adc_handle = &adc3_handle,\
+}
+
+struct stm32f4_adc_dev_cfg adc3_config = STM32F4_ADC3_DEFAULT_CONFIG;
+#endif
+
void _close(int fd);
/*
@@ -247,18 +306,24 @@ bsp_init(void)
rc = os_dev_create((struct os_dev *) &hal_uart0, CONSOLE_UART,
OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)bsp_uart_config(0));
assert(rc == 0);
-#if MYNEWT_VAL(ADC_3)
- rc = os_dev_create((struct os_dev *) &my_dev_adc3, "adc3",
+#if MYNEWT_VAL(ADC_1)
+ rc = os_dev_create((struct os_dev *) &my_dev_adc1, "adc1",
OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
- stm32f4_adc_dev_init, &adc_config);
+ stm32f4_adc_dev_init, &adc1_config);
assert(rc == 0);
#endif
-
-#if MYNEWT_VAL(ADC_1)
- rc = os_dev_create((struct os_dev *) &my_dev_adc1, "adc1",
+#if MYNEWT_VAL(ADC_2)
+ rc = os_dev_create((struct os_dev *) &my_dev_adc2, "adc2",
OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
- stm32f4_adc_dev_init, &adc_config12010);
+ stm32f4_adc_dev_init, &adc2_config);
assert(rc == 0);
#endif
+#if MYNEWT_VAL(ADC_3)
+ rc = os_dev_create((struct os_dev *) &my_dev_adc3, "adc3",
+ OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+ stm32f4_adc_dev_init, &adc3_config);
+ assert(rc == 0);
+#endif
+
}
[06/10] incubator-mynewt-core git commit: MYNEWT-391 STM32F4 ADC
driver and ADC HAL support
Posted by cc...@apache.org.
MYNEWT-391 STM32F4 ADC driver and ADC HAL support
- Addressing PR review
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/3db7c48a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/3db7c48a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/3db7c48a
Branch: refs/heads/develop
Commit: 3db7c48a9d2144270ebb2bbb6c7fc8f78bbd771a
Parents: 8b783b0
Author: Vipul Rahane <vi...@runtime.io>
Authored: Thu Sep 22 13:08:18 2016 -0700
Committer: Vipul Rahane <vi...@runtime.io>
Committed: Tue Sep 27 13:34:07 2016 -0700
----------------------------------------------------------------------
drivers/adc/adc_stm32f4/src/adc_stm32f4.c | 43 +++++++++++++-------------
drivers/adc/include/adc/adc.h | 2 +-
2 files changed, 22 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/3db7c48a/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 d95c4ea..efef0b4 100644
--- a/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
+++ b/drivers/adc/adc_stm32f4/src/adc_stm32f4.c
@@ -40,11 +40,11 @@ static struct adc_dev *adc_dma[5];
struct stm32f4_adc_stats {
uint16_t adc_events;
uint16_t adc_error;
- uint16_t adc_DMA_xfer_failed;
- uint16_t adc_DMA_xfer_aborted;
- uint16_t adc_DMA_xfer_complete;
- uint16_t adc_DMA_start_error;
- uint16_t adc_DMA_overrun;
+ uint16_t adc_dma_xfer_failed;
+ uint16_t adc_dma_xfer_aborted;
+ uint16_t adc_dma_xfer_complete;
+ uint16_t adc_dma_start_error;
+ uint16_t adc_dma_overrun;
uint16_t adc_internal_error;
};
@@ -276,10 +276,10 @@ HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
if (hadc->ErrorCode & HAL_ADC_ERROR_DMA) {
/* DMA transfer error */
- ++stm32f4_adc_stats.adc_DMA_xfer_failed;
+ ++stm32f4_adc_stats.adc_dma_xfer_failed;
} else if (hadc->ErrorCode & HAL_ADC_ERROR_OVR) {
/* DMA transfer overrun */
- ++stm32f4_adc_stats.adc_DMA_overrun;
+ ++stm32f4_adc_stats.adc_dma_overrun;
} else if (hadc->ErrorCode & HAL_ADC_ERROR_INTERNAL) {
/* ADC IP Internal Error */
++stm32f4_adc_stats.adc_internal_error;
@@ -304,10 +304,10 @@ HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
assert(hadc);
hdma = hadc->DMA_Handle;
- ++stm32f4_adc_stats.adc_DMA_xfer_complete;
+ ++stm32f4_adc_stats.adc_dma_xfer_complete;
adc = adc_dma[stm32f4_resolve_dma_handle_idx(hdma)];
- cfg = adc->adc_dev_cfg;
+ cfg = adc->ad_dev_cfg;
buf = cfg->primarybuf;
/**
@@ -324,7 +324,7 @@ HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
cfg->secondarybuf = buf;
if (HAL_ADC_Start_DMA(hadc, cfg->primarybuf, cfg->buflen) != HAL_OK) {
- ++stm32f4_adc_stats.adc_DMA_start_error;
+ ++stm32f4_adc_stats.adc_dma_start_error;
}
}
@@ -386,7 +386,7 @@ stm32f4_adc_uninit(struct adc_dev *dev)
uint8_t cnum;
assert(dev);
- cfg = dev->adc_dev_cfg;
+ cfg = dev->ad_dev_cfg;
hadc = cfg->sac_adc_handle;
hdma = hadc->DMA_Handle;
cnum = dev->ad_chans->c_cnum;
@@ -446,9 +446,9 @@ stm32f4_adc_open(struct os_dev *odev, uint32_t wait, void *arg)
}
- stm32f4_adc_init(dev->adc_dev_cfg);
+ stm32f4_adc_init(dev->ad_dev_cfg);
- cfg = dev->adc_dev_cfg;
+ cfg = dev->ad_dev_cfg;
hadc = cfg->sac_adc_handle;
hdma = hadc->DMA_Handle;
@@ -504,18 +504,17 @@ stm32f4_adc_configure_channel(struct adc_dev *dev, uint8_t cnum,
struct adc_chan_config *chan_cfg;
assert(dev != NULL && IS_ADC_CHANNEL(cnum));
- cfg = dev->adc_dev_cfg;
+ cfg = dev->ad_dev_cfg;
hadc = cfg->sac_adc_handle;
chan_cfg = cfg->sac_chans;
- // Enable DMA, ADC and related GPIO ports clock
gpio_td = stm32f4_resolve_adc_gpio(hadc, cnum);
hal_gpio_init_stm(gpio_td.Pin, &gpio_td);
cfgdata = (ADC_ChannelConfTypeDef *)cfgdata;
- if((rc = HAL_ADC_ConfigChannel(hadc, cfgdata)) != HAL_OK) {
+ if ((rc = HAL_ADC_ConfigChannel(hadc, cfgdata)) != HAL_OK) {
goto err;
}
@@ -553,7 +552,7 @@ stm32f4_adc_set_buffer(struct adc_dev *dev, void *buf1, void *buf2,
rc = OS_OK;
buflen /= sizeof(uint16_t);
- cfg = dev->adc_dev_cfg;
+ cfg = dev->ad_dev_cfg;
cfg->primarybuf = buf1;
cfg->secondarybuf = buf2;
@@ -569,7 +568,7 @@ stm32f4_adc_release_buffer(struct adc_dev *dev, void *buf, int buf_len)
struct stm32f4_adc_dev_cfg *cfg;
assert(dev);
- cfg = dev->adc_dev_cfg;
+ cfg = dev->ad_dev_cfg;
hadc = cfg->sac_adc_handle;
HAL_ADC_Stop_DMA(hadc);
@@ -591,13 +590,13 @@ stm32f4_adc_sample(struct adc_dev *dev)
struct stm32f4_adc_dev_cfg *cfg;
assert(dev);
- cfg = dev->adc_dev_cfg;
+ cfg = dev->ad_dev_cfg;
hadc = cfg->sac_adc_handle;
rc = OS_EINVAL;
if (HAL_ADC_Start_DMA(hadc, cfg->primarybuf, cfg->buflen) != HAL_OK) {
- ++stm32f4_adc_stats.adc_DMA_start_error;
+ ++stm32f4_adc_stats.adc_dma_start_error;
goto err;
}
@@ -621,7 +620,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->adc_dev_cfg;
+ cfg = dev->ad_dev_cfg;
hadc = cfg->sac_adc_handle;
*result = HAL_ADC_GetValue(hadc);
@@ -697,7 +696,7 @@ 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->adc_dev_cfg = arg;
+ 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/3db7c48a/drivers/adc/include/adc/adc.h
----------------------------------------------------------------------
diff --git a/drivers/adc/include/adc/adc.h b/drivers/adc/include/adc/adc.h
index d81286e..60df1ad 100644
--- a/drivers/adc/include/adc/adc.h
+++ b/drivers/adc/include/adc/adc.h
@@ -154,7 +154,7 @@ struct adc_dev {
struct os_mutex ad_lock;
struct adc_driver_funcs ad_funcs;
struct adc_chan_config *ad_chans;
- void *adc_dev_cfg;
+ void *ad_dev_cfg;
int ad_chan_count;
adc_event_handler_func_t ad_event_handler_func;
void *ad_event_handler_arg;