Skip to content

Commit be0e983

Browse files
kabeljancfriedt
authored andcommitted
drivers: sensor: st: lis2du12: add SENSOR_TRIG_DELTA support
Extend the LIS2DU12 accelerometer driver with SENSOR_TRIG_DELTA support. The detection is based on the slope between successive channel readings. Support for setting SENSOR_ATTR_SLOPE_TH and SENSOR_ATTR_SLOPE_DUR is added as well. In line with other sensors, SENSOR_ATTR_SLOPE_TH is configured in SI units (m/s^2) and SENSOR_ATTR_SLOPE_DUR in samples relative to the ODR. The new trigger can be mapped either to the same GPIO as the data-ready interrupt or to a dedicated one. Signed-off-by: Jan Kablitz <[email protected]>
1 parent 58b2153 commit be0e983

File tree

4 files changed

+301
-49
lines changed

4 files changed

+301
-49
lines changed

drivers/sensor/st/lis2du12/lis2du12.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* ST Microelectronics LIS2DU12 3-axis accelerometer sensor driver
22
*
33
* Copyright (c) 2023 STMicroelectronics
4+
* Copyright (c) 2025 8tronix GmbH
45
*
56
* SPDX-License-Identifier: Apache-2.0
67
*
@@ -59,7 +60,6 @@ static int lis2du12_accel_set_fs_raw(const struct device *dev, uint8_t fs)
5960
{
6061
const struct lis2du12_config *cfg = dev->config;
6162
stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx;
62-
struct lis2du12_data *data = dev->data;
6363
lis2du12_md_t mode;
6464

6565
if (lis2du12_mode_get(ctx, &mode) < 0) {
@@ -71,16 +71,13 @@ static int lis2du12_accel_set_fs_raw(const struct device *dev, uint8_t fs)
7171
return -EIO;
7272
}
7373

74-
data->accel_fs = fs;
75-
7674
return 0;
7775
}
7876

7977
static int lis2du12_accel_set_odr_raw(const struct device *dev, uint8_t odr)
8078
{
8179
const struct lis2du12_config *cfg = dev->config;
8280
stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx;
83-
struct lis2du12_data *data = dev->data;
8481
lis2du12_md_t mode;
8582

8683
if (lis2du12_mode_get(ctx, &mode) < 0) {
@@ -92,8 +89,6 @@ static int lis2du12_accel_set_odr_raw(const struct device *dev, uint8_t odr)
9289
return -EIO;
9390
}
9491

95-
data->accel_freq = odr;
96-
9792
return 0;
9893
}
9994

@@ -129,6 +124,7 @@ static int lis2du12_accel_range_set(const struct device *dev, int32_t range)
129124
return -EIO;
130125
}
131126

127+
data->accel_fs = lis2du12_accel_fs_map[fs];
132128
data->acc_gain = lis2du12_accel_fs_map[fs] * GAIN_UNIT_XL / 2;
133129
return 0;
134130
}
@@ -143,6 +139,12 @@ static int lis2du12_accel_config(const struct device *dev,
143139
return lis2du12_accel_range_set(dev, sensor_ms2_to_g(val));
144140
case SENSOR_ATTR_SAMPLING_FREQUENCY:
145141
return lis2du12_accel_odr_set(dev, val->val1);
142+
#if defined(CONFIG_LIS2DU12_TRIGGER)
143+
case SENSOR_ATTR_SLOPE_TH:
144+
return lis2du12_accel_set_wake_th(dev, val);
145+
case SENSOR_ATTR_SLOPE_DUR:
146+
return lis2du12_accel_set_wake_dur(dev, val);
147+
#endif
146148
default:
147149
LOG_WRN("Accel attribute %d not supported.", attr);
148150
return -ENOTSUP;
@@ -349,6 +351,7 @@ static int lis2du12_init_chip(const struct device *dev)
349351
LOG_ERR("failed to set accelerometer range %d", fs);
350352
return -EIO;
351353
}
354+
lis2du12->accel_fs = lis2du12_accel_fs_map[fs];
352355
lis2du12->acc_gain = lis2du12_accel_fs_map[fs] * GAIN_UNIT_XL / 2;
353356

