summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver/accelgyro_lsm6dso.c55
-rw-r--r--driver/accelgyro_lsm6dso.h10
2 files changed, 28 insertions, 37 deletions
diff --git a/driver/accelgyro_lsm6dso.c b/driver/accelgyro_lsm6dso.c
index ca4d85edb8..fbce687f2c 100644
--- a/driver/accelgyro_lsm6dso.c
+++ b/driver/accelgyro_lsm6dso.c
@@ -159,32 +159,25 @@ static void push_fifo_data(struct motion_sensor_t *main_s, uint8_t *fifo,
motion_sense_fifo_stage_data(&vect, sensor, 3, saved_ts);
}
-static inline int load_fifo(struct motion_sensor_t *s,
- const struct lsm6dso_fstatus *fsts,
+static inline int load_fifo(struct motion_sensor_t *main_s,
+ const uint16_t fifo_len,
uint32_t saved_ts)
{
- uint8_t fifo[FIFO_READ_LEN], *ptr;
- int i, err, read_len = 0, word_len, fifo_len;
- uint16_t fifo_depth;
-
- fifo_depth = fsts->len & LSM6DSO_FIFO_DIFF_MASK;
- fifo_len = fifo_depth * LSM6DSO_FIFO_SAMPLE_SIZE;
- while (read_len < fifo_len) {
- word_len = GENERIC_MIN(fifo_len - read_len, sizeof(fifo));
- err = st_raw_read_n_noinc(s->port, s->i2c_spi_addr_flags,
+ uint8_t fifo[LSM6DSO_FIFO_SAMPLE_SIZE];
+ int i, err;
+
+ for (i = 0; i < fifo_len; i++) {
+ err = st_raw_read_n_noinc(main_s->port,
+ main_s->i2c_spi_addr_flags,
LSM6DSO_FIFO_DATA_ADDR_TAG,
- fifo, word_len);
+ fifo, LSM6DSO_FIFO_SAMPLE_SIZE);
if (err != EC_SUCCESS)
return err;
- for (i = 0; i < word_len; i += LSM6DSO_FIFO_SAMPLE_SIZE) {
- ptr = &fifo[i];
- push_fifo_data(LSM6DSO_MAIN_SENSOR(s), ptr, saved_ts);
- }
- read_len += word_len;
+ push_fifo_data(main_s, fifo, saved_ts);
}
- return read_len;
+ return EC_SUCCESS;
}
/**
@@ -234,31 +227,37 @@ void lsm6dso_interrupt(enum gpio_signal signal)
*/
static int irq_handler(struct motion_sensor_t *s, uint32_t *event)
{
- int ret = EC_SUCCESS;
+ int ret = EC_SUCCESS, fifo_len = 0;
struct lsm6dso_fstatus fsts;
+ bool has_read_fifo = false;
- if (((s->type != MOTIONSENSE_TYPE_ACCEL) &&
- (s->type != MOTIONSENSE_TYPE_GYRO)) ||
+ if ((s->type != MOTIONSENSE_TYPE_ACCEL) ||
(!(*event & CONFIG_ACCEL_LSM6DSO_INT_EVENT)))
return EC_ERROR_NOT_HANDLED;
- if (IS_ENABLED(CONFIG_ACCEL_FIFO)) {
+ if (!IS_ENABLED(CONFIG_ACCEL_FIFO))
+ return EC_SUCCESS;
+
+ do {
/* Read how many data patterns on FIFO to read. */
ret = st_raw_read_n_noinc(s->port, s->i2c_spi_addr_flags,
LSM6DSO_FIFO_STS1_ADDR,
(uint8_t *)&fsts, sizeof(fsts));
if (ret != EC_SUCCESS)
- return ret;
+ break;
if (fsts.len & (LSM6DSO_FIFO_DATA_OVR | LSM6DSO_FIFO_FULL))
CPRINTS("%s FIFO Overrun: %04x", s->name, fsts.len);
- if (fsts.len & LSM6DSO_FIFO_DIFF_MASK)
- ret = load_fifo(s, &fsts, last_interrupt_timestamp);
+ fifo_len = fsts.len & LSM6DSO_FIFO_DIFF_MASK;
+ if (fifo_len) {
+ ret = load_fifo(s, fifo_len, last_interrupt_timestamp);
+ has_read_fifo = true;
+ }
+ } while (fifo_len != 0 && ret == EC_SUCCESS);
- if (IS_ENABLED(CONFIG_ACCEL_FIFO) && ret > 0)
- motion_sense_fifo_commit_data();
- }
+ if (ret == EC_SUCCESS && has_read_fifo)
+ motion_sense_fifo_commit_data();
return ret;
}
diff --git a/driver/accelgyro_lsm6dso.h b/driver/accelgyro_lsm6dso.h
index a786f5adf0..9a58fe7d36 100644
--- a/driver/accelgyro_lsm6dso.h
+++ b/driver/accelgyro_lsm6dso.h
@@ -60,10 +60,6 @@
(LSM6DSO_CTRL1_ADDR + (_sensor))
#define LSM6DSO_ODR_MASK 0xf0
-/* Hardware FIFO size in byte */
-#define LSM6DSO_MAX_FIFO_SIZE 4096
-#define LSM6DSO_MAX_FIFO_LENGTH (LSM6DSO_MAX_FIFO_SIZE / OUT_XYZ_SIZE)
-
/* FIFO decimator registers and bitmask */
#define LSM6DSO_FIFO_CTRL1_ADDR 0x07
#define LSM6DSO_FIFO_CTRL2_ADDR 0x08
@@ -104,11 +100,8 @@ enum lsm6dso_dev_fifo {
};
/* Define FIFO data pattern, tag and len */
-#define LSM6DSO_SAMPLE_SIZE 6
-#define LSM6DSO_TS_SAMPLE_SIZE 4
#define LSM6DSO_TAG_SIZE 1
-#define LSM6DSO_FIFO_SAMPLE_SIZE LSM6DSO_SAMPLE_SIZE + LSM6DSO_TAG_SIZE
-#define LSM6DSO_MAX_FIFO_DEPTH 416
+#define LSM6DSO_FIFO_SAMPLE_SIZE (OUT_XYZ_SIZE + LSM6DSO_TAG_SIZE)
enum lsm6dso_tag_fifo {
LSM6DSO_GYRO_TAG = 0x01,
@@ -222,7 +215,6 @@ struct lsm6dso_data {
/* Macro to initialize motion_sensors structure */
#define LSM6DSO_ST_DATA(g, type) (&((g).st_data[type]))
-#define LSM6DSO_MAIN_SENSOR(_s) ((_s) - (_s)->type)
extern const struct accelgyro_drv lsm6dso_drv;