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

[GitHub] andrzej-kaczmarek closed pull request #1544: hw/bus: Updates, fixes...

andrzej-kaczmarek closed pull request #1544: hw/bus: Updates, fixes...
URL: https://github.com/apache/mynewt-core/pull/1544
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/hw/bus/include/bus/bus.h b/hw/bus/include/bus/bus.h
index 9158570ceb..9e1ec03fbc 100644
--- a/hw/bus/include/bus/bus.h
+++ b/hw/bus/include/bus/bus.h
@@ -221,7 +221,7 @@ bus_node_unlock(struct os_dev *node);
 /**
  * Get node configured lock timeout
  *
- * Returns lock timeout as configured for node. If not timeout is configured for
+ * Returns lock timeout as configured for node. If no timeout is configured for
  * give node or no node is specified, default timeout is returned.
  *
  * @param node  Node to get timeout for
diff --git a/hw/bus/include/bus/bus_driver.h b/hw/bus/include/bus/bus_driver.h
index 04306e5e38..5ad822f794 100644
--- a/hw/bus/include/bus/bus_driver.h
+++ b/hw/bus/include/bus/bus_driver.h
@@ -22,6 +22,9 @@
 
 #include <stdint.h>
 #include "os/mynewt.h"
+#if MYNEWT_VAL(BUS_STATS)
+#include "stats/stats.h"
+#endif
 
 #ifdef __cplusplus
 extern "C" {
@@ -30,6 +33,16 @@ extern "C" {
 struct bus_dev;
 struct bus_node;
 
+#if MYNEWT_VAL(BUS_STATS)
+STATS_SECT_START(bus_stats_section)
+    STATS_SECT_ENTRY(lock_timeouts)
+    STATS_SECT_ENTRY(read_ops)
+    STATS_SECT_ENTRY(read_errors)
+    STATS_SECT_ENTRY(write_ops)
+    STATS_SECT_ENTRY(write_errors)
+STATS_SECT_END
+#endif
+
 /**
  * Bus device operations
  *
@@ -73,6 +86,8 @@ struct bus_node_callbacks {
 struct bus_node_cfg {
     /** Bus device name where node is attached */
     const char *bus_name;
+    /** Lock timeout [ms], 0 = default timeout */
+    uint16_t lock_timeout_ms;
 };
 
 /**
@@ -88,6 +103,10 @@ struct bus_dev {
     struct os_mutex lock;
     struct bus_node *configured_for;
 
+#if MYNEWT_VAL(BUS_STATS)
+    STATS_SECT_DECL(bus_stats_section) stats;
+#endif
+
 #if MYNEWT_VAL(BUS_DEBUG_OS_DEV)
     uint32_t devmagic;
 #endif
@@ -112,6 +131,12 @@ struct bus_node {
         void *init_arg;
     };
 
+    os_time_t lock_timeout;
+
+#if MYNEWT_VAL(BUS_STATS_PER_NODE)
+    STATS_SECT_DECL(bus_stats_section) stats;
+#endif
+
 #if MYNEWT_VAL(BUS_DEBUG_OS_DEV)
     uint32_t nodemagic;
 #endif
diff --git a/hw/bus/src/bus.c b/hw/bus/src/bus.c
index c555f17ac5..6f987fb07b 100644
--- a/hw/bus/src/bus.c
+++ b/hw/bus/src/bus.c
@@ -23,9 +23,39 @@
 #include "bus/bus.h"
 #include "bus/bus_debug.h"
 #include "bus/bus_driver.h"
+#if MYNEWT_VAL(BUS_STATS)
+#include "stats/stats.h"
+#endif
 
 static os_time_t g_bus_node_lock_timeout;
 
+#if MYNEWT_VAL(BUS_STATS)
+STATS_NAME_START(bus_stats_section)
+    STATS_NAME(bus_stats_section, lock_timeouts)
+    STATS_NAME(bus_stats_section, read_ops)
+    STATS_NAME(bus_stats_section, read_errors)
+    STATS_NAME(bus_stats_section, write_ops)
+    STATS_NAME(bus_stats_section, write_errors)
+STATS_NAME_END(bus_stats_section)
+
+#if MYNEWT_VAL(BUS_STATS_PER_NODE)
+#define BUS_STATS_INC(_bdev, _bnode, _var)  \
+    do {                                    \
+        STATS_INC((_bdev)->stats, _var);    \
+        STATS_INC((_bnode)->stats, _var);   \
+    } while (0)
+#else
+#define BUS_STATS_INC(_bdev, _bnode, _var)  \
+    do {                                    \
+        STATS_INC((_bdev)->stats, _var);    \
+    } while (0)
+#endif
+#else
+#define BUS_STATS_INC(_bdev, _bnode, _var)  \
+    do {                                    \
+    } while (0)
+#endif
+
 static int
 bus_node_open_func(struct os_dev *odev, uint32_t wait, void *arg)
 {
@@ -92,6 +122,9 @@ bus_dev_init_func(struct os_dev *odev, void *arg)
 {
     struct bus_dev *bdev = (struct bus_dev *)odev;
     struct bus_dev_ops *ops = arg;
+#if MYNEWT_VAL(BUS_STATS)
+    char *stats_name;
+#endif
 
     BUS_DEBUG_POISON_DEV(bdev);
 
@@ -100,6 +133,15 @@ bus_dev_init_func(struct os_dev *odev, void *arg)
 
     os_mutex_init(&bdev->lock);
 
+#if MYNEWT_VAL(BUS_STATS)
+    asprintf(&stats_name, "bd_%s", odev->od_name);
+    /* XXX should we assert or return error on failure? */
+    stats_init_and_reg(STATS_HDR(bdev->stats),
+                       STATS_SIZE_INIT_PARMS(bdev->stats, STATS_SIZE_32),
+                       STATS_NAME_INIT_PARMS(bus_stats_section),
+                       stats_name);
+#endif
+
     return 0;
 }
 
