diff options
author | Rong Chang <rongchang@chromium.org> | 2021-09-13 15:09:07 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-10-01 11:26:10 +0000 |
commit | 70a4a8505a33b2ced5b9932ea4da15edbe3b396e (patch) | |
tree | a48f6e1bd9be5ee591fd43334fa00045a2cbeeba | |
parent | 499d3f70351e7ab11d3b7252f1f9b0ff69aaf902 (diff) | |
download | chrome-ec-70a4a8505a33b2ced5b9932ea4da15edbe3b396e.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.
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>
-rw-r--r-- | board/kukui/board.c | 59 | ||||
-rw-r--r-- | board/kukui/board.h | 6 | ||||
-rw-r--r-- | board/kukui/gpio.inc | 2 |
3 files changed, 66 insertions, 1 deletions
diff --git a/board/kukui/board.c b/board/kukui/board.c index 9abcc08cdc..8d386815c6 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" /******************************************************************************/ @@ -559,8 +563,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 e771c9891d..dd031f90f0 100644 --- a/board/kukui/board.h +++ b/board/kukui/board.h @@ -58,6 +58,12 @@ #define CONFIG_ACCEL_INTERRUPTS #define CONFIG_ACCELGYRO_BMI160_INT_EVENT \ TASK_EVENT_MOTION_SENSOR_INTERRUPT(LID_ACCEL) +#ifdef BOARD_KRANE +#define CONFIG_I2C_XFER_LARGE_TRANSFER +#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, |