diff --git a/drivers/sensor/tdk/icm45686/icm45686.h b/drivers/sensor/tdk/icm45686/icm45686.h index f6a4918c36a13..6f5cd195c3f6e 100644 --- a/drivers/sensor/tdk/icm45686/icm45686.h +++ b/drivers/sensor/tdk/icm45686/icm45686.h @@ -82,7 +82,7 @@ struct icm45686_encoded_data { struct icm45686_encoded_header header; union { struct icm45686_encoded_payload payload; - struct icm45686_encoded_fifo_payload fifo_payload; + FLEXIBLE_ARRAY_DECLARE(struct icm45686_encoded_fifo_payload, fifo_payload); }; }; diff --git a/drivers/sensor/tdk/icm45686/icm45686_decoder.c b/drivers/sensor/tdk/icm45686/icm45686_decoder.c index 8326228a48764..52ae4a8198a06 100644 --- a/drivers/sensor/tdk/icm45686/icm45686_decoder.c +++ b/drivers/sensor/tdk/icm45686/icm45686_decoder.c @@ -7,6 +7,7 @@ */ #include +#include #include "icm45686.h" #include "icm45686_reg.h" @@ -475,7 +476,7 @@ static int icm45686_fifo_decode(const uint8_t *buffer, void *data_out) { struct icm45686_encoded_data *edata = (struct icm45686_encoded_data *)buffer; - struct icm45686_encoded_fifo_payload *frame_begin = &edata->fifo_payload; + struct icm45686_encoded_fifo_payload *frame_begin = edata->fifo_payload; int count = 0; int err; @@ -489,11 +490,13 @@ static int icm45686_fifo_decode(const uint8_t *buffer, /** This driver assumes 20-byte fifo packets, with both accel and gyro, * and no auxiliary sensors. */ - __ASSERT(!(fdata->header & FIFO_HEADER_EXT_HEADER_EN(true)) && + CHECKIF(!(!(fdata->header & FIFO_HEADER_EXT_HEADER_EN(true)) && (fdata->header & FIFO_HEADER_ACCEL_EN(true)) && (fdata->header & FIFO_HEADER_GYRO_EN(true)) && - (fdata->header & FIFO_HEADER_HIRES_EN(true)), - "Unsupported FIFO packet format"); + (fdata->header & FIFO_HEADER_HIRES_EN(true)))) { + LOG_ERR("Unsupported FIFO packet format 0x%02x", fdata->header); + return -ENOTSUP; + } switch (chan_spec.chan_type) { case SENSOR_CHAN_ACCEL_XYZ: diff --git a/drivers/sensor/tdk/icm45686/icm45686_stream.c b/drivers/sensor/tdk/icm45686/icm45686_stream.c index 0d6281433b15b..2741593b2523e 100644 --- a/drivers/sensor/tdk/icm45686/icm45686_stream.c +++ b/drivers/sensor/tdk/icm45686/icm45686_stream.c @@ -470,8 +470,16 @@ void icm45686_stream_submit(const struct device *dev, if (data->stream.settings.enabled.fifo_ths || data->stream.settings.enabled.fifo_full) { + /** AN-000364: When operating in FIFO streaming mode, if FIFO threshold + * interrupt is triggered with M number of FIFO frames accumulated in the + * FIFO buffer, the host should only read the first M-1 number of FIFO + * frames. + * + * To avoid the case where M == 1 and M-- would be 0, + * M + 1 threshold is used so M count is read. + */ uint16_t fifo_ths = data->stream.settings.enabled.fifo_ths ? - cfg->settings.fifo_watermark : 0; + cfg->settings.fifo_watermark + 1 : 0; val = REG_FIFO_CONFIG2_FIFO_WM_GT_THS(true) | REG_FIFO_CONFIG2_FIFO_FLUSH(true);