Commit 18e8cada authored by Armando Visconti's avatar Armando Visconti Committed by Christopher Friedt
Browse files

drivers/sensor: lsm6dso: Move odr/range Kconfig property into dts



Move odr and range properties for both accelerometer and gyro
from Kconfigs to Device Tree.
Fixes #41117

Signed-off-by: default avatarArmando Visconti <armando.visconti@st.com>
parent df4e87f9
Loading
Loading
Loading
Loading
+0 −68
Original line number Diff line number Diff line
@@ -85,72 +85,4 @@ config LSM6DSO_EXT_LPS22HB

endif # LSM6DSO_SENSORHUB

menu "Attributes"

config LSM6DSO_GYRO_FS
	int "Gyroscope full-scale range"
	default 0
	help
	  Specify the default gyroscope full-scale range.
	  An X value for the config represents a range of +/- X degree per
	  second. Valid values are:
	  0:  Full Scale selected at runtime
	  125:   +/- 125dps
	  250:   +/- 250dps
	  500:   +/- 500dps
	  1000:  +/- 1000dps
	  2000:  +/- 2000dps

config LSM6DSO_GYRO_ODR
	int "Gyroscope Output data rate frequency"
	range 0 10
	default 0
	help
	  Specify the default accelerometer output data rate expressed in
	  samples per second (Hz).
	  0: ODR selected at runtime
	  1: 12.5Hz
	  2: 26Hz
	  3: 52Hz
	  4: 104Hz
	  5: 208Hz
	  6: 416Hz
	  7: 833Hz
	  8: 1660Hz
	  9: 3330Hz
	  10: 6660Hz

config LSM6DSO_ACCEL_FS
	int "Accelerometer full-scale range"
	default 0
	help
	  Specify the default accelerometer full-scale range.
	  An X value for the config represents a range of +/- X G. Valid values
	  are:
	  0:  Full Scale selected at runtime
	  2:  +/- 2g
	  4:  +/- 4g
	  8:  +/- 8g
	  16: +/- 16g

config LSM6DSO_ACCEL_ODR
	int "Accelerometer Output data rate frequency"
	range 0 10
	default 0
	help
	  Specify the default accelerometer output data rate expressed in
	  samples per second (Hz).
	  0: ODR selected at runtime
	  1: 12.5Hz
	  2: 26Hz
	  3: 52Hz
	  4: 104Hz
	  5: 208Hz
	  6: 416Hz
	  7: 833Hz
	  8: 1660Hz
	  9: 3330Hz
	  10: 6660Hz
endmenu

endif # LSM6DSO
+32 −39
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ LOG_MODULE_REGISTER(LSM6DSO, CONFIG_SENSOR_LOG_LEVEL);
static const uint16_t lsm6dso_odr_map[] = {0, 12, 26, 52, 104, 208, 416, 833,
					1660, 3330, 6660};

#if defined(LSM6DSO_ACCEL_ODR_RUNTIME) || defined(LSM6DSO_GYRO_ODR_RUNTIME)
static int lsm6dso_freq_to_odr_val(uint16_t freq)
{
	size_t i;
@@ -39,7 +38,6 @@ static int lsm6dso_freq_to_odr_val(uint16_t freq)

	return -EINVAL;
}
#endif

static int lsm6dso_odr_to_freq_val(uint16_t odr)
{
@@ -52,7 +50,6 @@ static int lsm6dso_odr_to_freq_val(uint16_t odr)
	return lsm6dso_odr_map[ARRAY_SIZE(lsm6dso_odr_map) - 1];
}

#ifdef LSM6DSO_ACCEL_FS_RUNTIME
static const uint16_t lsm6dso_accel_fs_map[] = {2, 16, 4, 8};
static const uint16_t lsm6dso_accel_fs_sens[] = {1, 8, 2, 4};

@@ -68,11 +65,9 @@ static int lsm6dso_accel_range_to_fs_val(int32_t range)

	return -EINVAL;
}
#endif

