summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Peress <peress@chromium.org>2021-05-04 12:18:13 -0600
committerCommit Bot <commit-bot@chromium.org>2021-07-12 09:05:53 +0000
commit5209a1c5699ebd30a39cbc460f40d866969a3c5e (patch)
treef8e8f1342493f562731361c5226893499e596e86
parentc7138bf8f638b3f487baaf998bcbe4aecb5eaaca (diff)
downloadchrome-ec-5209a1c5699ebd30a39cbc460f40d866969a3c5e.tar.gz
common: motionsense fifo: Reset the initialized bits after commit
Previously once we had one sample from a sensor, we considered the fifo initialized. Meaning we would use our computed next timestamp to spread the timestamps. This was causing issues with some devices that ended up causing the timestamps to run ahead. Reset next_timestamp_initialized back to 0 after each commit. This will allow repeated timestamps but only if a driver stages/commits the same timestamp twice. Staging the same timestamp with only a single commit will still work as before (which is the expected path). BRANCH=none BUG=b:168335284 TEST=make run-motion_sense_fifo Signed-off-by: Yuval Peress <peress@chromium.org> Change-Id: Ib7c566f69d7c1e4e898050b67105555dd05376e5 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2871055 Reviewed-by: Gwendal Grignou <gwendal@chromium.org> (cherry picked from commit 9ac6a40461e949d122cd68f89818e94eeb820f58) Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2875110 Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org> Tested-by: Gwendal Grignou <gwendal@chromium.org> Commit-Queue: Gwendal Grignou <gwendal@chromium.org>
-rw-r--r--common/motion_sense_fifo.c6
-rw-r--r--test/motion_sense_fifo.c9
2 files changed, 13 insertions, 2 deletions
diff --git a/common/motion_sense_fifo.c b/common/motion_sense_fifo.c
index 2b697e1f4c..244032d10a 100644
--- a/common/motion_sense_fifo.c
+++ b/common/motion_sense_fifo.c
@@ -549,6 +549,12 @@ commit_data_end:
/* Reset metadata for next staging cycle. */
memset(&fifo_staged, 0, sizeof(fifo_staged));
+ /*
+ * Reset the initialized bits. This will allow new timestamps to be
+ * considered as the new "source of truth".
+ */
+ next_timestamp_initialized = 0;
+
mutex_unlock(&g_sensor_mutex);
}
diff --git a/test/motion_sense_fifo.c b/test/motion_sense_fifo.c
index 28e7a3019a..c75cbe3c35 100644
--- a/test/motion_sense_fifo.c
+++ b/test/motion_sense_fifo.c
@@ -295,6 +295,12 @@ static int test_spread_double_commit_same_timestamp(void)
const uint32_t now = __hw_clock_source_read();
int read_count;
+ /*
+ * Stage and commit the same sample. This is not expected to happen
+ * since batches of sensor samples should be staged together and only
+ * commit once. We assume that the driver did this on purpose and will
+ * allow the same timestamp to be sent.
+ */
motion_sensors[0].oversampling_ratio = 1;
motion_sensors[0].collection_rate = 20000; /* ns */
motion_sense_fifo_stage_data(data, motion_sensors, 3, now - 20500);
@@ -308,8 +314,7 @@ static int test_spread_double_commit_same_timestamp(void)
TEST_BITS_SET(data[0].flags, MOTIONSENSE_SENSOR_FLAG_TIMESTAMP);
TEST_EQ(data[0].timestamp, now - 20500, "%u");
TEST_BITS_SET(data[2].flags, MOTIONSENSE_SENSOR_FLAG_TIMESTAMP);
- TEST_GT(time_until(now - 20500, data[2].timestamp), 10000, "%u");
- TEST_LE(time_until(now - 20500, data[2].timestamp), 20000, "%u");
+ TEST_EQ(data[2].timestamp, now - 20500, "%u");
return EC_SUCCESS;
}