From eb511fa00b6da4a8b1a1601978da7dd5f578b560 Mon Sep 17 00:00:00 2001 From: Devin Lu Date: Tue, 11 Aug 2020 15:41:37 +0800 Subject: burnet: add IMU sensors * BMI160 Base ACC+Gyro * BMA253 in the LID BUG=none BRANCH=firmware-kukui-12573.B TEST=ectool motionsense to make sure sensors work. Signed-off-by: Devin Lu Change-Id: Iab6dcee5b4226750c649b6a61126ec188ff3a960 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2348733 Reviewed-by: Ting Shen --- board/burnet/board.c | 143 +++++++++++++++++++++++++++++++++++++++++++++++--- board/burnet/board.h | 34 ++++++------ board/burnet/gpio.inc | 19 +++++-- 3 files changed, 166 insertions(+), 30 deletions(-) diff --git a/board/burnet/board.c b/board/burnet/board.c index 7a8b2989ae..e2588c0cd4 100644 --- a/board/burnet/board.c +++ b/board/burnet/board.c @@ -14,6 +14,7 @@ #include "chipset.h" #include "common.h" #include "console.h" +#include "driver/accel_bma2x2.h" #include "driver/accelgyro_bmi_common.h" #include "driver/battery/max17055.h" #include "driver/bc12/pi3usb9201.h" @@ -114,8 +115,8 @@ struct ioexpander_config_t ioex_config[CONFIG_IO_EXPANDER_PORT_COUNT] = { /******************************************************************************/ /* SPI devices */ -/* TODO: to be added once sensors land via CL:1714436 */ const struct spi_device_t spi_devices[] = { + { CONFIG_SPI_ACCEL_PORT, 2, GPIO_EC_SENSOR_SPI_NSS }, }; const unsigned int spi_devices_used = ARRAY_SIZE(spi_devices); @@ -240,6 +241,41 @@ void bc12_interrupt(enum gpio_signal signal) task_set_event(TASK_ID_USB_CHG_P0, USB_CHG_EVENT_BC12, 0); } +#ifndef VARIANT_KUKUI_NO_SENSORS +static void board_spi_enable(void) +{ + cputs(CC_ACCEL, "board_spi_enable"); + gpio_config_module(MODULE_SPI_MASTER, 1); + + /* Enable clocks to SPI2 module */ + STM32_RCC_APB1ENR |= STM32_RCC_PB1_SPI2; + + /* Reset SPI2 */ + STM32_RCC_APB1RSTR |= STM32_RCC_PB1_SPI2; + STM32_RCC_APB1RSTR &= ~STM32_RCC_PB1_SPI2; + + spi_enable(CONFIG_SPI_ACCEL_PORT, 1); +} +DECLARE_HOOK(HOOK_CHIPSET_STARTUP, + board_spi_enable, + MOTION_SENSE_HOOK_PRIO - 1); + +static void board_spi_disable(void) +{ + spi_enable(CONFIG_SPI_ACCEL_PORT, 0); + + /* Disable clocks to SPI2 module */ + STM32_RCC_APB1ENR &= ~STM32_RCC_PB1_SPI2; + + gpio_config_module(MODULE_SPI_MASTER, 0); + gpio_set_flags(GPIO_EC_SENSOR_SPI_CK, GPIO_OUT_LOW); + gpio_set_level(GPIO_EC_SENSOR_SPI_CK, 0); +} +DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, + board_spi_disable, + MOTION_SENSE_HOOK_PRIO + 1); +#endif /* !VARIANT_KUKUI_NO_SENSORS */ + static void board_init(void) { /* If the reset cause is external, pulse PMIC force reset. */ @@ -252,10 +288,13 @@ static void board_init(void) /* Enable TCPC alert interrupts */ gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); -#ifdef SECTION_IS_RW +#ifndef VARIANT_KUKUI_NO_SENSORS /* Enable interrupts from BMI160 sensor. */ gpio_enable_interrupt(GPIO_ACCEL_INT_ODL); -#endif /* SECTION_IS_RW */ + + /* For some reason we have to do this again in case of sysjump */ + board_spi_enable(); +#endif /* !VARIANT_KUKUI_NO_SENSORS */ /* Enable interrupt from PMIC. */ gpio_enable_interrupt(GPIO_PMIC_EC_RESETB); @@ -265,15 +304,107 @@ static void board_init(void) } DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); +#ifndef VARIANT_KUKUI_NO_SENSORS /* Motion sensors */ /* Mutexes */ -#ifdef SECTION_IS_RW -/* TODO: to be added once sensors land via CL:1714436 */ +static struct mutex g_lid_mutex; +static struct mutex g_base_mutex; + +/* Rotation matrixes */ +static const mat33_fp_t lid_standard_ref = { + {FLOAT_TO_FP(1), 0, 0}, + {0, FLOAT_TO_FP(-1), 0}, + {0, 0, FLOAT_TO_FP(-1)} +}; + +static const mat33_fp_t base_standard_ref = { + {FLOAT_TO_FP(-1), 0, 0}, + {0, FLOAT_TO_FP(1), 0}, + {0, 0, FLOAT_TO_FP(-1)} +}; + +/* sensor private data */ +static struct accelgyro_saved_data_t g_bma253_data; +static struct bmi_drv_data_t g_bmi160_data; + struct motion_sensor_t motion_sensors[] = { + [LID_ACCEL] = { + .name = "Lid Accel", + .active_mask = SENSOR_ACTIVE_S0_S3, + .chip = MOTIONSENSE_CHIP_BMA255, + .type = MOTIONSENSE_TYPE_ACCEL, + .location = MOTIONSENSE_LOC_LID, + .drv = &bma2x2_accel_drv, + .mutex = &g_lid_mutex, + .drv_data = &g_bma253_data, + .port = I2C_PORT_SENSORS, + .i2c_spi_addr_flags = BMA2x2_I2C_ADDR1_FLAGS, + .rot_standard_ref = &lid_standard_ref, + .default_range = 2, + .min_frequency = BMA255_ACCEL_MIN_FREQ, + .max_frequency = BMA255_ACCEL_MAX_FREQ, + .config = { + [SENSOR_CONFIG_EC_S0] = { + .odr = 10000 | ROUND_UP_FLAG, + }, + [SENSOR_CONFIG_EC_S3] = { + .odr = 10000 | ROUND_UP_FLAG, + }, + }, + }, + /* + * Note: bmi160: supports accelerometer and gyro sensor + * Requirement: accelerometer sensor must init before gyro sensor + * DO NOT change the order of the following table. + */ + [BASE_ACCEL] = { + .name = "Accel", + .active_mask = SENSOR_ACTIVE_S0_S3, + .chip = MOTIONSENSE_CHIP_BMI160, + .type = MOTIONSENSE_TYPE_ACCEL, + .location = MOTIONSENSE_LOC_BASE, + .drv = &bmi160_drv, + .mutex = &g_base_mutex, + .drv_data = &g_bmi160_data, + .port = CONFIG_SPI_ACCEL_PORT, + .i2c_spi_addr_flags = SLAVE_MK_SPI_ADDR_FLAGS(CONFIG_SPI_ACCEL_PORT), + .rot_standard_ref = &base_standard_ref, + .default_range = 2, /* g, to meet CDD 7.3.1/C-1-4 reqs */ + .min_frequency = BMI_ACCEL_MIN_FREQ, + .max_frequency = BMI_ACCEL_MAX_FREQ, + .config = { + /* EC use accel for angle detection */ + [SENSOR_CONFIG_EC_S0] = { + .odr = 10000 | ROUND_UP_FLAG, + .ec_rate = 100 * MSEC, + }, + /* Sensor on for angle detection */ + [SENSOR_CONFIG_EC_S3] = { + .odr = 10000 | ROUND_UP_FLAG, + .ec_rate = 100 * MSEC, + }, + }, + }, + [BASE_GYRO] = { + .name = "Gyro", + .active_mask = SENSOR_ACTIVE_S0_S3, + .chip = MOTIONSENSE_CHIP_BMI160, + .type = MOTIONSENSE_TYPE_GYRO, + .location = MOTIONSENSE_LOC_BASE, + .drv = &bmi160_drv, + .mutex = &g_base_mutex, + .drv_data = &g_bmi160_data, + .port = CONFIG_SPI_ACCEL_PORT, + .i2c_spi_addr_flags = SLAVE_MK_SPI_ADDR_FLAGS(CONFIG_SPI_ACCEL_PORT), + .default_range = 1000, /* dps */ + .rot_standard_ref = &base_standard_ref, + .min_frequency = BMI_GYRO_MIN_FREQ, + .max_frequency = BMI_GYRO_MAX_FREQ, + }, }; const unsigned int motion_sensor_count = ARRAY_SIZE(motion_sensors); -#endif /* SECTION_IS_RW */ +#endif /* !VARIANT_KUKUI_NO_SENSORS */ /* Called on AP S5 -> S3 transition */ static void board_chipset_startup(void) diff --git a/board/burnet/board.h b/board/burnet/board.h index 36530f3d69..05f66e19fb 100644 --- a/board/burnet/board.h +++ b/board/burnet/board.h @@ -3,7 +3,7 @@ * found in the LICENSE file. */ -/* Configuration for Kukui */ +/* Configuration for Burnet */ #ifndef __CROS_EC_BOARD_H #define __CROS_EC_BOARD_H @@ -45,24 +45,22 @@ #define CONFIG_USB_MUX_IT5205 /* Motion Sensors */ -#ifdef SECTION_IS_RW -#define CONFIG_MAG_BMI_BMM150 -#define CONFIG_ACCELGYRO_SEC_ADDR_FLAGS BMM150_ADDR0_FLAGS -#define CONFIG_MAG_CALIBRATE -#define CONFIG_ACCELGYRO_BMI160 +#ifndef VARIANT_KUKUI_NO_SENSORS +#define CONFIG_ACCEL_BMA255 /* Lid accel */ +#define CONFIG_ACCELGYRO_BMI160 /* Base accel */ #define CONFIG_ACCEL_INTERRUPTS #define CONFIG_ACCELGYRO_BMI160_INT_EVENT \ - TASK_EVENT_MOTION_SENSOR_INTERRUPT(LID_ACCEL) + TASK_EVENT_MOTION_SENSOR_INTERRUPT(BASE_ACCEL) #define CONFIG_ALS +#define CONFIG_CMD_ACCEL_INFO -#define ALS_COUNT 1 -#define CONFIG_ALS_TCS3400 -#define CONFIG_ALS_TCS3400_INT_EVENT \ - TASK_EVENT_MOTION_SENSOR_INTERRUPT(CLEAR_ALS) -#define CONFIG_ALS_TCS3400_EMULATED_IRQ_EVENT -#define CONFIG_ACCEL_FORCE_MODE_MASK BIT(CLEAR_ALS) +#define CONFIG_LID_ANGLE +#define CONFIG_LID_ANGLE_SENSOR_BASE BASE_ACCEL +#define CONFIG_LID_ANGLE_SENSOR_LID LID_ACCEL -#endif /* SECTION_IS_RW */ +#define CONFIG_ACCEL_FORCE_MODE_MASK BIT(LID_ACCEL) + +#endif /* VARIANT_KUKUI_NO_SENSORS */ /* I2C ports */ #define I2C_PORT_BC12 0 @@ -70,6 +68,7 @@ #define I2C_PORT_USB_MUX 0 #define I2C_PORT_BATTERY 2 #define I2C_PORT_CHARGER 1 +#define I2C_PORT_SENSORS 1 #define I2C_PORT_IO_EXPANDER_IT8801 1 #define I2C_PORT_VIRTUAL_BATTERY I2C_PORT_BATTERY @@ -106,11 +105,8 @@ enum power_signal { /* Motion sensors */ enum sensor_id { LID_ACCEL = 0, - LID_GYRO, - LID_MAG, - CLEAR_ALS, - RGB_ALS, - VSYNC, + BASE_ACCEL, + BASE_GYRO, SENSOR_COUNT, }; diff --git a/board/burnet/gpio.inc b/board/burnet/gpio.inc index 2fe86f356b..7fa9f4e1c6 100644 --- a/board/burnet/gpio.inc +++ b/board/burnet/gpio.inc @@ -74,8 +74,8 @@ GPIO(EC_BL_EN_OD, PIN(A, 13), GPIO_ODR_HIGH) GPIO(EN_USBA_5V, PIN(C, 14), GPIO_OUT_LOW) GPIO(EC_SENSOR_SPI_MISO, PIN(C, 2), GPIO_INPUT) GPIO(EC_SENSOR_SPI_MOSI, PIN(C, 3), GPIO_OUT_LOW) -GPIO(EC_SENSOR_SPI_NSS, PIN(B, 12), GPIO_OUT_LOW) -GPIO(EC_SENSOR_SPI_CK, PIN(B, 10), GPIO_OUT_HIGH) +GPIO(EC_SENSOR_SPI_NSS, PIN(B, 12), GPIO_OUT_HIGH) +GPIO(EC_SENSOR_SPI_CK, PIN(B, 10), GPIO_OUT_LOW) GPIO(ENTERING_RW, PIN(C, 6), GPIO_ODR_HIGH) /* EC_ENTERING_RW_ODL */ GPIO(EC_INT_L, PIN(C, 7), GPIO_ODR_HIGH) /* EC_AP_INT_ODL */ GPIO(EC_BOARD_ID_EN_L, PIN(C, 15), GPIO_ODR_HIGH) /* EC_BOARD_ID_EN_ODL */ @@ -101,11 +101,20 @@ ALTERNATE(PIN_MASK(A, 0x0600), 1, MODULE_UART, 0) ALTERNATE(PIN_MASK(B, 0x0300), 1, MODULE_I2C, GPIO_ODR_HIGH ) /* I2C MASTER: PA11/12 */ ALTERNATE(PIN_MASK(A, 0x1800), 5, MODULE_I2C, GPIO_ODR_HIGH ) + + +/* SPI1 */ /* SPI SLAVE: PB3/4/5 */ ALTERNATE(PIN_MASK(B, 0x0038), 0, MODULE_SPI, 0) /* SPI SLAVE CS: PA15 */ ALTERNATE(PIN_MASK(A, 0x8000), 0, MODULE_SPI, 0) -#ifdef SECTION_IS_RO -/* SPI SLAVE: PB13/14/15 */ + +/* SPI2 */ +#ifdef VARIANT_KUKUI_NO_SENSORS +/* EMMC SPI SLAVE: PB13/14/15 */ ALTERNATE(PIN_MASK(B, 0xE000), 0, MODULE_SPI_FLASH, 0) -#endif +#else +/* SENSORS SPI MASTER: PB10, PB12, PC2, PC3 */ +ALTERNATE(PIN_MASK(B, 0x0400), 5, MODULE_SPI_MASTER, 0) +ALTERNATE(PIN_MASK(C, 0x000C), 1, MODULE_SPI_MASTER, 0) +#endif /* VARIANT_KUKUI_NO_SENSORS */ -- cgit v1.2.1