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

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


The following commit(s) were added to refs/heads/master by this push:
     new 22ccc6836 hw/drivers/bme280: Fix writes to I2C
22ccc6836 is described below

commit 22ccc683646e77d9874e2f5d64c3c6f0bdbeabdc
Author: Jerzy Kasenberg <[email protected]>
AuthorDate: Mon Sep 9 12:46:30 2024 +0200

    hw/drivers/bme280: Fix writes to I2C
    
    I2C writes when driver was enabled clear MSB of register
    address.
    
    This prevented any write to control registers.
    
    Now registers MSB is cleared on write only for SPI.
    
    Writing registers also requires single start condition.
    Code was doing write with restart condtion that does not
    seem to work correctly
    
    Signed-off-by: Jerzy Kasenberg <[email protected]>
---
 hw/drivers/sensors/bme280/include/bme280/bme280.h |  1 +
 hw/drivers/sensors/bme280/src/bme280.c            | 27 +++++++++++++++++------
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/hw/drivers/sensors/bme280/include/bme280/bme280.h 
b/hw/drivers/sensors/bme280/include/bme280/bme280.h
index 42b877fcf..276f1a961 100644
--- a/hw/drivers/sensors/bme280/include/bme280/bme280.h
+++ b/hw/drivers/sensors/bme280/include/bme280/bme280.h
@@ -111,6 +111,7 @@ struct bme280 {
         struct bus_i2c_node i2c_node;
         struct bus_spi_node spi_node;
     };
+    bool node_is_spi;
 #else
     struct os_dev dev;
 #endif
diff --git a/hw/drivers/sensors/bme280/src/bme280.c 
b/hw/drivers/sensors/bme280/src/bme280.c
index 384803005..93fadb6d7 100644
--- a/hw/drivers/sensors/bme280/src/bme280.c
+++ b/hw/drivers/sensors/bme280/src/bme280.c
@@ -75,6 +75,14 @@ static const struct sensor_driver g_bme280_sensor_driver = {
     bme280_sensor_get_config
 };
 
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+static bool
+bme280_uses_spi(struct sensor_itf *itf)
+{
+    return ((struct bme280 *)(itf->si_dev))->node_is_spi;
+}
+#endif
+
 static int
 bme280_default_cfg(struct bme280_cfg *cfg)
 {
@@ -894,6 +902,12 @@ bme280_writelen(struct sensor_itf *itf, uint8_t addr, 
uint8_t *payload,
     int rc;
 
 #if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    uint8_t buf[4];
+
+    if (len > 3) {
+        return SYS_EINVAL;
+    }
+
     struct os_dev *dev = itf->si_dev;
 
     rc = bus_node_lock(dev, OS_TIMEOUT_NEVER);
@@ -901,16 +915,15 @@ bme280_writelen(struct sensor_itf *itf, uint8_t addr, 
uint8_t *payload,
         return SYS_EINVAL;
     }
 
-    addr &= ~BME280_SPI_READ_CMD_BIT;
-
-    rc = bus_node_write(dev, &addr, 1, OS_TIMEOUT_NEVER, BUS_F_NOSTOP);
-    if (rc) {
-        goto done;
+    if (bme280_uses_spi(itf)) {
+        addr &= ~BME280_SPI_READ_CMD_BIT;
     }
 
-    rc = bus_node_simple_write(dev, payload, len);
+    buf[0] = addr;
+    memcpy(buf + 1, payload, len);
+
+    rc = bus_node_simple_write(dev, buf, len + 1);
 
-done:
     (void)bus_node_unlock(dev);
 #else
     int i;

Reply via email to