diff options
author | Gwendal Grignou <gwendal@chromium.org> | 2015-11-09 15:52:50 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2015-11-13 01:00:39 -0800 |
commit | 66a72f0b6e379edc3a2a52fa2e9b0f66c557a447 (patch) | |
tree | cea7dc81e2b5b747b40af326ec0f2631976cf8f4 /common/motion_sense.c | |
parent | 0922cc81ce22204264a2b96cec4bf2195939e516 (diff) | |
download | chrome-ec-66a72f0b6e379edc3a2a52fa2e9b0f66c557a447.tar.gz |
motion: minium interval between motion task now a variable
On Ryu EVT2, where sensors share a 100kb i2c bus with other device,
when the sensors set to their maximal frequency and sampling interval
set to 5ms, the power management task would wait forever for the i2c
lock.
Increase the minimal amount of time the task can wait from 3ms to 8ms in
that case.
This is not an issue for Ryu PVT where the sensors are on a separate SPI
bus. However, on EVT, when setting the accelerometer/gyro over 125Hz, EC
won't be able to deliver the data in non-batched mode.
BRANCH=smaug
BUG=b:25510300
TEST=Without this change, an evt2 board would crash when plugging/unplugging
the charger while the sensors are set with:
echo 200000 > iio:device0/frequency # Accel
echo 5 > iio:device0/sampling_frequency
echo 200000 > iio:device1/frequency # Gyro
echo 25000 > iio:device2/frequency # Mag
Change-Id: Idb30da9ab8da61284388db73365c37be3a250dec
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/311755
Reviewed-by: Alec Berg <alecaberg@chromium.org>
Diffstat (limited to 'common/motion_sense.c')
-rw-r--r-- | common/motion_sense.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/common/motion_sense.c b/common/motion_sense.c index c72165bc7e..7602d62334 100644 --- a/common/motion_sense.c +++ b/common/motion_sense.c @@ -39,6 +39,8 @@ test_export_static unsigned int motion_interval; /* Delay between FIFO interruption. */ static unsigned int motion_int_interval; +/* Minimum time in between running motion sense task loop. */ +unsigned int motion_min_interval = CONFIG_MOTION_MIN_SENSE_WAIT_TIME * MSEC; #ifdef CONFIG_CMD_ACCEL_INFO static int accel_disp; #endif @@ -769,8 +771,8 @@ void motion_sense_task(void) * Guarantee some minimum delay to allow other lower * priority tasks to run. */ - if (wait_us < MIN_MOTION_SENSE_WAIT_TIME) - wait_us = MIN_MOTION_SENSE_WAIT_TIME; + if (wait_us < motion_min_interval) + wait_us = motion_min_interval; } else { wait_us = -1; } @@ -914,7 +916,7 @@ static int host_cmd_motion_sense(struct host_cmd_handler_args *args) else sensor->config[SENSOR_CONFIG_AP].ec_rate = MAX(in->ec_rate.data, - MIN_MOTION_SENSE_WAIT_TIME / MSEC); + motion_min_interval / MSEC); /* Bound the new sampling rate. */ motion_sense_set_motion_intervals(); @@ -1327,7 +1329,7 @@ static int command_accel_read_xyz(int argc, char **argv) ccprintf("vector not ready\n"); ccprintf("Last calib. data %d: %-5d %-5d %-5d\n", id, sensor->xyz[X], sensor->xyz[Y], sensor->xyz[Z]); - task_wait_event(MIN_MOTION_SENSE_WAIT_TIME); + task_wait_event(motion_min_interval); } return EC_SUCCESS; } |