#ifdef LSM6DSO_GYRO_FS_RUNTIME
static const uint16_t lsm6dso_gyro_fs_map[] = {250, 500, 1000, 2000, 125};
static const uint16_t lsm6dso_gyro_fs_sens[] = {2, 4, 8, 16, 1};
static const uint16_t lsm6dso_gyro_fs_map[] = {250, 125, 500, 0, 1000, 0, 2000};
static const uint16_t lsm6dso_gyro_fs_sens[] = {2, 1, 4, 0, 8, 0, 16};

static int lsm6dso_gyro_range_to_fs_val(int32_t range)
{
@@ -86,7 +81,6 @@ static int lsm6dso_gyro_range_to_fs_val(int32_t range)

	return -EINVAL;
}
#endif

static inline int lsm6dso_reboot(const struct device *dev)
{
@@ -157,7 +151,6 @@ static int lsm6dso_gyro_set_odr_raw(const struct device *dev, uint8_t odr)
	return 0;
}

#ifdef LSM6DSO_ACCEL_ODR_RUNTIME
static int lsm6dso_accel_odr_set(const struct device *dev, uint16_t freq)
{
	int odr;
@@ -174,9 +167,7 @@ static int lsm6dso_accel_odr_set(const struct device *dev, uint16_t freq)

	return 0;
}
#endif

#ifdef LSM6DSO_ACCEL_FS_RUNTIME
static int lsm6dso_accel_range_set(const struct device *dev, int32_t range)
{
	int fs;
@@ -195,7 +186,6 @@ static int lsm6dso_accel_range_set(const struct device *dev, int32_t range)
	data->acc_gain = (lsm6dso_accel_fs_sens[fs] * GAIN_UNIT_XL);
	return 0;
}
#endif

