diff options
author | Scott <scollyer@chromium.org> | 2016-10-21 10:50:54 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-10-31 11:49:35 -0700 |
commit | 3c39ccabdae49928a97dbb56e02e2a800bfd5d72 (patch) | |
tree | 955f8fe8fc9b91304acfed2aa0b172130ef92227 | |
parent | e852d78bc28bb26e6b7ba27cb59ecf8a1ce3f076 (diff) | |
download | chrome-ec-3c39ccabdae49928a97dbb56e02e2a800bfd5d72.tar.gz |
eve: Enable BMI160 and BMM150 gyro/compass sensors
Added necessary CONFIG options and board specific info to enable the
following sensors:
1. KXCJ9 Lid motion sensor
2. BMI160 motion sensor
3. BMI160 gyro sensor
4. BMM150 magnetometer sensor
BRANCH=none
BUG=chrome-os-partner:58894
TEST=manual
accelrate 2 10000 -> enable gyro
accelrate 3 10000 -> enable magnetometer
accelinfo on 1000 -> display sensor outputs once per second
See outputs like the following:
Base Accel=3022 , 1685 , -15925
Base Gyro=188 , -1404, -300
Base Mag=-253 , 218 , 1004
Moved eve board around and saw the readings change accordingly.
Have not tested lid motion sensor at this stage.
Change-Id: Ia658de4cbf441759482a053358230793550ef5ab
Signed-off-by: Scott <scollyer@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/404987
Commit-Ready: Scott Collyer <scollyer@chromium.org>
Tested-by: Scott Collyer <scollyer@chromium.org>
Reviewed-by: Gwendal Grignou <gwendal@google.com>
-rw-r--r-- | board/eve/board.c | 196 | ||||
-rw-r--r-- | board/eve/board.h | 37 | ||||
-rw-r--r-- | board/eve/ec.tasklist | 1 |
3 files changed, 228 insertions, 6 deletions
diff --git a/board/eve/board.c b/board/eve/board.c index 91ea7af370..d3edc9c072 100644 --- a/board/eve/board.c +++ b/board/eve/board.c @@ -16,6 +16,9 @@ #include "charger.h" #include "chipset.h" #include "console.h" +#include "driver/accel_kionix.h" +#include "driver/accel_kxcj9.h" +#include "driver/accelgyro_bmi160.h" #include "driver/als_isl29035.h" #include "driver/charger/bd9995x.h" #include "driver/tcpm/anx74xx.h" @@ -30,6 +33,8 @@ #include "keyboard_scan.h" #include "lid_switch.h" #include "math_util.h" +#include "motion_lid.h" +#include "motion_sense.h" #include "power.h" #include "power_button.h" #include "pwm.h" @@ -107,11 +112,11 @@ const int hibernate_wake_pins_used = ARRAY_SIZE(hibernate_wake_pins); /* I2C port map */ const struct i2c_port_t i2c_ports[] = { - {"tcpc0", I2C_PORT_TCPC0, 400, GPIO_I2C0_0_SCL, GPIO_I2C0_0_SDA}, - {"tcpc1", I2C_PORT_TCPC1, 400, GPIO_I2C0_1_SCL, GPIO_I2C0_1_SDA}, - {"accelgyro", I2C_PORT_GYRO, 400, GPIO_I2C1_SCL, GPIO_I2C1_SDA}, - {"sensors", I2C_PORT_ACCEL, 400, GPIO_I2C2_SCL, GPIO_I2C2_SDA}, - {"batt", I2C_PORT_BATTERY, 100, GPIO_I2C3_SCL, GPIO_I2C3_SDA}, + {"tcpc0", I2C_PORT_TCPC0, 400, GPIO_I2C0_0_SCL, GPIO_I2C0_0_SDA}, + {"tcpc1", I2C_PORT_TCPC1, 400, GPIO_I2C0_1_SCL, GPIO_I2C0_1_SDA}, + {"accelgyro", I2C_PORT_GYRO, 400, GPIO_I2C1_SCL, GPIO_I2C1_SDA}, + {"sensors", I2C_PORT_LID_ACCEL, 400, GPIO_I2C2_SCL, GPIO_I2C2_SDA}, + {"batt", I2C_PORT_BATTERY, 100, GPIO_I2C3_SCL, GPIO_I2C3_SDA}, }; const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); @@ -566,3 +571,184 @@ void board_hibernate(void) /* Enable both the VBUS & VCC ports before entering PG3 */ bd9995x_select_input_port(BD9995X_CHARGE_PORT_BOTH, 1); } + +/* Base Sensor mutex */ +static struct mutex g_base_mutex; + +/* Lid Sensor mutex */ +static struct mutex g_lid_mutex; + +/* kxcj9 local/private data */ +struct kionix_accel_data g_kxcj9_data; + +/* Matrix to rotate accelrator into standard reference frame */ +const matrix_3x3_t base_standard_ref = { + { 0, FLOAT_TO_FP(-1), 0}, + { FLOAT_TO_FP(1), 0, 0}, + { 0, 0, FLOAT_TO_FP(1)} +}; + +const matrix_3x3_t mag_standard_ref = { + { FLOAT_TO_FP(-1), 0, 0}, + { 0, FLOAT_TO_FP(1), 0}, + { 0, 0, FLOAT_TO_FP(-1)} +}; + +const matrix_3x3_t lid_standard_ref = { + { 0, FLOAT_TO_FP(1), 0}, + {FLOAT_TO_FP(-1), 0, 0}, + { 0, 0, FLOAT_TO_FP(-1)} +}; + +struct motion_sensor_t motion_sensors[] = { + + [LID_ACCEL] = { + .name = "Lid Accel", + .active_mask = SENSOR_ACTIVE_S0, + .chip = MOTIONSENSE_CHIP_KXCJ9, + .type = MOTIONSENSE_TYPE_ACCEL, + .location = MOTIONSENSE_LOC_LID, + .drv = &kionix_accel_drv, + .mutex = &g_lid_mutex, + .drv_data = &g_kxcj9_data, + .port = I2C_PORT_LID_ACCEL, + .addr = KXCJ9_ADDR0, + .rot_standard_ref = &lid_standard_ref, + .default_range = 2, /* g, enough for laptop. */ + .config = { + /* AP: by default use EC settings */ + [SENSOR_CONFIG_AP] = { + .odr = 0, + .ec_rate = 0, + }, + /* EC use accel for angle detection */ + [SENSOR_CONFIG_EC_S0] = { + .odr = 10000 | ROUND_UP_FLAG, + .ec_rate = 100 * MSEC, + }, + /* unused */ + [SENSOR_CONFIG_EC_S3] = { + .odr = 0, + .ec_rate = 0, + }, + [SENSOR_CONFIG_EC_S5] = { + .odr = 0, + .ec_rate = 0, + }, + }, + }, + + [BASE_ACCEL] = { + .name = "Base Accel", + .active_mask = SENSOR_ACTIVE_S0, + .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 = I2C_PORT_GYRO, + .addr = BMI160_ADDR0, + .rot_standard_ref = &base_standard_ref, + .default_range = 2, /* g, enough for laptop. */ + .config = { + /* AP: by default use EC settings */ + [SENSOR_CONFIG_AP] = { + .odr = 0, + .ec_rate = 0, + }, + /* EC use accel for angle detection */ + [SENSOR_CONFIG_EC_S0] = { + .odr = 10000 | ROUND_UP_FLAG, + .ec_rate = 100 * MSEC, + }, + /* Sensor off in S3/S5 */ + [SENSOR_CONFIG_EC_S3] = { + .odr = 0, + .ec_rate = 0 + }, + /* Sensor off in S3/S5 */ + [SENSOR_CONFIG_EC_S5] = { + .odr = 0, + .ec_rate = 0 + }, + }, + }, + + [BASE_GYRO] = { + .name = "Base Gyro", + .active_mask = SENSOR_ACTIVE_S0, + .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 = I2C_PORT_GYRO, + .addr = BMI160_ADDR0, + .default_range = 1000, /* dps */ + .rot_standard_ref = &base_standard_ref, + .config = { + /* AP: by default shutdown all sensors */ + [SENSOR_CONFIG_AP] = { + .odr = 0, + .ec_rate = 0, + }, + /* EC does not need in S0 */ + [SENSOR_CONFIG_EC_S0] = { + .odr = 0, + .ec_rate = 0, + }, + /* Sensor off in S3/S5 */ + [SENSOR_CONFIG_EC_S3] = { + .odr = 0, + .ec_rate = 0, + }, + /* Sensor off in S3/S5 */ + [SENSOR_CONFIG_EC_S5] = { + .odr = 0, + .ec_rate = 0, + }, + }, + }, + + [BASE_MAG] = { + .name = "Base Mag", + .active_mask = SENSOR_ACTIVE_S0, + .chip = MOTIONSENSE_CHIP_BMI160, + .type = MOTIONSENSE_TYPE_MAG, + .location = MOTIONSENSE_LOC_BASE, + .drv = &bmi160_drv, + .mutex = &g_base_mutex, + .drv_data = &g_bmi160_data, + .port = I2C_PORT_GYRO, + .addr = BMI160_ADDR0, + .default_range = 1 << 11, /* 16LSB / uT, fixed */ + .rot_standard_ref = &mag_standard_ref, + .config = { + /* AP: by default shutdown all sensors */ + [SENSOR_CONFIG_AP] = { + .odr = 0, + .ec_rate = 0, + }, + /* EC does not need in S0 */ + [SENSOR_CONFIG_EC_S0] = { + .odr = 0, + .ec_rate = 0, + }, + /* Sensor off in S3/S5 */ + [SENSOR_CONFIG_EC_S3] = { + .odr = 0, + .ec_rate = 0, + }, + /* Sensor off in S3/S5 */ + [SENSOR_CONFIG_EC_S5] = { + .odr = 0, + .ec_rate = 0, + }, + }, + }, +}; +const unsigned int motion_sensor_count = ARRAY_SIZE(motion_sensors); + + diff --git a/board/eve/board.h b/board/eve/board.h index f07fe69e45..a891f7f2b6 100644 --- a/board/eve/board.h +++ b/board/eve/board.h @@ -41,6 +41,10 @@ #define WIRELESS_GPIO_WLAN GPIO_WLAN_OFF_L #define WIRELESS_GPIO_WLAN_POWER GPIO_PP3300_DX_WLAN +/* EC console commands */ +#define CONFIG_CMD_ACCELS +#define CONFIG_CMD_ACCEL_INFO + /* SOC */ #define CONFIG_CHIPSET_SKYLAKE #define CONFIG_CHIPSET_RESET_HOOK @@ -86,12 +90,29 @@ #define CONFIG_POWER_SIGNAL_INTERRUPT_STORM_DETECT_THRESHOLD 30 /* Sensor */ +#define CONFIG_ACCEL_KXCJ9 #define CONFIG_ALS #define CONFIG_ALS_ISL29035 #define CONFIG_TEMP_SENSOR #define CONFIG_TEMP_SENSOR_BD99992GW #define CONFIG_THERMISTOR_NCP15WB +#define CONFIG_ACCELGYRO_BMI160 +#define CONFIG_MAG_BMI160_BMM150 +#define BMM150_I2C_ADDRESS BMM150_ADDR0 /* 8-bit address */ +#define CONFIG_MAG_CALIBRATE + +/* FIFO size is in power of 2. */ +/* + * TODO (crosbug.com/p/59144): Uncomment this when AP is reading sensor + * data. For now, it's commented so that the data can be read from the EC + * console. + */ +/*#define CONFIG_ACCEL_FIFO 1024*/ + +/* Depends on how fast the AP boots and typical ODRs */ +#define CONFIG_ACCEL_FIFO_THRES (CONFIG_ACCEL_FIFO / 3) + /* USB */ #define CONFIG_USB_CHARGER #define CONFIG_USB_PD_ALT_MODE @@ -125,7 +146,8 @@ #define I2C_PORT_TCPC0 NPCX_I2C_PORT0_0 #define I2C_PORT_TCPC1 NPCX_I2C_PORT0_1 #define I2C_PORT_GYRO NPCX_I2C_PORT1 -#define I2C_PORT_ACCEL NPCX_I2C_PORT2 +#define I2C_PORT_ACCEL I2C_PORT_GYRO +#define I2C_PORT_LID_ACCEL NPCX_I2C_PORT2 #define I2C_PORT_ALS NPCX_I2C_PORT2 #define I2C_PORT_PMIC NPCX_I2C_PORT3 #define I2C_PORT_BATTERY NPCX_I2C_PORT3 @@ -179,6 +201,19 @@ enum als_id { ALS_COUNT }; +/* + * Motion sensors: + * When reading through IO memory is set up for sensors (LPC is used), + * the first 2 entries must be accelerometers, then gyroscope. + * For BMI160, accel, gyro and compass sensors must be next to each other. + */ +enum sensor_id { + LID_ACCEL = 0, + BASE_ACCEL, + BASE_GYRO, + BASE_MAG, +}; + enum adc_channel { ADC_CH_COUNT }; diff --git a/board/eve/ec.tasklist b/board/eve/ec.tasklist index 916b05689e..ea57855247 100644 --- a/board/eve/ec.tasklist +++ b/board/eve/ec.tasklist @@ -26,6 +26,7 @@ TASK_ALWAYS(CHG_RAMP, chg_ramp_task, NULL, TASK_STACK_SIZE) \ TASK_ALWAYS(USB_CHG, usb_charger_task, NULL, TASK_STACK_SIZE) \ TASK_ALWAYS(CHARGER, charger_task, NULL, LARGER_TASK_STACK_SIZE) \ + TASK_NOTEST(MOTIONSENSE, motion_sense_task, NULL, VENTI_TASK_STACK_SIZE) \ TASK_NOTEST(CHIPSET, chipset_task, NULL, LARGER_TASK_STACK_SIZE) \ TASK_NOTEST(KEYPROTO, keyboard_protocol_task, NULL, TASK_STACK_SIZE) \ TASK_NOTEST(PDCMD, pd_command_task, NULL, TASK_STACK_SIZE) \ |