summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRong Chang <rongchang@chromium.org>2021-09-13 15:09:07 +0800
committerCommit Bot <commit-bot@chromium.org>2021-10-12 15:11:15 +0000
commit456ac6991337b78704c67d3727530161c20278c6 (patch)
tree47667139a5219e34a14743c335023f7cb5f41245
parentad8cc9e8088506f16f9a046b4cb9cd8e1cff044d (diff)
downloadchrome-ec-456ac6991337b78704c67d3727530161c20278c6.tar.gz
krane: Add motion sense config for BMI220
Add runtime BMI220 detection using CHIP_ID register. Fallback to BMI160 sensor driver. BUG=b:193945779 BRANCH=kukui TEST='ectool motionsense' and verify lid angle. Conflicts: board/kukui/board.h: not support CONFIG_I2C_XFER_LARGE_TRANSFER Signed-off-by: Rong Chang <rongchang@chromium.org> Change-Id: Ia284cdf115e5d60bdd63a36ad82751b23eb438b3 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3156315 Reviewed-by: Eric Yilun Lin <yllin@google.com> Reviewed-by: Ting Shen <phoenixshen@chromium.org> (cherry picked from commit 70a4a8505a33b2ced5b9932ea4da15edbe3b396e) Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3214015
-rw-r--r--board/kukui/board.c59
-rw-r--r--board/kukui/board.h5
-rw-r--r--board/kukui/gpio.inc2
3 files changed, 65 insertions, 1 deletions
diff --git a/board/kukui/board.c b/board/kukui/board.c
index bf65badb0f..7d18f724ff 100644
--- a/board/kukui/board.c
+++ b/board/kukui/board.c
@@ -56,6 +56,10 @@ static void gauge_interrupt(enum gpio_signal signal)
task_wake(TASK_ID_CHARGER);
}
+#ifdef SECTION_IS_RW
+static void motion_interrupt(enum gpio_signal signal);
+#endif /* SECTION_IS_RW */
+
#include "gpio_list.h"
/******************************************************************************/
@@ -544,8 +548,63 @@ const unsigned int motion_sensor_count = ARRAY_SIZE(motion_sensors);
const struct motion_sensor_t *motion_als_sensors[] = {
&motion_sensors[CLEAR_ALS],
};
+
+#ifdef BOARD_KRANE
+
+static bool is_bmi220_present;
+
+static void board_detect_bmi220(void)
+{
+ int id = -1;
+ struct motion_sensor_t *s;
+
+ if (chipset_in_state(CHIPSET_STATE_ANY_OFF))
+ return;
+
+ /* Detect accelgyro chip */
+ bmi_read8(I2C_PORT_ACCEL, BMI260_ADDR0_FLAGS, BMI260_CHIP_ID, &id);
+ if (id == BMI220_CHIP_ID_MAJOR) {
+ is_bmi220_present = true;
+ /* Lid Accel*/
+ s = &motion_sensors[LID_ACCEL];
+ s->chip = MOTIONSENSE_CHIP_BMI220;
+ s->drv = &bmi260_drv;
+ s->i2c_spi_addr_flags = BMI260_ADDR0_FLAGS;
+ /* Lid Gyro */
+ s = &motion_sensors[LID_GYRO];
+ s->chip = MOTIONSENSE_CHIP_BMI220;
+ s->drv = &bmi260_drv;
+ s->i2c_spi_addr_flags = BMI260_ADDR0_FLAGS;
+#ifdef CONFIG_MAG_BMI_BMM150
+ /* Lid Mag */
+ s = &motion_sensors[LID_MAG];
+ s->chip = MOTIONSENSE_CHIP_BMI220;
+ s->drv = &bmi260_drv;
+ s->i2c_spi_addr_flags = BMI260_ADDR0_FLAGS;
+#endif /* CONFIG_MAG_BMI_BMM150 */
+ }
+}
+DECLARE_HOOK(HOOK_CHIPSET_STARTUP, board_detect_bmi220, HOOK_PRIO_DEFAULT);
+DECLARE_HOOK(HOOK_INIT, board_detect_bmi220, HOOK_PRIO_DEFAULT + 1);
+#endif /* BOARD_KRANE */
+
#endif /* VARIANT_KUKUI_NO_SENSORS */
+#ifdef SECTION_IS_RW
+static void motion_interrupt(enum gpio_signal signal)
+{
+#if defined(BOARD_KRANE)
+ if (is_bmi220_present)
+ bmi260_interrupt(signal);
+ else
+ bmi160_interrupt(signal);
+#elif !defined(VARIANT_KUKUI_NO_SENSORS)
+ bmi160_interrupt(signal);
+#endif /* BOARD_KRANE, !VARIANT_KUKUI_NO_SENSORS */
+
+}
+#endif /* SECTION_IS_RW */
+
/*
* Return if VBUS is sagging too low
*/
diff --git a/board/kukui/board.h b/board/kukui/board.h
index 22d92b68ae..439b414cb2 100644
--- a/board/kukui/board.h
+++ b/board/kukui/board.h
@@ -61,6 +61,11 @@
#define CONFIG_ACCEL_INTERRUPTS
#define CONFIG_ACCELGYRO_BMI160_INT_EVENT \
TASK_EVENT_MOTION_SENSOR_INTERRUPT(LID_ACCEL)
+#ifdef BOARD_KRANE
+#define CONFIG_ACCELGYRO_BMI220
+#define CONFIG_ACCELGYRO_BMI260_INT_EVENT \
+ TASK_EVENT_MOTION_SENSOR_INTERRUPT(LID_ACCEL)
+#endif /* BOARD_KRANE */
#define CONFIG_ALS
#define ALS_COUNT 1
diff --git a/board/kukui/gpio.inc b/board/kukui/gpio.inc
index 1f17a24bcd..eed1fea828 100644
--- a/board/kukui/gpio.inc
+++ b/board/kukui/gpio.inc
@@ -30,7 +30,7 @@ GPIO_INT(AP_EC_WATCHDOG_L, PIN(C, 2), GPIO_INT_FALLING,
chipset_watchdog_interrupt)
GPIO_INT_RW(ACCEL_INT_ODL, PIN(A, 4), GPIO_INT_FALLING | GPIO_SEL_1P8V | GPIO_PULL_UP,
- bmi160_interrupt)
+ motion_interrupt)
GPIO_INT(CHARGER_INT_ODL, PIN(C, 13), GPIO_INT_FALLING | GPIO_PULL_UP,
rt946x_interrupt)
GPIO_INT_RO(EMMC_CMD, PIN(B, 15), GPIO_INT_FALLING,