Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions drivers/sensor/st/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ add_subdirectory_ifdef(CONFIG_LSM6DSL lsm6dsl)
add_subdirectory_ifdef(CONFIG_LSM6DSO lsm6dso)
add_subdirectory_ifdef(CONFIG_LSM6DSO16IS lsm6dso16is)
add_subdirectory_ifdef(CONFIG_LSM6DSV16X lsm6dsv16x)
add_subdirectory_ifdef(CONFIG_LSM6DSVXXX lsm6dsvxxx)
add_subdirectory_ifdef(CONFIG_LSM9DS0_GYRO lsm9ds0_gyro)
add_subdirectory_ifdef(CONFIG_LSM9DS0_MFD lsm9ds0_mfd)
add_subdirectory_ifdef(CONFIG_LSM9DS1 lsm9ds1)
Expand Down
1 change: 1 addition & 0 deletions drivers/sensor/st/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ source "drivers/sensor/st/lsm6dsl/Kconfig"
source "drivers/sensor/st/lsm6dso/Kconfig"
source "drivers/sensor/st/lsm6dso16is/Kconfig"
source "drivers/sensor/st/lsm6dsv16x/Kconfig"
source "drivers/sensor/st/lsm6dsvxxx/Kconfig"
source "drivers/sensor/st/lsm9ds0_gyro/Kconfig"
source "drivers/sensor/st/lsm9ds0_mfd/Kconfig"
source "drivers/sensor/st/lsm9ds1/Kconfig"
Expand Down
4 changes: 2 additions & 2 deletions drivers/sensor/st/lsm6dsv16x/lsm6dsv16x.c
Original file line number Diff line number Diff line change
Expand Up @@ -1232,11 +1232,11 @@ static int lsm6dsv16x_pm_action(const struct device *dev, enum pm_device_action
}
break;
case PM_DEVICE_ACTION_SUSPEND:
if (lsm6dsv16x_xl_data_rate_set(ctx, LSM6DSV16X_DT_ODR_OFF) < 0) {
if (lsm6dsv16x_xl_data_rate_set(ctx, LSM6DSVXXX_DT_ODR_OFF) < 0) {
LOG_ERR("failed to disable accelerometer");
ret = -EIO;
}
if (lsm6dsv16x_gy_data_rate_set(ctx, LSM6DSV16X_DT_ODR_OFF) < 0) {
if (lsm6dsv16x_gy_data_rate_set(ctx, LSM6DSVXXX_DT_ODR_OFF) < 0) {
LOG_ERR("failed to disable gyroscope");
ret = -EIO;
}
Expand Down
66 changes: 33 additions & 33 deletions drivers/sensor/st/lsm6dsv16x/lsm6dsv16x_decoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,50 +15,50 @@ LOG_MODULE_REGISTER(LSM6DSV16X_DECODER, CONFIG_SENSOR_LOG_LEVEL);

#ifdef CONFIG_LSM6DSV16X_STREAM
static const uint32_t accel_period_ns[] = {
[LSM6DSV16X_XL_BATCHED_AT_1Hz875] = UINT32_C(1000000000000) / 1875,
[LSM6DSV16X_XL_BATCHED_AT_7Hz5] = UINT32_C(1000000000000) / 7500,
[LSM6DSV16X_XL_BATCHED_AT_15Hz] = UINT32_C(1000000000) / 15,
[LSM6DSV16X_XL_BATCHED_AT_30Hz] = UINT32_C(1000000000) / 30,
[LSM6DSV16X_XL_BATCHED_AT_60Hz] = UINT32_C(1000000000) / 60,
[LSM6DSV16X_XL_BATCHED_AT_120Hz] = UINT32_C(1000000000) / 120,
[LSM6DSV16X_XL_BATCHED_AT_240Hz] = UINT32_C(1000000000) / 240,
[LSM6DSV16X_XL_BATCHED_AT_480Hz] = UINT32_C(1000000000) / 480,
[LSM6DSV16X_XL_BATCHED_AT_960Hz] = UINT32_C(1000000000) / 960,
[LSM6DSV16X_XL_BATCHED_AT_1920Hz] = UINT32_C(1000000000) / 1920,
[LSM6DSV16X_XL_BATCHED_AT_3840Hz] = UINT32_C(1000000000) / 3840,
[LSM6DSV16X_XL_BATCHED_AT_7680Hz] = UINT32_C(1000000000) / 7680,
[LSM6DSVXXX_DT_XL_BATCHED_AT_1Hz875] = UINT32_C(1000000000000) / 1875,
[LSM6DSVXXX_DT_XL_BATCHED_AT_7Hz5] = UINT32_C(1000000000000) / 7500,
[LSM6DSVXXX_DT_XL_BATCHED_AT_15Hz] = UINT32_C(1000000000) / 15,
[LSM6DSVXXX_DT_XL_BATCHED_AT_30Hz] = UINT32_C(1000000000) / 30,
[LSM6DSVXXX_DT_XL_BATCHED_AT_60Hz] = UINT32_C(1000000000) / 60,
[LSM6DSVXXX_DT_XL_BATCHED_AT_120Hz] = UINT32_C(1000000000) / 120,
[LSM6DSVXXX_DT_XL_BATCHED_AT_240Hz] = UINT32_C(1000000000) / 240,
[LSM6DSVXXX_DT_XL_BATCHED_AT_480Hz] = UINT32_C(1000000000) / 480,
[LSM6DSVXXX_DT_XL_BATCHED_AT_960Hz] = UINT32_C(1000000000) / 960,
[LSM6DSVXXX_DT_XL_BATCHED_AT_1920Hz] = UINT32_C(1000000000) / 1920,
[LSM6DSVXXX_DT_XL_BATCHED_AT_3840Hz] = UINT32_C(1000000000) / 3840,
[LSM6DSVXXX_DT_XL_BATCHED_AT_7680Hz] = UINT32_C(1000000000) / 7680,
};

static const uint32_t gyro_period_ns[] = {
[LSM6DSV16X_GY_BATCHED_AT_1Hz875] = UINT32_C(1000000000000) / 1875,
[LSM6DSV16X_GY_BATCHED_AT_7Hz5] = UINT32_C(1000000000000) / 7500,
[LSM6DSV16X_GY_BATCHED_AT_15Hz] = UINT32_C(1000000000) / 15,
[LSM6DSV16X_GY_BATCHED_AT_30Hz] = UINT32_C(1000000000) / 30,
[LSM6DSV16X_GY_BATCHED_AT_60Hz] = UINT32_C(1000000000) / 60,
[LSM6DSV16X_GY_BATCHED_AT_120Hz] = UINT32_C(1000000000) / 120,
[LSM6DSV16X_GY_BATCHED_AT_240Hz] = UINT32_C(1000000000) / 240,
[LSM6DSV16X_GY_BATCHED_AT_480Hz] = UINT32_C(1000000000) / 480,
[LSM6DSV16X_GY_BATCHED_AT_960Hz] = UINT32_C(1000000000) / 960,
[LSM6DSV16X_GY_BATCHED_AT_1920Hz] = UINT32_C(1000000000) / 1920,
[LSM6DSV16X_GY_BATCHED_AT_3840Hz] = UINT32_C(1000000000) / 3840,
[LSM6DSV16X_GY_BATCHED_AT_7680Hz] = UINT32_C(1000000000) / 7680,
[LSM6DSVXXX_DT_GY_BATCHED_AT_1Hz875] = UINT32_C(1000000000000) / 1875,
[LSM6DSVXXX_DT_GY_BATCHED_AT_7Hz5] = UINT32_C(1000000000000) / 7500,
[LSM6DSVXXX_DT_GY_BATCHED_AT_15Hz] = UINT32_C(1000000000) / 15,
[LSM6DSVXXX_DT_GY_BATCHED_AT_30Hz] = UINT32_C(1000000000) / 30,
[LSM6DSVXXX_DT_GY_BATCHED_AT_60Hz] = UINT32_C(1000000000) / 60,
[LSM6DSVXXX_DT_GY_BATCHED_AT_120Hz] = UINT32_C(1000000000) / 120,
[LSM6DSVXXX_DT_GY_BATCHED_AT_240Hz] = UINT32_C(1000000000) / 240,
[LSM6DSVXXX_DT_GY_BATCHED_AT_480Hz] = UINT32_C(1000000000) / 480,
[LSM6DSVXXX_DT_GY_BATCHED_AT_960Hz] = UINT32_C(1000000000) / 960,
[LSM6DSVXXX_DT_GY_BATCHED_AT_1920Hz] = UINT32_C(1000000000) / 1920,
[LSM6DSVXXX_DT_GY_BATCHED_AT_3840Hz] = UINT32_C(1000000000) / 3840,
[LSM6DSVXXX_DT_GY_BATCHED_AT_7680Hz] = UINT32_C(1000000000) / 7680,
};

#if defined(CONFIG_LSM6DSV16X_ENABLE_TEMP)
static const uint32_t temp_period_ns[] = {
[LSM6DSV16X_TEMP_BATCHED_AT_1Hz875] = UINT32_C(1000000000000) / 1875,
[LSM6DSV16X_TEMP_BATCHED_AT_15Hz] = UINT32_C(1000000000) / 15,
[LSM6DSV16X_TEMP_BATCHED_AT_60Hz] = UINT32_C(1000000000) / 60,
[LSM6DSVXXX_DT_TEMP_BATCHED_AT_1Hz875] = UINT32_C(1000000000000) / 1875,
[LSM6DSVXXX_DT_TEMP_BATCHED_AT_15Hz] = UINT32_C(1000000000) / 15,
[LSM6DSVXXX_DT_TEMP_BATCHED_AT_60Hz] = UINT32_C(1000000000) / 60,
};
#endif

static const uint32_t sflp_period_ns[] = {
[LSM6DSV16X_DT_SFLP_ODR_AT_15Hz] = UINT32_C(1000000000) / 15,
[LSM6DSV16X_DT_SFLP_ODR_AT_30Hz] = UINT32_C(1000000000) / 30,
[LSM6DSV16X_DT_SFLP_ODR_AT_60Hz] = UINT32_C(1000000000) / 60,
[LSM6DSV16X_DT_SFLP_ODR_AT_120Hz] = UINT32_C(1000000000) / 120,
[LSM6DSV16X_DT_SFLP_ODR_AT_240Hz] = UINT32_C(1000000000) / 240,
[LSM6DSV16X_DT_SFLP_ODR_AT_480Hz] = UINT32_C(1000000000) / 480,
[LSM6DSVXXX_DT_SFLP_ODR_AT_15Hz] = UINT32_C(1000000000) / 15,
[LSM6DSVXXX_DT_SFLP_ODR_AT_30Hz] = UINT32_C(1000000000) / 30,
[LSM6DSVXXX_DT_SFLP_ODR_AT_60Hz] = UINT32_C(1000000000) / 60,
[LSM6DSVXXX_DT_SFLP_ODR_AT_120Hz] = UINT32_C(1000000000) / 120,
[LSM6DSVXXX_DT_SFLP_ODR_AT_240Hz] = UINT32_C(1000000000) / 240,
[LSM6DSVXXX_DT_SFLP_ODR_AT_480Hz] = UINT32_C(1000000000) / 480,
};
#endif /* CONFIG_LSM6DSV16X_STREAM */

Expand Down
48 changes: 24 additions & 24 deletions drivers/sensor/st/lsm6dsv16x/lsm6dsv16x_rtio_stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,9 @@ static void lsm6dsv16x_config_fifo(const struct device *dev, struct trigger_conf
stmdev_ctx_t *ctx = (stmdev_ctx_t *)&config->ctx;
uint8_t fifo_wtm = 0;
lsm6dsv16x_pin_int_route_t pin_int = { 0 };
lsm6dsv16x_fifo_xl_batch_t xl_batch = LSM6DSV16X_DT_XL_NOT_BATCHED;
lsm6dsv16x_fifo_gy_batch_t gy_batch = LSM6DSV16X_DT_GY_NOT_BATCHED;
lsm6dsv16x_fifo_temp_batch_t temp_batch = LSM6DSV16X_DT_TEMP_NOT_BATCHED;
lsm6dsv16x_fifo_xl_batch_t xl_batch = LSM6DSVXXX_DT_XL_NOT_BATCHED;
lsm6dsv16x_fifo_gy_batch_t gy_batch = LSM6DSVXXX_DT_GY_NOT_BATCHED;
lsm6dsv16x_fifo_temp_batch_t temp_batch = LSM6DSVXXX_DT_TEMP_NOT_BATCHED;
lsm6dsv16x_fifo_mode_t fifo_mode = LSM6DSV16X_BYPASS_MODE;
lsm6dsv16x_sflp_data_rate_t sflp_odr = LSM6DSV16X_SFLP_120Hz;
lsm6dsv16x_fifo_sflp_raw_t sflp_fifo = { 0 };
Expand All @@ -107,15 +107,15 @@ static void lsm6dsv16x_config_fifo(const struct device *dev, struct trigger_conf
fifo_mode = LSM6DSV16X_STREAM_MODE;
fifo_wtm = config->fifo_wtm;

if (config->sflp_fifo_en & LSM6DSV16X_DT_SFLP_FIFO_GAME_ROTATION) {
if (config->sflp_fifo_en & LSM6DSVXXX_DT_SFLP_FIFO_GAME_ROTATION) {
sflp_fifo.game_rotation = 1;
}

if (config->sflp_fifo_en & LSM6DSV16X_DT_SFLP_FIFO_GRAVITY) {
if (config->sflp_fifo_en & LSM6DSVXXX_DT_SFLP_FIFO_GRAVITY) {
sflp_fifo.gravity = 1;
}

if (config->sflp_fifo_en & LSM6DSV16X_DT_SFLP_FIFO_GBIAS) {
if (config->sflp_fifo_en & LSM6DSVXXX_DT_SFLP_FIFO_GBIAS) {
sflp_fifo.gbias = 1;
}

Expand Down Expand Up @@ -151,34 +151,34 @@ static void lsm6dsv16x_config_fifo(const struct device *dev, struct trigger_conf
* make the SFLP gbias setting effective. Then restore it to saved values.
*/
switch (sflp_odr) {
case LSM6DSV16X_DT_SFLP_ODR_AT_480Hz:
lsm6dsv16x_accel_set_odr_raw(dev, LSM6DSV16X_DT_ODR_AT_480Hz);
lsm6dsv16x_gyro_set_odr_raw(dev, LSM6DSV16X_DT_ODR_AT_480Hz);
case LSM6DSVXXX_DT_SFLP_ODR_AT_480Hz:
lsm6dsv16x_accel_set_odr_raw(dev, LSM6DSVXXX_DT_ODR_AT_480Hz);
lsm6dsv16x_gyro_set_odr_raw(dev, LSM6DSVXXX_DT_ODR_AT_480Hz);
break;

case LSM6DSV16X_DT_SFLP_ODR_AT_240Hz:
lsm6dsv16x_accel_set_odr_raw(dev, LSM6DSV16X_DT_ODR_AT_240Hz);
lsm6dsv16x_gyro_set_odr_raw(dev, LSM6DSV16X_DT_ODR_AT_240Hz);
case LSM6DSVXXX_DT_SFLP_ODR_AT_240Hz:
lsm6dsv16x_accel_set_odr_raw(dev, LSM6DSVXXX_DT_ODR_AT_240Hz);
lsm6dsv16x_gyro_set_odr_raw(dev, LSM6DSVXXX_DT_ODR_AT_240Hz);
break;

case LSM6DSV16X_DT_SFLP_ODR_AT_120Hz:
lsm6dsv16x_accel_set_odr_raw(dev, LSM6DSV16X_DT_ODR_AT_120Hz);
lsm6dsv16x_gyro_set_odr_raw(dev, LSM6DSV16X_DT_ODR_AT_120Hz);
case LSM6DSVXXX_DT_SFLP_ODR_AT_120Hz:
lsm6dsv16x_accel_set_odr_raw(dev, LSM6DSVXXX_DT_ODR_AT_120Hz);
lsm6dsv16x_gyro_set_odr_raw(dev, LSM6DSVXXX_DT_ODR_AT_120Hz);
break;

case LSM6DSV16X_DT_SFLP_ODR_AT_60Hz:
lsm6dsv16x_accel_set_odr_raw(dev, LSM6DSV16X_DT_ODR_AT_60Hz);
lsm6dsv16x_gyro_set_odr_raw(dev, LSM6DSV16X_DT_ODR_AT_60Hz);
case LSM6DSVXXX_DT_SFLP_ODR_AT_60Hz:
lsm6dsv16x_accel_set_odr_raw(dev, LSM6DSVXXX_DT_ODR_AT_60Hz);
lsm6dsv16x_gyro_set_odr_raw(dev, LSM6DSVXXX_DT_ODR_AT_60Hz);
break;

case LSM6DSV16X_DT_SFLP_ODR_AT_30Hz:
lsm6dsv16x_accel_set_odr_raw(dev, LSM6DSV16X_DT_ODR_AT_30Hz);
lsm6dsv16x_gyro_set_odr_raw(dev, LSM6DSV16X_DT_ODR_AT_30Hz);
case LSM6DSVXXX_DT_SFLP_ODR_AT_30Hz:
lsm6dsv16x_accel_set_odr_raw(dev, LSM6DSVXXX_DT_ODR_AT_30Hz);
lsm6dsv16x_gyro_set_odr_raw(dev, LSM6DSVXXX_DT_ODR_AT_30Hz);
break;

case LSM6DSV16X_DT_SFLP_ODR_AT_15Hz:
lsm6dsv16x_accel_set_odr_raw(dev, LSM6DSV16X_DT_ODR_AT_15Hz);
lsm6dsv16x_gyro_set_odr_raw(dev, LSM6DSV16X_DT_ODR_AT_15Hz);
case LSM6DSVXXX_DT_SFLP_ODR_AT_15Hz:
lsm6dsv16x_accel_set_odr_raw(dev, LSM6DSVXXX_DT_ODR_AT_15Hz);
lsm6dsv16x_gyro_set_odr_raw(dev, LSM6DSVXXX_DT_ODR_AT_15Hz);
break;
}

Expand Down
18 changes: 18 additions & 0 deletions drivers/sensor/st/lsm6dsvxxx/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# ST Microelectronics LSM6DSVXXX accelerometer sensor
#
# Copyright (c) 2025 STMicroelectronics
#
# SPDX-License-Identifier: Apache-2.0
#
zephyr_library()

zephyr_library_sources(lsm6dsvxxx.c)
zephyr_library_sources_ifdef(CONFIG_SENSOR_ASYNC_API lsm6dsvxxx_decoder.c)
zephyr_library_sources_ifdef(CONFIG_LSM6DSVXXX_STREAM lsm6dsvxxx_stream.c)
zephyr_library_sources_ifdef(CONFIG_LSM6DSVXXX_TRIGGER lsm6dsvxxx_trigger.c)

zephyr_library_sources_ifdef(CONFIG_DT_HAS_ST_LSM6DSV320X_ENABLED lsm6dsv320x.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_ST_LSM6DSV80X_ENABLED lsm6dsv80x.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_ST_ISM6HG256X_ENABLED ism6hg256x.c)

zephyr_library_include_directories(../stmemsc)
48 changes: 48 additions & 0 deletions drivers/sensor/st/lsm6dsvxxx/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# ST Microelectronics LSM6DSVXXX accelerometer sensor

# Copyright (c) 2025 STMicroelectronics
# SPDX-License-Identifier: Apache-2.0

menuconfig LSM6DSVXXX
bool "LSM6DSVXXX IMU sensor"
default y
depends on DT_HAS_ST_LSM6DSV320X_ENABLED || DT_HAS_ST_LSM6DSV80X_ENABLED ||\
DT_HAS_ST_ISM6HG256X_ENABLED
depends on ZEPHYR_HAL_ST_MODULE
select I2C if $(dt_compat_on_bus,$(DT_COMPAT_ST_LSM6DSV320X),i2c) ||\
$(dt_compat_on_bus,$(DT_COMPAT_ST_LSM6DSV80X),i2c) ||\
$(dt_compat_on_bus,$(DT_COMPAT_ST_ISM6HG256X),i2c)
select I3C if $(dt_compat_on_bus,$(DT_COMPAT_ST_LSM6DSV320X),i3c) ||\
$(dt_compat_on_bus,$(DT_COMPAT_ST_LSM6DSV80X),i3c) ||\
$(dt_compat_on_bus,$(DT_COMPAT_ST_ISM6HG256X),i3c)
select SPI if $(dt_compat_on_bus,$(DT_COMPAT_ST_LSM6DSV320X),spi) ||\
$(dt_compat_on_bus,$(DT_COMPAT_ST_LSM6DSV80X),spi) ||\
$(dt_compat_on_bus,$(DT_COMPAT_ST_ISM6HG256X),spi)
select HAS_STMEMSC
select USE_STDC_LSM6DSV320X if DT_HAS_ST_LSM6DSV320X_ENABLED
select USE_STDC_LSM6DSV80X if DT_HAS_ST_LSM6DSV80X_ENABLED
select USE_STDC_ISM6HG256X if DT_HAS_ST_ISM6HG256X_ENABLED
help
Enable driver for LSM6DSVXXX family IMU sensors.

if LSM6DSVXXX

config LSM6DSVXXX_STREAM
bool "LSM6DSVXXX data streaming"
select LSM6DSVXXX_TRIGGER
default y
depends on SPI_RTIO || I2C_RTIO || I3C_RTIO
depends on SENSOR_ASYNC_API
help
Use this config option to enable streaming sensor data via RTIO subsystem.

config LSM6DSVXXX_TRIGGER
bool

config LSM6DSVXXX_ENABLE_TEMP
bool "Temperature"
help
Enable/disable temperature sensor


endif # LSM6DSVXXX
Loading