summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGwendal Grignou <gwendal@chromium.org>2015-08-28 21:56:01 -0700
committerchrome-bot <chrome-bot@chromium.org>2015-09-18 19:21:12 -0700
commit5254d5687c8db81d81c530ae46db6bc12d2af900 (patch)
tree33a4634ba5d69f455fbfbb4aa315d369cd5d64ee
parentd2d67fae1e3b0947ec08e7f63cbcc0b4dadf05f2 (diff)
downloadchrome-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.h6
-rw-r--r--driver/accelgyro_bmi160.c34
-rw-r--r--driver/accelgyro_bmi160.h2
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