@@ -110,6 +152,9 @@ bus_node_init_func(struct os_dev *odev, void *arg)
     struct bus_node_cfg *node_cfg = arg;
     struct os_dev *parent_odev;
     void *init_arg;
+#if MYNEWT_VAL(BUS_STATS_PER_NODE)
+    char *stats_name;
+#endif
 
     parent_odev = os_dev_lookup(node_cfg->bus_name);
     if (!parent_odev) {
@@ -122,9 +167,25 @@ bus_node_init_func(struct os_dev *odev, void *arg)
     init_arg = bnode->init_arg;
     bnode->parent_bus = (struct bus_dev *)parent_odev;
 
+    if (node_cfg->lock_timeout_ms) {
+        bnode->lock_timeout = os_time_ms_to_ticks32(node_cfg->lock_timeout_ms);
+    } else {
+        /* Use default */
+        bnode->lock_timeout = 0;
+    }
+
     odev->od_handlers.od_open = bus_node_open_func;
     odev->od_handlers.od_close = bus_node_close_func;
 
+#if MYNEWT_VAL(BUS_STATS_PER_NODE)
+    asprintf(&stats_name, "bn_%s", odev->od_name);
+    /* XXX should we assert or return error on failure? */
+    stats_init_and_reg(STATS_HDR(bnode->stats),
+                       STATS_SIZE_INIT_PARMS(bnode->stats, STATS_SIZE_32),
+                       STATS_NAME_INIT_PARMS(bus_stats_section),
+                       stats_name);
+#endif
+
     if (bnode->callbacks.init) {
         bnode->callbacks.init(bnode, init_arg);
     }
@@ -147,12 +208,16 @@ bus_node_read(struct os_dev *node, void *buf, uint16_t length,
         return SYS_ENOTSUP;
     }
 
-    rc = bus_node_lock(node, g_bus_node_lock_timeout);
+    rc = bus_node_lock(node, bus_node_get_lock_timeout(node));
     if (rc) {
         return rc;
     }
 
+    BUS_STATS_INC(bdev, bnode, read_ops);
     rc = bdev->dops->read(bdev, bnode, buf, length, timeout, flags);
+    if (rc) {
+        BUS_STATS_INC(bdev, bnode, read_errors);
+    }
 
     (void)bus_node_unlock(node);
 
@@ -174,12 +239,16 @@ bus_node_write(struct os_dev *node, const void *buf, uint16_t length,
         return SYS_ENOTSUP;
     }
 
-    rc = bus_node_lock(node, g_bus_node_lock_timeout);
+    rc = bus_node_lock(node, bus_node_get_lock_timeout(node));
     if (rc) {
         return rc;
     }
 
+    BUS_STATS_INC(bdev, bnode, write_ops);
     rc = bdev->dops->write(bdev, bnode, buf, length, timeout, flags);
+    if (rc) {
+        BUS_STATS_INC(bdev, bnode, write_errors);
+    }
 
     (void)bus_node_unlock(node);
 
@@ -202,7 +271,7 @@ bus_node_write_read_transact(struct os_dev *node, const void *wbuf,
         return SYS_ENOTSUP;
     }
 
-    rc = bus_node_lock(node, g_bus_node_lock_timeout);
+    rc = bus_node_lock(node, bus_node_get_lock_timeout(node));
     if (rc) {
         return rc;
     }
@@ -213,13 +282,17 @@ bus_node_write_read_transact(struct os_dev *node, const void *wbuf,
      * too many flags now (like we literally have only one flag) let's just pass
      * no flags for now
      */
+    BUS_STATS_INC(bdev, bnode, write_ops);
     rc = bdev->dops->write(bdev, bnode, wbuf, wlength, timeout, BUS_F_NOSTOP);
     if (rc) {
+        BUS_STATS_INC(bdev, bnode, write_errors);
         goto done;
     }
 
+    BUS_STATS_INC(bdev, bnode, read_ops);
     rc = bdev->dops->read(bdev, bnode, rbuf, rlength, timeout, flags);
     if (rc) {
+        BUS_STATS_INC(bdev, bnode, read_errors);
         goto done;
     }
 
@@ -247,6 +320,7 @@ bus_node_lock(struct os_dev *node, os_time_t timeout)
 
     err = os_mutex_pend(&bdev->lock, timeout);
     if (err == OS_TIMEOUT) {
+        BUS_STATS_INC(bdev, bnode, lock_timeouts);
         return SYS_ETIMEOUT;
     }
 
@@ -295,7 +369,9 @@ bus_node_unlock(struct os_dev *node)
 os_time_t
 bus_node_get_lock_timeout(struct os_dev *node)
 {
-    return g_bus_node_lock_timeout;
+    struct bus_node *bnode = (struct bus_node *)node;
+
+    return bnode->lock_timeout ? bnode->lock_timeout : g_bus_node_lock_timeout;
 }
 
 void
diff --git a/hw/bus/syscfg.yml b/hw/bus/syscfg.yml
index b7e03f362f..db25199772 100644
--- a/hw/bus/syscfg.yml
+++ b/hw/bus/syscfg.yml
@@ -32,6 +32,18 @@ syscfg.defs:
             transaction APIs (i.e. without timeout set explicitly)
         value: 50
 
+    BUS_STATS:
+        description: >
+            Enable statistics for bus devices. By default only global per-device
+            statistics are enabled. Use BUS_STATS_PER_NODE to enable statistics
+            for each node also.
+        value: 0
+    BUS_STATS_PER_NODE:
+        description: >
+            Enable per-node statistics for each bus node.
+        value: 0
+        restrictions: BUS_STATS
+
     BUS_DEBUG_OS_DEV:
         description: >
             Enable additional debugging for os_dev objects.
diff --git a/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h b/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h
index b7b86ca8c8..fe89b572d1 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 41bdce6967..20042f8940 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 6848b15bdd..035a2ce7c8 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);
diff --git a/hw/drivers/sensors/lis2dw12/include/lis2dw12/lis2dw12.h b/hw/drivers/sensors/lis2dw12/include/lis2dw12/lis2dw12.h
index 7148269039..53afb510d0 100644
--- a/hw/drivers/sensors/lis2dw12/include/lis2dw12/lis2dw12.h
+++ b/hw/drivers/sensors/lis2dw12/include/lis2dw12/lis2dw12.h
@@ -285,6 +285,9 @@ struct lis2dw12 {
     struct lis2dw12_cfg cfg;
     struct lis2dw12_int intr;
     struct lis2dw12_pdd pdd;
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    bool node_is_spi;
+#endif
 };
 
 /**
diff --git a/hw/drivers/sensors/lis2dw12/src/lis2dw12.c b/hw/drivers/sensors/lis2dw12/src/lis2dw12.c
index d8b2e38ee0..f81af8a628 100644
--- a/hw/drivers/sensors/lis2dw12/src/lis2dw12.c
+++ b/hw/drivers/sensors/lis2dw12/src/lis2dw12.c
@@ -515,6 +515,12 @@ lis2dw12_readlen(struct sensor_itf *itf, uint8_t reg, uint8_t *buffer,
     int rc;
 
 #if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    struct lis2dw12 *dev = (struct lis2dw12 *)itf->si_dev;
+
+    if (dev->node_is_spi) {
+        reg |= LIS2DW12_SPI_READ_CMD_BIT;
+    }
+
     rc = bus_node_simple_write_read_transact(itf->si_dev, &reg, 1, buffer, len);
 #else
     rc = sensor_itf_lock(itf, MYNEWT_VAL(LIS2DW12_ITF_LOCK_TMO));
@@ -3362,11 +3368,14 @@ lis2dw12_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 lis2dw12 *dev = (struct lis2dw12 *)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);
@@ -3379,11 +3388,14 @@ lis2dw12_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 lis2dw12 *dev = (struct lis2dw12 *)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/lps33hw/include/lps33hw/lps33hw.h b/hw/drivers/sensors/lps33hw/include/lps33hw/lps33hw.h
index baa9a316f9..014da64a0c 100644
--- a/hw/drivers/sensors/lps33hw/include/lps33hw/lps33hw.h
+++ b/hw/drivers/sensors/lps33hw/include/lps33hw/lps33hw.h
@@ -82,7 +82,10 @@ struct lps33hw_private_driver_data {
 
 struct lps33hw {
 #if MYNEWT_VAL(BUS_DRIVER_PRESENT)
-    struct bus_i2c_node i2c_node;
+    union {
+        struct bus_i2c_node i2c_node;
+        struct bus_spi_node spi_node;
+    };
 #else
     struct os_dev dev;
 #endif
@@ -90,6 +93,9 @@ struct lps33hw {
     struct lps33hw_cfg cfg;
     os_time_t last_read_time;
     struct lps33hw_private_driver_data pdd;
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    bool node_is_spi;
+#endif
 };
 
 /**
@@ -235,6 +241,21 @@ int
 lps33hw_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);
+
+/**
+ * Create SPI bus node for LPS33HW sensor
+ *
+ * @param node        Bus node
+ * @param name        Device name
+ * @param spi_cfg     SPI node configuration
+ * @param sensor_itf  Sensors interface
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+lps33hw_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);
 #endif
 
 #ifdef __cplusplus
diff --git a/hw/drivers/sensors/lps33hw/src/lps33hw.c b/hw/drivers/sensors/lps33hw/src/lps33hw.c
index 7cc221b81e..d215b36f57 100644
--- a/hw/drivers/sensors/lps33hw/src/lps33hw.c
+++ b/hw/drivers/sensors/lps33hw/src/lps33hw.c
@@ -404,6 +404,12 @@ lps33hw_get_regs(struct sensor_itf *itf, uint8_t reg, uint8_t size,
     int rc;
 
 #if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    struct lps33hw *dev = (struct lps33hw *)itf->si_dev;
+
+    if (dev->node_is_spi) {
+        reg |= LPS33HW_SPI_READ_CMD_BIT;
+    }
+
     rc = bus_node_simple_write_read_transact(itf->si_dev, &reg, 1, buffer, size);
 #else
     rc = sensor_itf_lock(itf, MYNEWT_VAL(LPS33HW_ITF_LOCK_TMO));
@@ -1121,15 +1127,38 @@ lps33hw_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 lps33hw *dev = (struct lps33hw *)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);
 
     return rc;
 }
+
+int
+lps33hw_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 lps33hw *dev = (struct lps33hw *)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);
+
+    return rc;
+}
 #endif
diff --git a/hw/drivers/sensors/lps33thw/include/lps33thw/lps33thw.h b/hw/drivers/sensors/lps33thw/include/lps33thw/lps33thw.h
index 083d8ac9fa..de17a319d8 100644
--- a/hw/drivers/sensors/lps33thw/include/lps33thw/lps33thw.h
+++ b/hw/drivers/sensors/lps33thw/include/lps33thw/lps33thw.h
@@ -94,6 +94,9 @@ struct lps33thw {
     struct lps33thw_cfg cfg;
     os_time_t last_read_time;
     struct lps33thw_private_driver_data pdd;
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    bool node_is_spi;
+#endif
 };
 
 /**
diff --git a/hw/drivers/sensors/lps33thw/src/lps33thw.c b/hw/drivers/sensors/lps33thw/src/lps33thw.c
index d4d94f04ac..eaab21a312 100644
--- a/hw/drivers/sensors/lps33thw/src/lps33thw.c
+++ b/hw/drivers/sensors/lps33thw/src/lps33thw.c
@@ -411,6 +411,12 @@ lps33thw_get_regs(struct sensor_itf *itf, uint8_t reg, uint8_t size,
     int rc;
 
 #if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    struct lps33thw *dev = (struct lps33thw *)itf->si_dev;
+
+    if (dev->node_is_spi) {
+        reg |= LPS33THW_SPI_READ_CMD_BIT;
+    }
+
     rc = bus_node_simple_write_read_transact(itf->si_dev, &reg, 1, buffer, size);
 #else
     rc = sensor_itf_lock(itf, MYNEWT_VAL(LPS33THW_ITF_LOCK_TMO));
@@ -1128,11 +1134,14 @@ lps33thw_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 lps33thw *dev = (struct lps33thw *)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);
@@ -1145,11 +1154,14 @@ lps33thw_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 lps33thw *dev = (struct lps33thw *)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);


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services