From 77989be08c17cf6a703d34ac59d6ad424d05487b Mon Sep 17 00:00:00 2001 From: Zick Wei Date: Fri, 6 May 2022 11:50:35 +0800 Subject: garg: support imu bmi260 BUG=b:231646511 BRANCH=firmware-octopus-11297.B TEST=verified on rework garg DUT, BMI260 work as intended. Signed-off-by: Zick Wei Change-Id: I652d62c68f1cf8f305c467772c31f58eb2cd42a6 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3631913 Commit-Queue: Henry Sun Reviewed-by: Henry Sun --- baseboard/octopus/cbi_ssfc.h | 1 + board/garg/board.c | 64 ++++++++++++++++++++++++++++++++++++++++++++ board/garg/board.h | 3 +++ 3 files changed, 68 insertions(+) diff --git a/baseboard/octopus/cbi_ssfc.h b/baseboard/octopus/cbi_ssfc.h index b762336e59..0b9eafc888 100644 --- a/baseboard/octopus/cbi_ssfc.h +++ b/baseboard/octopus/cbi_ssfc.h @@ -54,6 +54,7 @@ enum ssfc_sensor { SSFC_SENSOR_DEFAULT, SSFC_SENSOR_BMI160, SSFC_SENSOR_ICM426XX, + SSFC_SENSOR_BMI260, }; #define SSFC_SENSOR_OFFSET 12 #define SSFC_SENSOR_MASK GENMASK(14, 12) diff --git a/board/garg/board.c b/board/garg/board.c index 2747bdac03..4dc7c1b292 100644 --- a/board/garg/board.c +++ b/board/garg/board.c @@ -15,6 +15,8 @@ #include "common.h" #include "cros_board_info.h" #include "driver/accel_kionix.h" +#include "driver/accelgyro_bmi160.h" +#include "driver/accelgyro_bmi260.h" #include "driver/accelgyro_bmi_common.h" #include "driver/accelgyro_icm426xx.h" #include "driver/accelgyro_icm_common.h" @@ -139,9 +141,17 @@ const mat33_fp_t base_icm_ref = { { 0, 0, FLOAT_TO_FP(1)} }; +static const mat33_fp_t base_bmi260_ref = { + { 0, FLOAT_TO_FP(-1), 0}, + { FLOAT_TO_FP(1), 0, 0}, + { 0, 0, FLOAT_TO_FP(1)} +}; + + /* sensor private data */ static struct kionix_accel_data g_kx022_data; static struct bmi_drv_data_t g_bmi160_data; +static struct bmi_drv_data_t g_bmi260_data; static struct icm_drv_data_t g_icm426xx_data; /* Drivers */ @@ -266,6 +276,53 @@ struct motion_sensor_t icm426xx_base_gyro = { .max_frequency = ICM426XX_GYRO_MAX_FREQ, }; +struct motion_sensor_t bmi260_base_accel = { + .name = "Base Accel", + .active_mask = SENSOR_ACTIVE_S0_S3, + .chip = MOTIONSENSE_CHIP_BMI260, + .type = MOTIONSENSE_TYPE_ACCEL, + .location = MOTIONSENSE_LOC_BASE, + .drv = &bmi260_drv, + .mutex = &g_base_mutex, + .drv_data = &g_bmi260_data, + .port = I2C_PORT_ACCEL, + .addr = BMI260_ADDR0_FLAGS, + .rot_standard_ref = &base_bmi260_ref, + .min_frequency = BMI_ACCEL_MIN_FREQ, + .max_frequency = BMI_ACCEL_MAX_FREQ, + .default_range = 4, /* g */ + .config = { + /* EC use accel for angle detection */ + [SENSOR_CONFIG_EC_S0] = { + .odr = 10000 | ROUND_UP_FLAG, + .ec_rate = 100 * MSEC, + }, + /* Sensor on in S3 */ + [SENSOR_CONFIG_EC_S3] = { + .odr = 10000 | ROUND_UP_FLAG, + .ec_rate = 100 * MSEC, + }, + }, +}; + +struct motion_sensor_t bmi260_base_gyro = { + .name = "Base Gyro", + .active_mask = SENSOR_ACTIVE_S0_S3, + .chip = MOTIONSENSE_CHIP_BMI260, + .type = MOTIONSENSE_TYPE_GYRO, + .location = MOTIONSENSE_LOC_BASE, + .drv = &bmi260_drv, + .mutex = &g_base_mutex, + .drv_data = &g_bmi260_data, + .port = I2C_PORT_ACCEL, + .addr = BMI260_ADDR0_FLAGS, + .default_range = 1000, /* dps */ + .rot_standard_ref = &base_bmi260_ref, + .min_frequency = BMI_GYRO_MIN_FREQ, + .max_frequency = BMI_GYRO_MAX_FREQ, +}; + + static int board_is_convertible(void) { /* @@ -282,6 +339,10 @@ static void board_update_sensor_config_from_sku(void) motion_sensors[BASE_ACCEL] = icm426xx_base_accel; motion_sensors[BASE_GYRO] = icm426xx_base_gyro; ccprints("BASE GYRO is ICM426XX"); + } else if (get_cbi_ssfc_sensor() == SSFC_SENSOR_BMI260) { + motion_sensors[BASE_ACCEL] = bmi260_base_accel; + motion_sensors[BASE_GYRO] = bmi260_base_gyro; + ccprints("BASE GYRO is BMI260"); } else ccprints("BASE GYRO is BMI160"); motion_sensor_count = ARRAY_SIZE(motion_sensors); @@ -302,6 +363,9 @@ void sensor_interrupt(enum gpio_signal signal) case MOTIONSENSE_CHIP_ICM426XX: icm426xx_interrupt(signal); break; + case MOTIONSENSE_CHIP_BMI260: + bmi260_interrupt(signal); + break; case MOTIONSENSE_CHIP_BMI160: default: bmi160_interrupt(signal); diff --git a/board/garg/board.h b/board/garg/board.h index 0053a537f1..f588be561b 100644 --- a/board/garg/board.h +++ b/board/garg/board.h @@ -27,6 +27,7 @@ /* Sensors */ #define CONFIG_ACCEL_KX022 /* Lid accel */ #define CONFIG_ACCELGYRO_BMI160 /* Base accel */ +#define CONFIG_ACCELGYRO_BMI260 /* 2nd Base accel */ #define CONFIG_ACCELGYRO_ICM426XX /* 2nd Base accel */ #define CONFIG_SYNC /* Camera VSYNC */ @@ -37,6 +38,8 @@ /* Motion Sense Task Events */ #define CONFIG_ACCELGYRO_BMI160_INT_EVENT \ TASK_EVENT_MOTION_SENSOR_INTERRUPT(BASE_ACCEL) +#define CONFIG_ACCELGYRO_BMI260_INT_EVENT \ + TASK_EVENT_MOTION_SENSOR_INTERRUPT(BASE_ACCEL) #define CONFIG_ACCELGYRO_ICM426XX_INT_EVENT \ TASK_EVENT_MOTION_SENSOR_INTERRUPT(BASE_ACCEL) -- cgit v1.2.1