diff --git a/drivers/sensor/lsm6dso/lsm6dso.c b/drivers/sensor/lsm6dso/lsm6dso.c index 46f9c30da53..a750bcf3506 100644 --- a/drivers/sensor/lsm6dso/lsm6dso.c +++ b/drivers/sensor/lsm6dso/lsm6dso.c @@ -744,6 +744,21 @@ static int lsm6dso_init_chip(const struct device *dev) k_busy_wait(100); + /* set accel power mode */ + LOG_DBG("accel pm is %d", cfg->accel_pm); + switch (cfg->accel_pm) { + default: + case 0: + lsm6dso_xl_power_mode_set(ctx, LSM6DSO_HIGH_PERFORMANCE_MD); + break; + case 1: + lsm6dso_xl_power_mode_set(ctx, LSM6DSO_LOW_NORMAL_POWER_MD); + break; + case 2: + lsm6dso_xl_power_mode_set(ctx, LSM6DSO_ULTRA_LOW_POWER_MD); + break; + } + fs = cfg->accel_range; LOG_DBG("accel range is %d", fs); if (lsm6dso_accel_set_fs_raw(dev, fs) < 0) { @@ -760,6 +775,18 @@ static int lsm6dso_init_chip(const struct device *dev) return -EIO; } + /* set gyro power mode */ + LOG_DBG("gyro pm is %d", cfg->gyro_pm); + switch (cfg->gyro_pm) { + default: + case 0: + lsm6dso_gy_power_mode_set(ctx, LSM6DSO_GY_HIGH_PERFORMANCE); + break; + case 1: + lsm6dso_gy_power_mode_set(ctx, LSM6DSO_GY_NORMAL); + break; + } + fs = cfg->gyro_range; LOG_DBG("gyro range is %d", fs); if (lsm6dso_gyro_set_fs_raw(dev, fs) < 0) { @@ -877,8 +904,10 @@ static int lsm6dso_init(const struct device *dev) LSM6DSO_SPI_OP, \ 0), \ }, \ + .accel_pm = DT_INST_PROP(inst, accel_pm), \ .accel_odr = DT_INST_PROP(inst, accel_odr), \ .accel_range = DT_INST_PROP(inst, accel_range), \ + .gyro_pm = DT_INST_PROP(inst, gyro_pm), \ .gyro_odr = DT_INST_PROP(inst, gyro_odr), \ .gyro_range = DT_INST_PROP(inst, gyro_range), \ COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, irq_gpios), \ @@ -902,8 +931,10 @@ static int lsm6dso_init(const struct device *dev) .stmemsc_cfg = { \ .i2c = I2C_DT_SPEC_INST_GET(inst), \ }, \ + .accel_pm = DT_INST_PROP(inst, accel_pm), \ .accel_odr = DT_INST_PROP(inst, accel_odr), \ .accel_range = DT_INST_PROP(inst, accel_range), \ + .gyro_pm = DT_INST_PROP(inst, gyro_pm), \ .gyro_odr = DT_INST_PROP(inst, gyro_odr), \ .gyro_range = DT_INST_PROP(inst, gyro_range), \ COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, irq_gpios), \ diff --git a/drivers/sensor/lsm6dso/lsm6dso.h b/drivers/sensor/lsm6dso/lsm6dso.h index 0dcf021c94a..c572c28b255 100644 --- a/drivers/sensor/lsm6dso/lsm6dso.h +++ b/drivers/sensor/lsm6dso/lsm6dso.h @@ -50,8 +50,10 @@ struct lsm6dso_config { const struct spi_dt_spec spi; #endif } stmemsc_cfg; + uint8_t accel_pm; uint8_t accel_odr; uint8_t accel_range; + uint8_t gyro_pm; uint8_t gyro_odr; uint8_t gyro_range; #ifdef CONFIG_LSM6DSO_TRIGGER diff --git a/dts/bindings/sensor/st,lsm6dso-common.yaml b/dts/bindings/sensor/st,lsm6dso-common.yaml index ee96fda80f2..29216e1d153 100644 --- a/dts/bindings/sensor/st,lsm6dso-common.yaml +++ b/dts/bindings/sensor/st,lsm6dso-common.yaml @@ -27,6 +27,18 @@ properties: mandatory and if not present it defaults to 1 which is the configuration at power-up. + accel-pm: + type: int + required: false + default: 0 + description: | + Specify the accelerometer power mode. + Default is power-up configuration. + enum: + - 0 # High Performance mode (default) + - 1 # Low/Normal Power mode + - 2 # Ultra Low Power mode + accel-range: type: int required: false @@ -59,6 +71,17 @@ properties: - 9 # 3333Hz - 10 # 6667Hz + gyro-pm: + type: int + required: false + default: 0 + description: | + Specify the gyrometer power mode. + Default is power-up configuration. + enum: + - 0 # High Performance mode (default) + - 1 # Low/Normal Power mode + gyro-range: type: int required: false