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

vipulrahane 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 0e7ff48f5 hw/sensors/bmp5: Put sensor into standby before configuring 
(#3503)
0e7ff48f5 is described below

commit 0e7ff48f509cdd83f46825e15cb0f887e11f5454
Author: Vipul Rahane <[email protected]>
AuthorDate: Wed Oct 1 11:44:58 2025 -0700

    hw/sensors/bmp5: Put sensor into standby before configuring (#3503)
    
    - Put sensor into standby before configuring.
---
 hw/drivers/sensors/bmp5/src/bmp5.c | 66 +++++++++++++++++++++++++-------------
 1 file changed, 44 insertions(+), 22 deletions(-)

diff --git a/hw/drivers/sensors/bmp5/src/bmp5.c 
b/hw/drivers/sensors/bmp5/src/bmp5.c
index 2b315fddd..e585cefe9 100644
--- a/hw/drivers/sensors/bmp5/src/bmp5.c
+++ b/hw/drivers/sensors/bmp5/src/bmp5.c
@@ -94,10 +94,12 @@ static int bmp5_sensor_handle_interrupt(struct sensor 
*sensor);
 static int bmp5_sensor_set_config(struct sensor *sensor, void *cfg);
 
 /** Internal API declarations */
-static int set_pwr_ctrl_settings(uint32_t desired_settings, struct bmp5_dev 
*dev);
+static int set_pwr_ctrl_settings(struct bmp5_dev *dev);
 
 static int set_odr_filter_settings(uint32_t desired_settings, struct bmp5_dev 
*dev);
 
+static int bmp5_set_pwr_mode_bycfg(struct bmp5_dev *dev);
+
 /* Sensor framework driver callbacks */
 static const struct sensor_driver g_bmp5_sensor_driver = {
     .sd_read = bmp5_sensor_read,
@@ -333,20 +335,12 @@ bmp5_check_and_return(int rc, const char *func)
  * settings of the sensor.
  */
 static int
-set_pwr_ctrl_settings(uint32_t desired_settings, struct bmp5_dev *dev)
+set_pwr_ctrl_settings(struct bmp5_dev *dev)
 {
     int rc;
-    uint8_t reg_data;
-    uint8_t reg_addr = BMP5_ODR_CONFIG_ADDR;
 
-    rc = bmp5_get_regs(reg_addr, &reg_data, 1, dev);
-    if (!rc) {
-    }
-
-    if (desired_settings & BMP5_POWER_MODE_SEL) {
-        /* Set the power mode settings in the register variable */
-        rc = set_power_mode(dev->settings.pwr_mode, dev);
-    }
+    /* Set the power mode settings in the register variable */
+    rc = set_power_mode(dev->settings.pwr_mode, dev);
 
     return bmp5_check_and_return(rc, __func__);
 }
@@ -611,10 +605,16 @@ bmp5_set_sensor_settings(uint32_t desired_settings, 
struct bmp5_dev *dev)
 {
     int rc = 0;
 
-    if (desired_settings & BMP5_POWER_MODE_SEL) {
-        /* Set the power control settings */
-        rc = set_pwr_ctrl_settings(desired_settings, dev);
+    if ((desired_settings & BMP5_POWER_MODE_SEL) == 0) {
+        /* Put the device to standby mode before changing any settings */
+        rc = set_power_mode(BMP5_STANDBY_MODE, dev);
+        if (rc) {
+            goto err;
+        }
     }
+    /* Give some time for device to go into sleep mode */
+    delay_msec(2);
+
     if ((desired_settings & BMP5_ODR_FILTER) && (!rc)) {
         /* Set the over sampling, odr and filter settings */
         rc = set_odr_filter_settings(desired_settings, dev);
@@ -631,6 +631,20 @@ bmp5_set_sensor_settings(uint32_t desired_settings, struct 
bmp5_dev *dev)
         /* Set the power mode */
         rc = set_temp_press_compensate(desired_settings, dev);
     }
+
+    if ((desired_settings & BMP5_POWER_MODE_SEL) == 0) {
+        /* Force set the power control settings without
+         * reading the existing power mode
+         */
+        rc = set_pwr_ctrl_settings(dev);
+    } else if (!rc) {
+        /* Read the most recent power mode, if the device is in the same power
+         * as what we want to configure, don't reconfigure, if not, put the
+         * sensor into the requested power mode.
+         */
+        rc = bmp5_set_pwr_mode_bycfg(dev);
+    }
+err:
     return bmp5_check_and_return(rc, __func__);
 }
 
@@ -2814,6 +2828,14 @@ bmp5_config(struct bmp5 *bmp5, struct bmp5_cfg *cfg)
         BMP5_LOG_ERROR("%s:gets BMP5 chipID 0x%x\n", __func__, chip_id);
     }
 
+    /* Configure sensor in standby mode */
+    rc = bmp5_set_power_mode(bmp5, BMP5_STANDBY_MODE);
+    if (rc) {
+        goto err;
+    }
+
+    delay_msec(2);
+
     rc = bmp5_set_int_pp_od(bmp5, cfg->int_pp_od);
     if (rc) {
         goto err;
@@ -2848,13 +2870,6 @@ bmp5_config(struct bmp5 *bmp5, struct bmp5_cfg *cfg)
 
     bmp5->cfg.rate = cfg->rate;
 
-    rc = bmp5_set_power_mode(bmp5, cfg->power_mode);
-    if (rc) {
-        goto err;
-    }
-
-    bmp5->cfg.power_mode = cfg->power_mode;
-
     rc = bmp5_set_fifo_cfg(bmp5, cfg->fifo_mode, cfg->fifo_threshold);
     if (rc) {
         goto err;
@@ -2865,6 +2880,13 @@ bmp5_config(struct bmp5 *bmp5, struct bmp5_cfg *cfg)
 
     bmp5->cfg.int_enable_type = cfg->int_enable_type;
 
+    rc = bmp5_set_power_mode(bmp5, cfg->power_mode);
+    if (rc) {
+        goto err;
+    }
+
+    bmp5->cfg.power_mode = cfg->power_mode;
+
     rc = sensor_set_type_mask(&(bmp5->sensor), cfg->mask);
     if (rc) {
         goto err;

Reply via email to