354357
/* set odr from DT (the only way to go in high performance) */
@@ -414,7 +417,8 @@ static int lis2du12_init(const struct device *dev)
414417
.int1_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, int1_gpios, { 0 }), \
415418
.int2_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, int2_gpios, { 0 }), \
416419
.drdy_pulsed = DT_INST_PROP(inst, drdy_pulsed), \
417-
.drdy_pin = DT_INST_PROP(inst, drdy_pin)
420+
.drdy_pin = DT_INST_PROP(inst, drdy_pin), \
421+
.delta_pin = DT_INST_PROP(inst, delta_pin),
418422
#else
419423
#define LIS2DU12_CFG_IRQ(inst)
420424
#endif /* CONFIG_LIS2DU12_TRIGGER */

drivers/sensor/st/lis2du12/lis2du12.h

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* ST Microelectronics LIS2DU12 3-axis accelerometer sensor driver
22
*
33
* Copyright (c) 2023 STMicroelectronics
4+
* Copyright (c) 2025 8tronix GmbH
45
*
56
* SPDX-License-Identifier: Apache-2.0
67
*
@@ -32,6 +33,9 @@
3233
/* Accel sensor sensitivity grain is 61 ug/LSB */
3334
#define GAIN_UNIT_XL (61LL)
3435

36+
/* Wake-up duration raw grain is ODR_times (sample periods) */
37+
#define LIS2DU12_WAKUP_DUR_SAMPLES_MAX 15
38+
3539
#define SENSOR_G_DOUBLE (SENSOR_G / 1000000.0)
3640

3741
struct lis2du12_config {
@@ -52,6 +56,7 @@ struct lis2du12_config {
5256
const struct gpio_dt_spec int1_gpio;
5357
const struct gpio_dt_spec int2_gpio;
5458
uint8_t drdy_pin;
59+
uint8_t delta_pin;
5560
bool trig_enabled;
5661
#endif /* CONFIG_LIS2DU12_TRIGGER */
5762
};
@@ -66,16 +71,17 @@ union samples {
6671
struct lis2du12_data {
6772
const struct device *dev;
6873
int16_t acc[3];
69-
uint32_t acc_gain;
70-
uint16_t accel_freq;
71-
uint8_t accel_fs;
74+
uint32_t acc_gain; /* in ug/LSB */
75+
uint8_t accel_fs; /* in g */
7276

7377
#ifdef CONFIG_LIS2DU12_TRIGGER
74-
struct gpio_dt_spec *drdy_gpio;
78+
atomic_t trig_flags;
7579

76-
struct gpio_callback gpio_cb;
80+
struct gpio_callback gpio_cb[2];
7781
sensor_trigger_handler_t handler_drdy_acc;
7882
const struct sensor_trigger *trig_drdy_acc;
83+
sensor_trigger_handler_t handler_delta_xyz_acc;
84+
const struct sensor_trigger *trig_delta_xyz_acc;
7985

8086
#if defined(CONFIG_LIS2DU12_TRIGGER_OWN_THREAD)
8187
K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_LIS2DU12_THREAD_STACK_SIZE);
@@ -93,6 +99,10 @@ int lis2du12_trigger_set(const struct device *dev,
9399
sensor_trigger_handler_t handler);
94100

95101
int lis2du12_init_interrupt(const struct device *dev);
102+
103+
int lis2du12_accel_set_wake_th(const struct device *dev, const struct sensor_value *val);
104+
105+
int lis2du12_accel_set_wake_dur(const struct device *dev, const struct sensor_value *val);
96106
#endif
97107

98108
#endif /* ZEPHYR_DRIVERS_SENSOR_LIS2DU12_LIS2DU12_H_ */

0 commit comments

Comments
 (0)