Skip to content

Commit afe0abe

Browse files
aviscontikartben
authored andcommitted
sensor: lsm6dsv16x: add SENSOR_TRIG_DATA_READY trigger
Add SENSOR_TRIG_DATA_READY trigger support to RTIO streaming. Currently it just handle XL drdy. Signed-off-by: Armando Visconti <[email protected]>
1 parent 1dd1b35 commit afe0abe

File tree

3 files changed

+323
-85
lines changed

3 files changed

+323
-85
lines changed

drivers/sensor/st/lsm6dsv16x/lsm6dsv16x.h

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ struct lsm6dsv16x_ibi_payload {
124124
uint8_t mlc_status;
125125
} __packed;
126126

127+
struct trigger_config {
128+
uint8_t int_fifo_th : 1;
129+
uint8_t int_fifo_full : 1;
130+
uint8_t int_drdy : 1;
131+
};
132+
127133
struct lsm6dsv16x_data {
128134
const struct device *dev;
129135
int16_t acc[3];
@@ -157,16 +163,17 @@ struct lsm6dsv16x_data {
157163
struct rtio_iodev_sqe *streaming_sqe;
158164
struct rtio *rtio_ctx;
159165
struct rtio_iodev *iodev;
160-
uint64_t fifo_timestamp;
166+
uint64_t timestamp;
167+
uint8_t status;
161168
uint8_t fifo_status[2];
162169
uint16_t fifo_count;
163-
uint8_t fifo_irq;
164-
uint8_t accel_batch_odr : 4;
165-
uint8_t gyro_batch_odr : 4;
166-
uint8_t temp_batch_odr : 2;
167-
uint8_t bus_type : 2; /* I2C is 0, SPI is 1, I3C is 2 */
168-
uint8_t sflp_batch_odr : 3;
169-
uint8_t reserved : 1;
170+
struct trigger_config trig_cfg;
171+
uint16_t accel_batch_odr : 4;
172+
uint16_t gyro_batch_odr : 4;
173+
uint16_t temp_batch_odr : 2;
174+
uint16_t bus_type : 2; /* I2C is 0, SPI is 1, I3C is 2 */
175+
uint16_t sflp_batch_odr : 3;
176+
uint16_t reserved : 1;
170177
int32_t gbias_x_udps;
171178
int32_t gbias_y_udps;
172179
int32_t gbias_z_udps;

drivers/sensor/st/lsm6dsv16x/lsm6dsv16x_decoder.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ static int lsm6dsv16x_decoder_get_frame_count(const uint8_t *buffer,
152152
uint16_t *frame_count)
153153
{
154154
struct lsm6dsv16x_fifo_data *data = (struct lsm6dsv16x_fifo_data *)buffer;
155+
struct lsm6dsv16x_rtio_data *rdata = (struct lsm6dsv16x_rtio_data *)buffer;
155156
const struct lsm6dsv16x_decoder_header *header = &data->header;
156157

157158
if (chan_spec.chan_idx != 0) {
@@ -164,13 +165,20 @@ static int lsm6dsv16x_decoder_get_frame_count(const uint8_t *buffer,
164165
case SENSOR_CHAN_ACCEL_Y:
165166
case SENSOR_CHAN_ACCEL_Z:
166167
case SENSOR_CHAN_ACCEL_XYZ:
168+
*frame_count = rdata->has_accel ? 1 : 0;
169+
return 0;
170+
167171
case SENSOR_CHAN_GYRO_X:
168172
case SENSOR_CHAN_GYRO_Y:
169173
case SENSOR_CHAN_GYRO_Z:
170174
case SENSOR_CHAN_GYRO_XYZ:
175+
*frame_count = rdata->has_gyro ? 1 : 0;
176+
return 0;
177+
171178
case SENSOR_CHAN_DIE_TEMP:
172-
*frame_count = 1;
179+
*frame_count = rdata->has_temp ? 1 : 0;
173180
return 0;
181+
174182
default:
175183
*frame_count = 0;
176184
return -ENOTSUP;
@@ -652,6 +660,8 @@ static int lsm6dsv16x_decoder_decode(const uint8_t *buffer, struct sensor_chan_s
652660

653661
if (header->is_fifo) {
654662
return lsm6dsv16x_decode_fifo(buffer, chan_spec, fit, max_count, data_out);
663+
} else {
664+
return lsm6dsv16x_decode_sample(buffer, chan_spec, fit, max_count, data_out);
655665
}
656666
#endif
657667

0 commit comments

Comments
 (0)