diff options
author | Scott Chao <scott.chao@bitland.corp-partner.google.com> | 2020-03-06 13:38:40 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-11 10:19:32 +0000 |
commit | da4e343794782a124c09d669805718f91185dbd4 (patch) | |
tree | 9268534ff53fdfe875655b90f2c2a48f35e3c342 /board/damu | |
parent | 6a0ad26931135a3811eedade595a7b1a80bb1931 (diff) | |
download | chrome-ec-da4e343794782a124c09d669805718f91185dbd4.tar.gz |
damu: Enable IMU sensors
The LIS2DWLTR is used on lid and BMI160 is used on base.
BUG=b:147206199
BRANCH=
TEST=make -j BOARD=duma
TEST=make buildall
Change-Id: I010fe245bf183aaec050ef9390a74ad73b4ab716
Signed-off-by: Scott Chao <scott.chao@bitland.corp-partner.google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2091132
Reviewed-by: Ting Shen <phoenixshen@chromium.org>
Diffstat (limited to 'board/damu')
-rw-r--r-- | board/damu/board.c | 148 | ||||
-rw-r--r-- | board/damu/board.h | 33 | ||||
-rw-r--r-- | board/damu/gpio.inc | 4 |
3 files changed, 157 insertions, 28 deletions
diff --git a/board/damu/board.c b/board/damu/board.c index 92b8a43b14..6543cc561e 100644 --- a/board/damu/board.c +++ b/board/damu/board.c @@ -14,11 +14,11 @@ #include "chipset.h" #include "common.h" #include "console.h" +#include "driver/accel_lis2dw12.h" #include "driver/accelgyro_bmi160.h" #include "driver/battery/max17055.h" #include "driver/bc12/pi3usb9201.h" #include "driver/charger/isl923x.h" -#include "driver/sync.h" #include "driver/tcpm/fusb302.h" #include "driver/usb_mux/it5205.h" #include "ec_commands.h" @@ -110,8 +110,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); @@ -253,6 +253,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. */ @@ -265,10 +300,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); @@ -278,15 +316,111 @@ 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 base_standard_ref = { + {0, FLOAT_TO_FP(1), 0}, + {FLOAT_TO_FP(-1), 0, 0}, + {0, 0, FLOAT_TO_FP(1)} +}; + +static const mat33_fp_t lid_standard_ref = { + { 0, FLOAT_TO_FP(-1), 0}, + { FLOAT_TO_FP(-1), 0, 0}, + { 0, 0, FLOAT_TO_FP(-1)} +}; + +/* sensor private data */ +/* Lid accel private data */ +static struct stprivate_data g_lis2dwl_data; +/* Base accel private data */ +static struct bmi160_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_LIS2DWL, + .type = MOTIONSENSE_TYPE_ACCEL, + .location = MOTIONSENSE_LOC_LID, + .drv = &lis2dw12_drv, + .mutex = &g_lid_mutex, + .drv_data = &g_lis2dwl_data, + .port = I2C_PORT_SENSORS, + .i2c_spi_addr_flags = LIS2DWL_ADDR1_FLAGS, + .rot_standard_ref = &lid_standard_ref, + .default_range = 2, /* g */ + .min_frequency = LIS2DW12_ODR_MIN_VAL, + .max_frequency = LIS2DW12_ODR_MAX_VAL, + .config = { + /* EC use accel for angle detection */ + [SENSOR_CONFIG_EC_S0] = { + .odr = 12500 | ROUND_UP_FLAG, + }, + /* Sensor on for lid angle detection */ + [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 = BMI160_ACCEL_MIN_FREQ, + .max_frequency = BMI160_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 = BMI160_GYRO_MIN_FREQ, + .max_frequency = BMI160_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/damu/board.h b/board/damu/board.h index 5c3c6187a4..a9bb7d8b02 100644 --- a/board/damu/board.h +++ b/board/damu/board.h @@ -46,24 +46,21 @@ #define CONFIG_LED_COMMON /* Motion Sensors */ -#ifdef SECTION_IS_RW -#define CONFIG_MAG_BMI160_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_LIS2DWL /* 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) -#define CONFIG_ALS + TASK_EVENT_MOTION_SENSOR_INTERRUPT(BASE_ACCEL) +#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 @@ -71,6 +68,7 @@ #define I2C_PORT_USB_MUX 0 #define I2C_PORT_BATTERY 1 #define I2C_PORT_CHARGER board_get_charger_i2c() +#define I2C_PORT_SENSORS 1 #define I2C_PORT_IO_EXPANDER_IT8801 1 #define I2C_PORT_VIRTUAL_BATTERY I2C_PORT_BATTERY @@ -121,11 +119,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/damu/gpio.inc b/board/damu/gpio.inc index 4c555e84b7..d9b1856948 100644 --- a/board/damu/gpio.inc +++ b/board/damu/gpio.inc @@ -72,8 +72,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 */ |