Skip to content

Commit 0e7ff48

Browse files
authored
hw/sensors/bmp5: Put sensor into standby before configuring (#3503)
- Put sensor into standby before configuring.
1 parent 14730a2 commit 0e7ff48

File tree

1 file changed

+44
-22
lines changed
  • hw/drivers/sensors/bmp5/src

1 file changed

+44
-22
lines changed

hw/drivers/sensors/bmp5/src/bmp5.c

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,12 @@ static int bmp5_sensor_handle_interrupt(struct sensor *sensor);
9494
static int bmp5_sensor_set_config(struct sensor *sensor, void *cfg);
9595

9696
/** Internal API declarations */
97-
static int set_pwr_ctrl_settings(uint32_t desired_settings, struct bmp5_dev *dev);
97+
static int set_pwr_ctrl_settings(struct bmp5_dev *dev);
9898

9999
static int set_odr_filter_settings(uint32_t desired_settings, struct bmp5_dev *dev);
100100

101+
static int bmp5_set_pwr_mode_bycfg(struct bmp5_dev *dev);
102+
101103
/* Sensor framework driver callbacks */
102104
static const struct sensor_driver g_bmp5_sensor_driver = {
103105
.sd_read = bmp5_sensor_read,
@@ -333,20 +335,12 @@ bmp5_check_and_return(int rc, const char *func)
333335
* settings of the sensor.
334336
*/
335337
static int
336-
set_pwr_ctrl_settings(uint32_t desired_settings, struct bmp5_dev *dev)
338+
set_pwr_ctrl_settings(struct bmp5_dev *dev)
337339
{
338340
int rc;
339-
uint8_t reg_data;
340-
uint8_t reg_addr = BMP5_ODR_CONFIG_ADDR;
341341

342-
rc = bmp5_get_regs(reg_addr, &reg_data, 1, dev);
343-
if (!rc) {
344-
}
345-
346-
if (desired_settings & BMP5_POWER_MODE_SEL) {
347-
/* Set the power mode settings in the register variable */
348-
rc = set_power_mode(dev->settings.pwr_mode, dev);
349-
}
342+
/* Set the power mode settings in the register variable */
343+
rc = set_power_mode(dev->settings.pwr_mode, dev);
350344

351345
return bmp5_check_and_return(rc, __func__);
352346
}
@@ -611,10 +605,16 @@ bmp5_set_sensor_settings(uint32_t desired_settings, struct bmp5_dev *dev)
611605
{
612606
int rc = 0;
613607

614-
if (desired_settings & BMP5_POWER_MODE_SEL) {
615-
/* Set the power control settings */
616-
rc = set_pwr_ctrl_settings(desired_settings, dev);
608+
if ((desired_settings & BMP5_POWER_MODE_SEL) == 0) {
609+
/* Put the device to standby mode before changing any settings */
610+
rc = set_power_mode(BMP5_STANDBY_MODE, dev);
611+
if (rc) {
612+
goto err;
613+
}
617614
}
615+
/* Give some time for device to go into sleep mode */
616+
delay_msec(2);
617+
618618
if ((desired_settings & BMP5_ODR_FILTER) && (!rc)) {
619619
/* Set the over sampling, odr and filter settings */
620620
rc = set_odr_filter_settings(desired_settings, dev);
@@ -631,6 +631,20 @@ bmp5_set_sensor_settings(uint32_t desired_settings, struct bmp5_dev *dev)
631631
/* Set the power mode */
632632
rc = set_temp_press_compensate(desired_settings, dev);
633633
}
634+
635+
if ((desired_settings & BMP5_POWER_MODE_SEL) == 0) {
636+
/* Force set the power control settings without
637+
* reading the existing power mode
638+
*/
639+
rc = set_pwr_ctrl_settings(dev);
640+
} else if (!rc) {
641+
/* Read the most recent power mode, if the device is in the same power
642+
* as what we want to configure, don't reconfigure, if not, put the
643+
* sensor into the requested power mode.
644+
*/
645+
rc = bmp5_set_pwr_mode_bycfg(dev);
646+
}
647+
err:
634648
return bmp5_check_and_return(rc, __func__);
635649
}
636650

@@ -2814,6 +2828,14 @@ bmp5_config(struct bmp5 *bmp5, struct bmp5_cfg *cfg)
28142828
BMP5_LOG_ERROR("%s:gets BMP5 chipID 0x%x\n", __func__, chip_id);
28152829
}
28162830

2831+
/* Configure sensor in standby mode */
2832+
rc = bmp5_set_power_mode(bmp5, BMP5_STANDBY_MODE);
2833+
if (rc) {
2834+
goto err;
2835+
}
2836+
2837+
delay_msec(2);
2838+
28172839
rc = bmp5_set_int_pp_od(bmp5, cfg->int_pp_od);
28182840
if (rc) {
28192841
goto err;
@@ -2848,13 +2870,6 @@ bmp5_config(struct bmp5 *bmp5, struct bmp5_cfg *cfg)
28482870

28492871
bmp5->cfg.rate = cfg->rate;
28502872

2851-
rc = bmp5_set_power_mode(bmp5, cfg->power_mode);
2852-
if (rc) {
2853-
goto err;
2854-
}
2855-
2856-
bmp5->cfg.power_mode = cfg->power_mode;
2857-
28582873
rc = bmp5_set_fifo_cfg(bmp5, cfg->fifo_mode, cfg->fifo_threshold);
28592874
if (rc) {
28602875
goto err;
@@ -2865,6 +2880,13 @@ bmp5_config(struct bmp5 *bmp5, struct bmp5_cfg *cfg)
28652880

28662881
bmp5->cfg.int_enable_type = cfg->int_enable_type;
28672882

2883+
rc = bmp5_set_power_mode(bmp5, cfg->power_mode);
2884+
if (rc) {
2885+
goto err;
2886+
}
2887+
2888+
bmp5->cfg.power_mode = cfg->power_mode;
2889+
28682890
rc = sensor_set_type_mask(&(bmp5->sensor), cfg->mask);
28692891
if (rc) {
28702892
goto err;

0 commit comments

Comments
 (0)