diff options
author | Gwendal Grignou <gwendal@chromium.org> | 2015-08-28 21:56:01 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2015-09-18 19:21:12 -0700 |
commit | 5254d5687c8db81d81c530ae46db6bc12d2af900 (patch) | |
tree | 33a4634ba5d69f455fbfbb4aa315d369cd5d64ee | |
parent | d2d67fae1e3b0947ec08e7f63cbcc0b4dadf05f2 (diff) | |
download | chrome-ec-5254d5687c8db81d81c530ae46db6bc12d2af900.tar.gz |
driver: bmi160: add code for setting double tap
Macro and code to set double tap parameters.
Enable double tap in Ryu.
BRANCH=smaug
TEST=double works: interrupt detected.
BUG=b:23570481
Change-Id: I11a84186f6dc49b75d0f09afb4b03dcbeea6066f
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/295949
Reviewed-by: Alec Berg <alecaberg@chromium.org>
-rw-r--r-- | board/ryu/board.h | 6 | ||||
-rw-r--r-- | driver/accelgyro_bmi160.c | 34 | ||||
-rw-r--r-- | driver/accelgyro_bmi160.h | 2 |
3 files changed, 26 insertions, 16 deletions
diff --git a/board/ryu/board.h b/board/ryu/board.h index cb2192aa28..aac0a766d4 100644 --- a/board/ryu/board.h +++ b/board/ryu/board.h @@ -153,10 +153,16 @@ /* Sensor support */ #define CONFIG_ACCELGYRO_BMI160 +#define CONFIG_GESTURE_DETECTION +#define CONFIG_GESTURE_HW_DETECTION +#define CONFIG_GESTURE_SENSOR_BATTERY_TAP 0 +#define CONFIG_GESTURE_TAP_THRES_MG 200 #define CONFIG_MAG_BMI160_BMM150 #define CONFIG_ALS_SI114X 0x41 #define CONFIG_ACCELGYRO_BMI160_INT_EVENT TASK_EVENT_CUSTOM(4) #define CONFIG_ALS_SI114X_INT_EVENT TASK_EVENT_CUSTOM(8) +/* event 2 to 9 are reserved for hardware interrupt */ +#define CONFIG_GESTURE_TAP_EVENT TASK_EVENT_CUSTOM(1024) #define CONFIG_ACCEL_INTERRUPTS #define CONFIG_CMD_ACCELS #define CONFIG_CMD_ACCEL_INFO diff --git a/driver/accelgyro_bmi160.c b/driver/accelgyro_bmi160.c index a229eecc79..86490c26b1 100644 --- a/driver/accelgyro_bmi160.c +++ b/driver/accelgyro_bmi160.c @@ -648,6 +648,10 @@ static int config_interrupt(const struct motion_sensor_t *s) msleep(30); raw_write8(s->addr, BMI160_CMD_REG, BMI160_CMD_INT_RESET); +#ifdef CONFIG_GESTURE_SENSOR_BATTERY_TAP + ret = raw_write8(s->addr, BMI160_INT_TAP_1, + BMI160_TAP_TH(s, CONFIG_GESTURE_TAP_THRES_MG)); +#endif /* configure int2 as an external input */ ret = raw_write8(s->addr, BMI160_INT_LATCH, BMI160_INT2_INPUT_EN); @@ -656,11 +660,12 @@ static int config_interrupt(const struct motion_sensor_t *s) ret = raw_write8(s->addr, BMI160_INT_OUT_CTRL, BMI160_INT_CTRL(1, OUTPUT_EN)); - /* Map Simple/Double Tap to int 1 - * Map Flat interrupt to int 1 - */ - ret = raw_write8(s->addr, BMI160_INT_MAP_REG(1), - BMI160_INT_FLAT | BMI160_INT_D_TAP | BMI160_INT_S_TAP); + /* Map activity interrupt to int 1 */ + tmp = 0; +#ifdef CONFIG_GESTURE_SENSOR_BATTERY_TAP + tmp |= BMI160_INT_D_TAP; +#endif + ret = raw_write8(s->addr, BMI160_INT_MAP_REG(1), tmp); #ifdef CONFIG_ACCEL_FIFO /* map fifo water mark to int 1 */ @@ -677,10 +682,9 @@ static int config_interrupt(const struct motion_sensor_t *s) #endif /* Set double tap interrupt and fifo*/ - ret = raw_read8(s->addr, BMI160_INT_EN_0, &tmp); - tmp |= BMI160_INT_FLAT_EN | BMI160_INT_D_TAP_EN | BMI160_INT_S_TAP_EN; - ret = raw_write8(s->addr, BMI160_INT_EN_0, tmp); - +#ifdef CONFIG_GESTURE_SENSOR_BATTERY_TAP + ret = raw_write8(s->addr, BMI160_INT_EN_0, BMI160_INT_D_TAP_EN); +#endif #ifdef CONFIG_ACCEL_FIFO ret = raw_read8(s->addr, BMI160_INT_EN_1, &tmp); tmp |= BMI160_INT_FWM_EN | BMI160_INT_FFUL_EN; @@ -707,12 +711,10 @@ static int irq_handler(struct motion_sensor_t *s, uint32_t *event) raw_read32(s->addr, BMI160_INT_STATUS_0, &interrupt); - if (interrupt & BMI160_S_TAP_INT) - CPRINTS("single tap: %08x", interrupt); +#ifdef CONFIG_GESTURE_SENSOR_BATTERY_TAP if (interrupt & BMI160_D_TAP_INT) - CPRINTS("double tap: %08x", interrupt); - if (interrupt & BMI160_FLAT_INT) - CPRINTS("flat: %08x", interrupt); + *event |= CONFIG_GESTURE_TAP_EVENT; +#endif /* * No need to read the FIFO here, motion sense task is * doing it on every interrupt. @@ -1034,12 +1036,12 @@ static int init(const struct motion_sensor_t *s) } #endif + set_range(s, s->default_range, 0); + #ifdef CONFIG_ACCEL_INTERRUPTS if (s->type == MOTIONSENSE_TYPE_ACCEL) ret = config_interrupt(s); #endif - set_range(s, s->default_range, 0); - CPRINTF("[%T %s: MS Done Init type:0x%X range:%d]\n", s->name, s->type, get_range(s)); return ret; diff --git a/driver/accelgyro_bmi160.h b/driver/accelgyro_bmi160.h index 069e49b265..0d6103a14c 100644 --- a/driver/accelgyro_bmi160.h +++ b/driver/accelgyro_bmi160.h @@ -301,6 +301,8 @@ enum fifo_header { #define BMI160_INT_TAP_0 0x63 #define BMI160_INT_TAP_1 0x64 +#define BMI160_TAP_TH(_s, _mg) \ + (MIN(((_mg) * 1000) / ((_s)->drv->get_range(_s) * 31250), 0x1f)) #define BMI160_INT_ORIENT_0 0x65 #define BMI160_INT_ORIENT_1 0x66 |