Skip to content

Commit 557eb47

Browse files
xodus7kartben
authored andcommitted
drivers: sensor: lsm6dsv16x: support SENSOR_TRIG_DELTA trigger
The enables the SENSOR_TRIG_DELTA trigger using the wakeup interrupt feature of the sensor. Signed-off-by: Corey Wharton <xodus7@cwharton.com>
1 parent 3fef72a commit 557eb47

File tree

2 files changed

+72
-4
lines changed

2 files changed

+72
-4
lines changed

drivers/sensor/st/lsm6dsv16x/lsm6dsv16x.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,8 @@ struct lsm6dsv16x_data {
174174
const struct sensor_trigger *trig_drdy_acc;
175175
sensor_trigger_handler_t handler_drdy_gyr;
176176
const struct sensor_trigger *trig_drdy_gyr;
177-
sensor_trigger_handler_t handler_drdy_temp;
178-
const struct sensor_trigger *trig_drdy_temp;
177+
sensor_trigger_handler_t handler_wakeup;
178+
const struct sensor_trigger *trig_wakeup;
179179

180180
#if defined(CONFIG_LSM6DSV16X_TRIGGER_OWN_THREAD)
181181
K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_LSM6DSV16X_THREAD_STACK_SIZE);

drivers/sensor/st/lsm6dsv16x/lsm6dsv16x_trigger.c

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,53 @@ static int lsm6dsv16x_enable_g_int(const struct device *dev, int enable)
112112
return ret;
113113
}
114114

115+
/**
116+
* lsm6dsv16x_enable_wake_int - Enable selected int pin to generate wakeup interrupt
117+
*/
118+
static int lsm6dsv16x_enable_wake_int(const struct device *dev, int enable)
119+
{
120+
const struct lsm6dsv16x_config *cfg = dev->config;
121+
stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx;
122+
int ret;
123+
lsm6dsv16x_interrupt_mode_t int_mode;
124+
125+
int_mode.enable = enable ? 1 : 0;
126+
int_mode.lir = !cfg->drdy_pulsed;
127+
ret = lsm6dsv16x_interrupt_enable_set(ctx, int_mode);
128+
if (ret < 0) {
129+
LOG_ERR("interrupt_enable_set error");
130+
return ret;
131+
}
132+
133+
if ((cfg->drdy_pin == 1) || ON_I3C_BUS(cfg)) {
134+
lsm6dsv16x_pin_int_route_t val;
135+
136+
ret = lsm6dsv16x_pin_int1_route_get(ctx, &val);
137+
if (ret < 0) {
138+
LOG_ERR("pint_int1_route_get error");
139+
return ret;
140+
}
141+
142+
val.wakeup = enable ? 1 : 0;
143+
144+
ret = lsm6dsv16x_pin_int1_route_set(ctx, &val);
145+
} else {
146+
lsm6dsv16x_pin_int_route_t val;
147+
148+
ret = lsm6dsv16x_pin_int2_route_get(ctx, &val);
149+
if (ret < 0) {
150+
LOG_ERR("pint_int2_route_get error");
151+
return ret;
152+
}
153+
154+
val.wakeup = enable ? 1 : 0;
155+
156+
ret = lsm6dsv16x_pin_int2_route_set(ctx, &val);
157+
}
158+
159+
return ret;
160+
}
161+
115162
/**
116163
* lsm6dsv16x_trigger_set - link external trigger to event data ready
117164
*/
@@ -156,7 +203,18 @@ int lsm6dsv16x_trigger_set(const struct device *dev,
156203
lsm6dsv16x_enable_g_int(dev, LSM6DSV16X_DIS_BIT);
157204
}
158205
}
159-
206+
break;
207+
case SENSOR_TRIG_DELTA:
208+
if (trig->chan != SENSOR_CHAN_ACCEL_XYZ) {
209+
return -ENOTSUP;
210+
}
211+
lsm6dsv16x->handler_wakeup = handler;
212+
lsm6dsv16x->trig_wakeup = trig;
213+
if (handler) {
214+
lsm6dsv16x_enable_wake_int(dev, LSM6DSV16X_EN_BIT);
215+
} else {
216+
lsm6dsv16x_enable_wake_int(dev, LSM6DSV16X_DIS_BIT);
217+
}
160218
break;
161219
default:
162220
ret = -ENOTSUP;
@@ -178,6 +236,7 @@ static void lsm6dsv16x_handle_interrupt(const struct device *dev)
178236
const struct lsm6dsv16x_config *cfg = dev->config;
179237
stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx;
180238
lsm6dsv16x_data_ready_t status;
239+
lsm6dsv16x_all_int_src_t all_int_src;
181240
int ret;
182241

183242
while (1) {
@@ -194,7 +253,13 @@ static void lsm6dsv16x_handle_interrupt(const struct device *dev)
194253
return;
195254
}
196255

197-
if (((status.drdy_xl == 0) && (status.drdy_gy == 0)) ||
256+
ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_ALL_INT_SRC, (uint8_t *)&all_int_src, 1);
257+
if (ret < 0) {
258+
LOG_DBG("failed reading all_int_src reg");
259+
return;
260+
}
261+
262+
if (((status.drdy_xl == 0) && (status.drdy_gy == 0) && (all_int_src.wu_ia == 0)) ||
198263
IS_ENABLED(CONFIG_LSM6DSV16X_STREAM)) {
199264
break;
200265
}
@@ -207,6 +272,9 @@ static void lsm6dsv16x_handle_interrupt(const struct device *dev)
207272
lsm6dsv16x->handler_drdy_gyr(dev, lsm6dsv16x->trig_drdy_gyr);
208273
}
209274

275+
if ((all_int_src.wu_ia) && lsm6dsv16x->handler_wakeup != NULL) {
276+
lsm6dsv16x->handler_wakeup(dev, lsm6dsv16x->trig_wakeup);
277+
}
210278
}
211279

212280
if (!ON_I3C_BUS(cfg) || (I3C_INT_PIN(cfg))) {

0 commit comments

Comments
 (0)