You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ma...@apache.org on 2016/10/10 19:06:26 UTC

[2/5] incubator-mynewt-core git commit: stm32f4xx; HAL I2C driver

stm32f4xx; HAL I2C 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/6b7140db
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/6b7140db
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/6b7140db

Branch: refs/heads/develop
Commit: 6b7140dbc58b5d228b57f286d9c659d3733bc4b3
Parents: ea57fe1
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Mon Oct 10 11:58:12 2016 -0700
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Mon Oct 10 11:58:12 2016 -0700

----------------------------------------------------------------------
 .../include/mcu/stm32f4xx_mynewt_hal.h          |  11 +-
 hw/mcu/stm/stm32f4xx/src/hal_i2c.c              | 210 +++++++------------
 2 files changed, 85 insertions(+), 136 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/6b7140db/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 343fc4a..5a4659d 100644
--- a/hw/mcu/stm/stm32f4xx/include/mcu/stm32f4xx_mynewt_hal.h
+++ b/hw/mcu/stm/stm32f4xx/include/mcu/stm32f4xx_mynewt_hal.h
@@ -49,9 +49,14 @@ 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;
-    int scl_pin;
-    I2C_InitTypeDef *i2c_settings;
+    I2C_TypeDef *hic_i2c;
+    volatile uint32_t *hic_rcc_reg;		/* RCC register to modify */
+    uint32_t hic_rcc_dev;			/* RCC device ID */
+    uint8_t hic_pin_sda;
+    uint8_t hic_pin_scl;
+    uint8_t hic_pin_af;
+    uint8_t hic_10bit;
+    uint32_t hic_speed;
 };
 
 struct stm32f4_hal_spi_cfg {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/6b7140db/hw/mcu/stm/stm32f4xx/src/hal_i2c.c
----------------------------------------------------------------------
diff --git a/hw/mcu/stm/stm32f4xx/src/hal_i2c.c b/hw/mcu/stm/stm32f4xx/src/hal_i2c.c
index b11244b..1dad92a 100644
--- a/hw/mcu/stm/stm32f4xx/src/hal_i2c.c
+++ b/hw/mcu/stm/stm32f4xx/src/hal_i2c.c
@@ -17,213 +17,157 @@
  * under the License.
  */
 
-#include <hal/hal_i2c.h>
-#include <hal/hal_gpio.h>
-
 #include <string.h>
-#include <errno.h>
-
+#include <stdlib.h>
 #include <assert.h>
 
+#include <syscfg/syscfg.h>
+
+#include <hal/hal_i2c.h>
+#include <hal/hal_gpio.h>
+
 #include "stm32f4xx.h"
 #include "stm32f4xx_hal_dma.h"
 #include "stm32f4xx_hal_i2c.h"
 #include "stm32f4xx_hal_gpio.h"
 #include "stm32f4xx_hal_rcc.h"
 #include "mcu/stm32f4xx_mynewt_hal.h"
+#include "mcu/stm32f4_bsp.h"
+
+#define HAL_I2C_MAX_DEVS	3
 
-#define STM32F4_HAL_I2C_TIMEOUT (1000)
+#define I2C_ADDRESS 		0xae
 
 struct stm32f4_hal_i2c {
-    I2C_HandleTypeDef handle;
+    I2C_HandleTypeDef hid_handle;
+    int hid_locked;
 };
 
-#define STM32_HAL_I2C_MAX (3)
-
-#ifdef I2C1
-struct stm32f4_hal_i2c hal_i2c1;
-#else
-#define __HAL_RCC_I2C1_CLK_ENABLE()
+#if MYNEWT_VAL(I2C_0)
+static struct stm32f4_hal_i2c i2c0;
 #endif
-
-#ifdef I2C2
-struct stm32f4_hal_i2c hal_i2c2;
-#else
-#define __HAL_RCC_I2C2_CLK_ENABLE()
+#if MYNEWT_VAL(I2C_1)
+static struct stm32f4_hal_i2c i2c1;
 #endif
-
-#ifdef I2C3
-struct stm32f4_hal_i2c hal_i2c3;
-#else
-#define __HAL_RCC_I2C3_CLK_ENABLE()
+#if MYNEWT_VAL(I2C_2)
+static struct stm32f4_hal_i2c i2c2;
 #endif
 
-static const struct stm32f4_hal_i2c *stm32f4_hal_i2cs[STM32_HAL_I2C_MAX] = {
-#ifdef I2C1
-        &hal_i2c1,
+static struct stm32f4_hal_i2c *hal_i2c_devs[HAL_I2C_MAX_DEVS] = {
+#if MYNEWT_VAL(I2C_0)
+    &i2c0,
 #else
-        NULL,
+    NULL,
 #endif
-#ifdef I2C2
-        &hal_i2c2,
+#if MYNEWT_VAL(I2C_1)
+    &i2c1,
 #else
-        NULL,
+    NULL,
 #endif
-#ifdef I2C3
-        &hal_i2c3,
+#if MYNEWT_VAL(I2C_2)
+    &i2c2,
 #else
-        NULL,
+    NULL,
 #endif
 };
 
-#define STM32_HAL_I2C_RESOLVE(__n, __v)                          \
-    if ((__n) >= STM32_HAL_I2C_MAX) {                            \
-        rc = EINVAL;                                             \
-        goto err;                                                \
-    }                                                            \
-    (__v) = (struct stm32f4_hal_i2c *) stm32f4_hal_i2cs[(__n)];  \
-    if ((__v) == NULL) {                                         \
-        rc = EINVAL;                                             \
-        goto err;                                                \
-    }
-
 int
 hal_i2c_init(uint8_t i2c_num, void *usercfg)
 {
-    GPIO_InitTypeDef pcf;
-    struct stm32f4_hal_i2c *i2c;
-    struct stm32f4_hal_i2c_cfg *cfg;
+    struct stm32f4_hal_i2c_cfg *cfg = (struct stm32f4_hal_i2c_cfg *)usercfg;
+    struct stm32f4_hal_i2c *dev;
+    I2C_InitTypeDef *init;
     int rc;
 
-    STM32_HAL_I2C_RESOLVE(i2c_num, i2c);
-
-    cfg = (struct stm32f4_hal_i2c_cfg *) usercfg;
-    assert(cfg != NULL);
-
-    pcf.Mode = GPIO_MODE_OUTPUT_PP;
-    pcf.Pull = GPIO_PULLUP;
-    pcf.Speed = GPIO_SPEED_FREQ_MEDIUM;
-    pcf.Alternate = 0;
-
-    rc = hal_gpio_init_stm(cfg->sda_pin, &pcf);
-    if (rc != 0) {
-        goto err;
+    if (i2c_num > HAL_I2C_MAX_DEVS || !(dev = hal_i2c_devs[i2c_num])) {
+        return -1;
     }
 
-    rc = hal_gpio_init_stm(cfg->scl_pin, &pcf);
-    if (rc != 0) {
-        goto err;
+    init = &dev->hid_handle.Init;
+    dev->hid_handle.Instance = cfg->hic_i2c;
+    init->ClockSpeed = cfg->hic_speed;
+    if (cfg->hic_10bit) {
+        init->AddressingMode = I2C_ADDRESSINGMODE_10BIT;
+    } else {
+        init->AddressingMode = I2C_ADDRESSINGMODE_7BIT;
     }
-
-    /* Configure I2C */
-    switch (i2c_num) {
-        case 0:
-            __HAL_RCC_I2C1_CLK_ENABLE();
-            break;
-        case 1:
-            __HAL_RCC_I2C2_CLK_ENABLE();
-            break;
-        case 2:
-            __HAL_RCC_I2C3_CLK_ENABLE();
-            break;
-        default:
-            rc = EINVAL;
-            goto err;
+    init->OwnAddress1 = I2C_ADDRESS;
+    init->OwnAddress2 = 0xFE;
+
+    /*
+     * Configure GPIO pins for I2C.
+     * Enable clock routing for I2C.
+     */
+    rc = hal_gpio_init_af(cfg->hic_pin_sda, cfg->hic_pin_af, GPIO_PULL_UP, 1);
+    if (rc) {
+        goto err;
     }
-
-    if (cfg->i2c_settings != NULL) {
-        /* Copy user defined settings onto the handle */
-        memcpy(&i2c->handle.Init, cfg->i2c_settings, sizeof(I2C_InitTypeDef));
-    } else {
-        /* Initialize with default I2C Settings */
+    rc = hal_gpio_init_af(cfg->hic_pin_scl, cfg->hic_pin_af, GPIO_PULL_UP, 1);
+    if (rc) {
+        goto err;
     }
-
-    rc = HAL_I2C_Init(&i2c->handle);
-    if (rc != 0) {
+    *cfg->hic_rcc_reg |= cfg->hic_rcc_dev;
+    rc = HAL_I2C_Init(&dev->hid_handle);
+    if (rc) {
         goto err;
     }
 
-    return (0);
+    return 0;
 err:
-    return (rc);
+    *cfg->hic_rcc_reg &= ~cfg->hic_rcc_dev;
+    return rc;
 }
 
 int
-hal_i2c_master_write(uint8_t i2c_num, struct hal_i2c_master_data *pdata,
+hal_i2c_master_write(uint8_t i2c_num, struct hal_i2c_master_data *data,
   uint32_t timo)
 {
-    struct stm32f4_hal_i2c *i2c;
-    int rc;
-
-    STM32_HAL_I2C_RESOLVE(i2c_num, i2c);
+    struct stm32f4_hal_i2c *dev;
 
-    rc = HAL_I2C_Master_Transmit_IT(&i2c->handle, pdata->address, pdata->buffer,
-            pdata->len);
-    if (rc != 0) {
-        goto err;
+    if (i2c_num > HAL_I2C_MAX_DEVS || !(dev = hal_i2c_devs[i2c_num])) {
+        return -1;
     }
 
-    return (0);
-err:
-    return (rc);
+    return HAL_I2C_Master_Transmit(&dev->hid_handle, data->address << 1,
+      data->buffer, data->len, timo);
 }
 
 int
 hal_i2c_master_read(uint8_t i2c_num, struct hal_i2c_master_data *pdata,
   uint32_t timo)
 {
-    struct stm32f4_hal_i2c *i2c;
-    int rc;
+    struct stm32f4_hal_i2c *dev;
 
-    STM32_HAL_I2C_RESOLVE(i2c_num, i2c);
-
-    rc = HAL_I2C_Master_Receive_IT(&i2c->handle, pdata->address, pdata->buffer,
-            pdata->len);
-    if (rc != 0) {
-        goto err;
+    if (i2c_num > HAL_I2C_MAX_DEVS || !(dev = hal_i2c_devs[i2c_num])) {
+        return -1;
     }
 
-    return (0);
-err:
-    return (rc);
+    return HAL_I2C_Master_Receive(&dev->hid_handle, pdata->address << 1,
+      pdata->buffer, pdata->len, timo);
 }
 
 int
 hal_i2c_master_begin(uint8_t i2c_num)
 {
-    return (0);
+    return 0;
 }
 
 int
 hal_i2c_master_end(uint8_t i2c_num)
 {
-    struct stm32f4_hal_i2c *i2c;
-    int rc;
-
-    STM32_HAL_I2C_RESOLVE(i2c_num, i2c);
-
-    i2c->handle.Instance->CR1 |= I2C_CR1_STOP;
-
-    return (0);
-err:
-    return (rc);
+    return 0;
 }
 
 int
 hal_i2c_master_probe(uint8_t i2c_num, uint8_t address, uint32_t timo)
 {
-    struct stm32f4_hal_i2c *i2c;
+    struct stm32f4_hal_i2c *dev;
     int rc;
 
-    STM32_HAL_I2C_RESOLVE(i2c_num, i2c);
-
-    rc = HAL_I2C_IsDeviceReady(&i2c->handle, address, 1,
-            STM32F4_HAL_I2C_TIMEOUT);
-    if (rc != 0) {
-        goto err;
+    if (i2c_num > HAL_I2C_MAX_DEVS || !(dev = hal_i2c_devs[i2c_num])) {
+        return -1;
     }
 
-    return (0);
-err:
-    return (rc);
+    rc = HAL_I2C_IsDeviceReady(&dev->hid_handle, address, 1, timo);
+    return rc;
 }