static int lsm6dso_accel_config(const struct device *dev,
				enum sensor_channel chan,
@@ -203,14 +193,10 @@ static int lsm6dso_accel_config(const struct device *dev,
				const struct sensor_value *val)
{
	switch (attr) {
#ifdef LSM6DSO_ACCEL_FS_RUNTIME
	case SENSOR_ATTR_FULL_SCALE:
		return lsm6dso_accel_range_set(dev, sensor_ms2_to_g(val));
#endif
#ifdef LSM6DSO_ACCEL_ODR_RUNTIME
	case SENSOR_ATTR_SAMPLING_FREQUENCY:
		return lsm6dso_accel_odr_set(dev, val->val1);
#endif
	default:
		LOG_DBG("Accel attribute not supported.");
		return -ENOTSUP;
@@ -219,7 +205,6 @@ static int lsm6dso_accel_config(const struct device *dev,
	return 0;
}

#ifdef LSM6DSO_GYRO_ODR_RUNTIME
static int lsm6dso_gyro_odr_set(const struct device *dev, uint16_t freq)
{
	int odr;
@@ -236,9 +221,7 @@ static int lsm6dso_gyro_odr_set(const struct device *dev, uint16_t freq)

	return 0;
}
#endif

#ifdef LSM6DSO_GYRO_FS_RUNTIME
static int lsm6dso_gyro_range_set(const struct device *dev, int32_t range)
{
	int fs;
@@ -257,7 +240,6 @@ static int lsm6dso_gyro_range_set(const struct device *dev, int32_t range)
	data->gyro_gain = (lsm6dso_gyro_fs_sens[fs] * GAIN_UNIT_G);
	return 0;
}
#endif

static int lsm6dso_gyro_config(const struct device *dev,
			       enum sensor_channel chan,
@@ -265,14 +247,10 @@ static int lsm6dso_gyro_config(const struct device *dev,
			       const struct sensor_value *val)
{
	switch (attr) {
#ifdef LSM6DSO_GYRO_FS_RUNTIME
	case SENSOR_ATTR_FULL_SCALE:
		return lsm6dso_gyro_range_set(dev, sensor_rad_to_degrees(val));
#endif
#ifdef LSM6DSO_GYRO_ODR_RUNTIME
	case SENSOR_ATTR_SAMPLING_FREQUENCY:
		return lsm6dso_gyro_odr_set(dev, val->val1);
#endif
	default:
		LOG_DBG("Gyro attribute not supported.");
		return -ENOTSUP;
@@ -515,8 +493,7 @@ static int lsm6dso_gyro_channel_get(enum sensor_channel chan,
				    struct sensor_value *val,
				    struct lsm6dso_data *data)
{
	return lsm6dso_gyro_get_channel(chan, val, data,
					LSM6DSO_DEFAULT_GYRO_SENSITIVITY);
	return lsm6dso_gyro_get_channel(chan, val, data, data->gyro_gain);
}

#if defined(CONFIG_LSM6DSO_ENABLE_TEMP)
@@ -740,6 +717,7 @@ static int lsm6dso_init_chip(const struct device *dev)
	stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx;
	struct lsm6dso_data *lsm6dso = dev->data;
	uint8_t chip_id;
	uint8_t odr, fs;

	if (lsm6dso_device_id_get(ctx, &chip_id) < 0) {
		LOG_DBG("Failed reading chip id");
@@ -766,28 +744,35 @@ static int lsm6dso_init_chip(const struct device *dev)

	k_busy_wait(100);

	if (lsm6dso_accel_set_fs_raw(dev,
				     LSM6DSO_DEFAULT_ACCEL_FULLSCALE) < 0) {
		LOG_DBG("failed to set accelerometer full-scale");
	fs = cfg->accel_range;
	LOG_DBG("accel range is %d", fs);
	if (lsm6dso_accel_set_fs_raw(dev, fs) < 0) {
		LOG_ERR("failed to set accelerometer range %d", fs);
		return -EIO;
	}
	lsm6dso->acc_gain = LSM6DSO_DEFAULT_ACCEL_SENSITIVITY;
	lsm6dso->acc_gain = lsm6dso_accel_fs_sens[fs] * GAIN_UNIT_XL;

	lsm6dso->accel_freq = lsm6dso_odr_to_freq_val(CONFIG_LSM6DSO_ACCEL_ODR);
	if (lsm6dso_accel_set_odr_raw(dev, CONFIG_LSM6DSO_ACCEL_ODR) < 0) {
		LOG_DBG("failed to set accelerometer sampling rate");
	odr = cfg->accel_odr;
	LOG_DBG("accel odr is %d", odr);
	lsm6dso->accel_freq = lsm6dso_odr_to_freq_val(odr);
	if (lsm6dso_accel_set_odr_raw(dev, odr) < 0) {
		LOG_ERR("failed to set accelerometer odr %d", odr);
		return -EIO;
	}

	if (lsm6dso_gyro_set_fs_raw(dev, LSM6DSO_DEFAULT_GYRO_FULLSCALE) < 0) {
		LOG_DBG("failed to set gyroscope full-scale");
	fs = cfg->gyro_range;
	LOG_DBG("gyro range is %d", fs);
	if (lsm6dso_gyro_set_fs_raw(dev, fs) < 0) {
		LOG_ERR("failed to set gyroscope range %d", fs);
		return -EIO;
	}
	lsm6dso->gyro_gain = LSM6DSO_DEFAULT_GYRO_SENSITIVITY;
	lsm6dso->gyro_gain = (lsm6dso_gyro_fs_sens[fs] * GAIN_UNIT_G);

	lsm6dso->gyro_freq = lsm6dso_odr_to_freq_val(CONFIG_LSM6DSO_GYRO_ODR);
	if (lsm6dso_gyro_set_odr_raw(dev, CONFIG_LSM6DSO_GYRO_ODR) < 0) {
		LOG_DBG("failed to set gyroscope sampling rate");
	odr = cfg->gyro_odr;
	LOG_DBG("gyro odr is %d", odr);
	lsm6dso->gyro_freq = lsm6dso_odr_to_freq_val(odr);
	if (lsm6dso_gyro_set_odr_raw(dev, odr) < 0) {
		LOG_ERR("failed to set gyroscope odr %d", odr);
		return -EIO;
	}

@@ -892,6 +877,10 @@ static int lsm6dso_init(const struct device *dev)
					   LSM6DSO_SPI_OP,		\
					   0),				\
		},							\
		.accel_odr = DT_INST_PROP(inst, accel_odr),		\
		.accel_range = DT_INST_PROP(inst, accel_range),		\
		.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),	\
			(LSM6DSO_CFG_IRQ(inst)), ())			\
	}
@@ -913,6 +902,10 @@ static int lsm6dso_init(const struct device *dev)
		.stmemsc_cfg = {					\
			.i2c = I2C_DT_SPEC_INST_GET(inst),		\
		},							\
		.accel_odr = DT_INST_PROP(inst, accel_odr),		\
		.accel_range = DT_INST_PROP(inst, accel_range),		\
		.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),	\
			(LSM6DSO_CFG_IRQ(inst)), ())			\
	}
+4 −50
Original line number Diff line number Diff line
@@ -40,56 +40,6 @@
#define SENSOR_DEG2RAD_DOUBLE			(SENSOR_PI_DOUBLE / 180)
#define SENSOR_G_DOUBLE				(SENSOR_G / 1000000.0)

#if CONFIG_LSM6DSO_ACCEL_FS == 0
	#define LSM6DSO_ACCEL_FS_RUNTIME 1
	#define LSM6DSO_DEFAULT_ACCEL_FULLSCALE		0
	#define LSM6DSO_DEFAULT_ACCEL_SENSITIVITY	GAIN_UNIT_XL
#elif CONFIG_LSM6DSO_ACCEL_FS == 2
	#define LSM6DSO_DEFAULT_ACCEL_FULLSCALE		0
	#define LSM6DSO_DEFAULT_ACCEL_SENSITIVITY	GAIN_UNIT_XL
#elif CONFIG_LSM6DSO_ACCEL_FS == 4
	#define LSM6DSO_DEFAULT_ACCEL_FULLSCALE		2
	#define LSM6DSO_DEFAULT_ACCEL_SENSITIVITY	(2.0 * GAIN_UNIT_XL)
#elif CONFIG_LSM6DSO_ACCEL_FS == 8
	#define LSM6DSO_DEFAULT_ACCEL_FULLSCALE		3
	#define LSM6DSO_DEFAULT_ACCEL_SENSITIVITY	(4.0 * GAIN_UNIT_XL)
#elif CONFIG_LSM6DSO_ACCEL_FS == 16
	#define LSM6DSO_DEFAULT_ACCEL_FULLSCALE		1
	#define LSM6DSO_DEFAULT_ACCEL_SENSITIVITY	(8.0 * GAIN_UNIT_XL)
#endif

#if (CONFIG_LSM6DSO_ACCEL_ODR == 0)
#define LSM6DSO_ACCEL_ODR_RUNTIME 1
#endif

#define GYRO_FULLSCALE_125 4

#if CONFIG_LSM6DSO_GYRO_FS == 0
	#define LSM6DSO_GYRO_FS_RUNTIME 1
	#define LSM6DSO_DEFAULT_GYRO_FULLSCALE		4
	#define LSM6DSO_DEFAULT_GYRO_SENSITIVITY	GAIN_UNIT_G
#elif CONFIG_LSM6DSO_GYRO_FS == 125
	#define LSM6DSO_DEFAULT_GYRO_FULLSCALE		4
	#define LSM6DSO_DEFAULT_GYRO_SENSITIVITY	GAIN_UNIT_G
#elif CONFIG_LSM6DSO_GYRO_FS == 250
	#define LSM6DSO_DEFAULT_GYRO_FULLSCALE		0
	#define LSM6DSO_DEFAULT_GYRO_SENSITIVITY	(2.0 * GAIN_UNIT_G)
#elif CONFIG_LSM6DSO_GYRO_FS == 500
	#define LSM6DSO_DEFAULT_GYRO_FULLSCALE		1
	#define LSM6DSO_DEFAULT_GYRO_SENSITIVITY	(4.0 * GAIN_UNIT_G)
#elif CONFIG_LSM6DSO_GYRO_FS == 1000
	#define LSM6DSO_DEFAULT_GYRO_FULLSCALE		2
	#define LSM6DSO_DEFAULT_GYRO_SENSITIVITY	(8.0 * GAIN_UNIT_G)
#elif CONFIG_LSM6DSO_GYRO_FS == 2000
	#define LSM6DSO_DEFAULT_GYRO_FULLSCALE		3
	#define LSM6DSO_DEFAULT_GYRO_SENSITIVITY	(16.0 * GAIN_UNIT_G)
#endif


#if (CONFIG_LSM6DSO_GYRO_ODR == 0)
#define LSM6DSO_GYRO_ODR_RUNTIME 1
#endif

struct lsm6dso_config {
	stmdev_ctx_t ctx;
	union {
@@ -100,6 +50,10 @@ struct lsm6dso_config {
		const struct spi_dt_spec spi;
#endif
	} stmemsc_cfg;
	uint8_t accel_odr;
	uint8_t accel_range;
	uint8_t gyro_odr;
	uint8_t gyro_range;
#ifdef CONFIG_LSM6DSO_TRIGGER
	const struct gpio_dt_spec gpio_drdy;
	uint8_t int_pin;
+65 −0
Original line number Diff line number Diff line
@@ -26,3 +26,68 @@ properties:
        (INT1 or INT2) the drdy line is attached to. This property is not
        mandatory and if not present it defaults to 1 which is the
        configuration at power-up.

    accel-range:
      type: int
      required: false
      default: 0
      description: |
        Range in g. Default is power-up configuration.
      enum:
        - 0 # 2g  (0.061 mg/LSB)
        - 1 # 16g (0.488 mg/LSB)
        - 2 # 4g  (0.122 mg/LSB)
        - 3 # 8g  (0.244 mg/LSB)

    accel-odr:
      type: int
      required: false
      default: 0
      description: |
        Specify the default accelerometer output data rate expressed in samples per second (Hz).
        Default is power-up configuration.
      enum:
        - 0  # Power-Down
        - 1  # 12.5Hz
        - 2  # 26Hz
        - 3  # 52Hz
        - 4  # 104Hz
        - 5  # 208Hz
        - 6  # 417Hz
        - 7  # 833Hz
        - 8  # 1667Hz
        - 9  # 3333Hz
        - 10 # 6667Hz

    gyro-range:
      type: int
      required: false
      default: 0
      description: |
        Range in dps. Default is power-up configuration.
      enum:
        - 0 # 250 dps  (8.75 mdps/LSB)
        - 1 # 125 dps  (4.375 mdps/LSB)
        - 2 # 500 dps  (17.50 mdps/LSB)
        - 4 # 1000 dps (35 mdps/LSB)
        - 6 # 2000 dps (70 mdps/LSB)

    gyro-odr:
      type: int
      required: false
      default: 0
      description: |
        Specify the default gyro output data rate expressed in samples per second (Hz).
        Default is power-up configuration.
      enum:
        - 0  # Power-Down
        - 1  # 12.5Hz
        - 2  # 26Hz
        - 3  # 52Hz
        - 4  # 104Hz
        - 5  # 208Hz
        - 6  # 417Hz
        - 7  # 833Hz
        - 8  # 1667Hz
        - 9  # 3333Hz
        - 10 # 6667Hz