diff options
author | Mathew King <mathewk@chromium.org> | 2019-04-18 15:28:58 -0600 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-04-27 01:36:50 -0700 |
commit | 0c71c4748699f5f2cb1423ffc07d4c852d04b3fc (patch) | |
tree | 7c2e48c04af2514e48ecae26eb039d4545c644b3 /driver/als_si114x.c | |
parent | 0f25f85e44362e7feb15ce59974f0423abab0b5f (diff) | |
download | chrome-ec-0c71c4748699f5f2cb1423ffc07d4c852d04b3fc.tar.gz |
motion sense: Calculate loop time based on sensor needs
Currently the motion sense loop bases its sleep time based on the
fastest active sensor. This method has several flaws:
1. It does not take into account any task switching overhead
2. With a mix of interrupt driven and forced sensors the sleep time gets
recalculated every time there is an interrupt causing the loop to
oversleep
3. If multiple sensors do not have rates that are in sync the timing of
the slower sensor will be off. For example if there was a sensor running
at 50 Hz and one running at 20 Hz the slower sensor would end up being
sampled at about 16 Hz instead of 20 Hz
This change calculates an ideal read time for every forced mode sensor
and calculates the sleep time based on the nearest read time. Every time
a sensor is read the next read time is calculated based on the ideal read
time not the actual read time so that reading does not drift because of
system load or other overhead.
BUG=b:129159505
TEST=Ran sensor CTS tests on arcada, without this change the
magnetometer was failing 50 Hz tests at about 38 Hz with 30% jitter
with this change in place 50 Hz was spot on with about 10% jitter
BRANCH=none
Change-Id: Ia4fccb083713b490518d45e7398eb3be3b957eae
Signed-off-by: Mathew King <mathewk@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1574786
Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'driver/als_si114x.c')
-rw-r--r-- | driver/als_si114x.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/driver/als_si114x.c b/driver/als_si114x.c index 17f178080f..be3f090db3 100644 --- a/driver/als_si114x.c +++ b/driver/als_si114x.c @@ -295,6 +295,7 @@ static int read(const struct motion_sensor_t *s, intv3_t v) case SI114X_NOT_READY: ret = EC_ERROR_NOT_POWERED; } +#if 0 /* This code is incorrect https://crbug.com/956569 */ if (ret == EC_ERROR_ACCESS_DENIED && s->type == MOTIONSENSE_TYPE_LIGHT) { timestamp_t ts_now = get_time(); @@ -315,6 +316,7 @@ static int read(const struct motion_sensor_t *s, intv3_t v) init(s); } } +#endif return ret; } |