You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2018/12/05 14:34:37 UTC

[mynewt-core] 06/08: hw/drivers/lis2dh12: Add proper I2C/SPI interface handling

This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit 4a246d17bba2d5e89ebf9f7dc2749c71ff3ac70d
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Tue Dec 4 17:48:55 2018 +0100

    hw/drivers/lis2dh12: Add proper I2C/SPI interface handling
---
 .../sensors/lis2dh12/include/lis2dh12/lis2dh12.h   |  3 +++
 hw/drivers/sensors/lis2dh12/src/lis2dh12.c         | 26 ++++++++++++++++++++--
 hw/drivers/sensors/lis2dh12/src/lis2dh12_priv.h    |  4 ++--
 3 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h b/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h
index b7b86ca..fe89b57 100644
--- a/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h
+++ b/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h
@@ -274,6 +274,9 @@ struct lis2dh12 {
     struct lis2dh12_int intr;
     os_time_t last_read_time;
     struct lis2dh12_pdd pdd;
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    bool node_is_spi;
+#endif
 };
 
 /**
diff --git a/hw/drivers/sensors/lis2dh12/src/lis2dh12.c b/hw/drivers/sensors/lis2dh12/src/lis2dh12.c
index 41bdce6..20042f8 100644
--- a/hw/drivers/sensors/lis2dh12/src/lis2dh12.c
+++ b/hw/drivers/sensors/lis2dh12/src/lis2dh12.c
@@ -236,7 +236,7 @@ lis2dh12_i2c_readlen(struct sensor_itf *itf, uint8_t addr, uint8_t *buffer,
     int rc;
     if (len > 1)
     {
-        addr |= 0x80;
+        addr |= LIS2DH12_I2C_ADDR_INC;
     }
 
     uint8_t payload[20] = { addr, 0, 0, 0, 0, 0, 0, 0,
@@ -310,7 +310,7 @@ lis2dh12_spi_readlen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload,
      * requested is more than 1
      */
     if (len > 1) {
-        addr |= LIS2DH12_SPI_ADR_INC;
+        addr |= LIS2DH12_SPI_ADDR_INC;
     }
 
     /* Select the device */
@@ -483,6 +483,13 @@ lis2dh12_writelen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload,
          */
         uint8_t payload[19];
     } write_data;
+    struct lis2dh12 *dev = (struct lis2dh12 *)itf->si_dev;
+
+    if (dev->node_is_spi) {
+        addr |= LIS2DH12_SPI_ADDR_INC;
+    } else {
+        addr |= LIS2DH12_I2C_ADDR_INC;
+    }
 
     if (len > sizeof(write_data.payload)) {
         return -1;
@@ -526,6 +533,15 @@ lis2dh12_readlen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload,
     int rc;
 
 #if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    struct lis2dh12 *dev = (struct lis2dh12 *)itf->si_dev;
+
+    if (dev->node_is_spi) {
+        addr |= LIS2DH12_SPI_READ_CMD_BIT;
+        addr |= LIS2DH12_SPI_ADDR_INC;
+    } else {
+        addr |= LIS2DH12_I2C_ADDR_INC;
+    }
+
     rc = bus_node_simple_write_read_transact(itf->si_dev, &addr, 1, payload, len);
 #else
     rc = sensor_itf_lock(itf, MYNEWT_VAL(LIS2DH12_ITF_LOCK_TMO));
@@ -3019,11 +3035,14 @@ lis2dh12_create_i2c_sensor_dev(struct bus_i2c_node *node, const char *name,
                                const struct bus_i2c_node_cfg *i2c_cfg,
                                struct sensor_itf *sensor_itf)
 {
+    struct lis2dh12 *dev = (struct lis2dh12 *)node;
     struct bus_node_callbacks cbs = {
         .init = init_node_cb,
     };
     int rc;
 
+    dev->node_is_spi = false;
+
     bus_node_set_callbacks((struct os_dev *)node, &cbs);
 
     rc = bus_i2c_node_create(name, node, i2c_cfg, sensor_itf);
@@ -3036,11 +3055,14 @@ lis2dh12_create_spi_sensor_dev(struct bus_spi_node *node, const char *name,
                                const struct bus_spi_node_cfg *spi_cfg,
                                struct sensor_itf *sensor_itf)
 {
+    struct lis2dh12 *dev = (struct lis2dh12 *)node;
     struct bus_node_callbacks cbs = {
         .init = init_node_cb,
     };
     int rc;
 
+    dev->node_is_spi = true;
+
     bus_node_set_callbacks((struct os_dev *)node, &cbs);
 
     rc = bus_spi_node_create(name, node, spi_cfg, sensor_itf);
diff --git a/hw/drivers/sensors/lis2dh12/src/lis2dh12_priv.h b/hw/drivers/sensors/lis2dh12/src/lis2dh12_priv.h
index 6848b15..035a2ce 100644
--- a/hw/drivers/sensors/lis2dh12/src/lis2dh12_priv.h
+++ b/hw/drivers/sensors/lis2dh12/src/lis2dh12_priv.h
@@ -171,8 +171,8 @@ extern "C" {
 #define LIS2DH12_REG_ACT_DUR                 0x3F
 
 #define LIS2DH12_SPI_READ_CMD_BIT            0x80
-
-#define LIS2DH12_SPI_ADR_INC                 0x40
+#define LIS2DH12_SPI_ADDR_INC                0x40
+#define LIS2DH12_I2C_ADDR_INC                0x80
 
 int lis2dh12_writelen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload, uint8_t len);
 int lis2dh12_readlen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload, uint8_t len);