summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2020-04-22 18:20:57 +0800
committerCommit Bot <commit-bot@chromium.org>2020-05-29 05:11:22 +0000
commitfad8f404df3e1b2278326c08247a62edce434f32 (patch)
tree2af7b231777c6bf271abbd17770503e0d3ab2f9c
parent7808773254b3c4b910eef167319b49e6acec738a (diff)
downloadchrome-ec-fad8f404df3e1b2278326c08247a62edce434f32.tar.gz
asurada: enable bmi160/bmm150
Enable bmi160/bmi150 accel/gyro/mag sensor on base. BUG=b:150341271 TEST=1) `accelrate 1 25000` to start gyro 2) Verify `accelread 0` (accel), `accelread 1` (gyro) outputs some reasonable number. BRANCH=none Change-Id: I8475ea18f0df507cd8e437d2a055217fddcad0b7 Signed-off-by: Ting Shen <phoenixshen@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2160335 Reviewed-by: Eric Yilun Lin <yllin@chromium.org> Commit-Queue: Ting Shen <phoenixshen@chromium.org> Tested-by: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--board/asurada/board.c93
-rw-r--r--board/asurada/board.h23
-rw-r--r--board/asurada/ec.tasklist4
3 files changed, 117 insertions, 3 deletions
diff --git a/board/asurada/board.c b/board/asurada/board.c
index b7b407f9d0..512e3e2612 100644
--- a/board/asurada/board.c
+++ b/board/asurada/board.c
@@ -12,6 +12,7 @@
#include "chipset.h"
#include "common.h"
#include "console.h"
+#include "driver/accelgyro_bmi_common.h"
#include "driver/charger/isl923x.h"
#include "driver/ppc/syv682x.h"
#include "driver/tcpm/it83xx_pd.h"
@@ -21,12 +22,14 @@
#include "i2c.h"
#include "keyboard_scan.h"
#include "lid_switch.h"
+#include "motion_sense.h"
#include "power.h"
#include "power_button.h"
#include "pwm.h"
#include "pwm_chip.h"
#include "switch.h"
#include "tablet_mode.h"
+#include "task.h"
#include "timer.h"
#include "uart.h"
#include "usb_mux.h"
@@ -367,3 +370,93 @@ __override uint8_t board_get_usb_pd_port_count(void)
return CONFIG_USB_PD_PORT_MAX_COUNT - 1;
}
+/* Sensor */
+
+static struct mutex g_base_mutex;
+
+static struct bmi_drv_data_t g_bmi160_data;
+
+/* Matrix to rotate accelerometer into standard reference frame */
+/* TODO: update the matrix after we have assembled unit */
+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)},
+};
+
+/* Matrix to rotate accelrator into standard reference frame */
+/* TODO: update the matrix after we have assembled unit */
+static const mat33_fp_t mag_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[] = {
+ /*
+ * 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 = "Base 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 = I2C_PORT_ACCEL,
+ .i2c_spi_addr_flags = BMI160_ADDR0_FLAGS,
+ .rot_standard_ref = &base_standard_ref,
+ .default_range = 4, /* g, to meet CDD 7.3.1/C-1-4 reqs */
+ .min_frequency = BMI_ACCEL_MIN_FREQ,
+ .max_frequency = BMI_ACCEL_MAX_FREQ,
+ .config = {
+ /* Sensor on 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 = I2C_PORT_ACCEL,
+ .i2c_spi_addr_flags = BMI160_ADDR0_FLAGS,
+ .default_range = 1000, /* dps */
+ .rot_standard_ref = &base_standard_ref,
+ .min_frequency = BMI_GYRO_MIN_FREQ,
+ .max_frequency = BMI_GYRO_MAX_FREQ,
+ },
+ [BASE_MAG] = {
+ .name = "Lid Mag",
+ .active_mask = SENSOR_ACTIVE_S0_S3,
+ .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_ACCEL,
+ .i2c_spi_addr_flags = BMI160_ADDR0_FLAGS,
+ .default_range = BIT(11), /* 16LSB / uT, fixed */
+ .rot_standard_ref = &mag_standard_ref,
+ .min_frequency = BMM150_MAG_MIN_FREQ,
+ .max_frequency = BMM150_MAG_MAX_FREQ(SPECIAL),
+ },
+};
+const unsigned int motion_sensor_count = ARRAY_SIZE(motion_sensors);
diff --git a/board/asurada/board.h b/board/asurada/board.h
index deb7ec17c6..e472b3d979 100644
--- a/board/asurada/board.h
+++ b/board/asurada/board.h
@@ -54,6 +54,7 @@
#define CONFIG_I2C_MASTER
#define I2C_PORT_CHARGER IT83XX_I2C_CH_A
#define I2C_PORT_BATTERY IT83XX_I2C_CH_A
+#define I2C_PORT_ACCEL IT83XX_I2C_CH_B
#define I2C_PORT_PPC0 IT83XX_I2C_CH_C
#define I2C_PORT_PPC1 IT83XX_I2C_CH_E
@@ -104,6 +105,21 @@
#define CONFIG_TABLET_MODE
#define GMR_TABLET_MODE_GPIO_L GPIO_TABLET_MODE_L
+#define CONFIG_ACCEL_FIFO
+#define CONFIG_ACCEL_FIFO_SIZE 256
+#define CONFIG_ACCEL_FIFO_THRES (CONFIG_ACCEL_FIFO_SIZE / 3)
+#define CONFIG_ACCEL_INTERRUPTS
+#define CONFIG_ACCELGYRO_BMI160 /* Base accel */
+#define CONFIG_ACCELGYRO_BMI160_INT_EVENT \
+ TASK_EVENT_MOTION_SENSOR_INTERRUPT(BASE_ACCEL)
+#define CONFIG_ACCELGYRO_SEC_ADDR_FLAGS BMM150_ADDR0_FLAGS
+
+#define CONFIG_CMD_ACCEL_INFO
+#define CONFIG_CMD_ACCELS
+
+#define CONFIG_MAG_BMI_BMM150
+#define CONFIG_MAG_CALIBRATE
+
/* UART */
#undef CONFIG_UART_TX_BUF_SIZE
#define CONFIG_UART_TX_BUF_SIZE 4096
@@ -159,6 +175,13 @@ enum board_sub_board {
SUB_BOARD_COUNT,
};
+enum sensor_id {
+ BASE_ACCEL = 0,
+ BASE_GYRO,
+ BASE_MAG,
+ SENSOR_COUNT,
+};
+
void board_reset_pd_mcu(void);
int board_get_version(void);
diff --git a/board/asurada/ec.tasklist b/board/asurada/ec.tasklist
index d46081d494..f670dc958d 100644
--- a/board/asurada/ec.tasklist
+++ b/board/asurada/ec.tasklist
@@ -6,13 +6,11 @@
/**
* See CONFIG_TASK_LIST in config.h for details.
*/
-/**
- TODO: missing MOTIONSENSE task
- */
#define CONFIG_TASK_LIST \
TASK_ALWAYS(HOOKS, hook_task, NULL, VENTI_TASK_STACK_SIZE) \
TASK_NOTEST(CHIPSET, chipset_task, NULL, VENTI_TASK_STACK_SIZE) \
TASK_ALWAYS(CHARGER, charger_task, NULL, VENTI_TASK_STACK_SIZE) \
+ TASK_ALWAYS(MOTIONSENSE, motion_sense_task, NULL, VENTI_TASK_STACK_SIZE) \
TASK_NOTEST(PDCMD, pd_command_task, NULL, 1024) \
TASK_ALWAYS(HOSTCMD, host_command_task, NULL, 1024) \
TASK_ALWAYS(CONSOLE, console_task, NULL, LARGER_TASK_STACK_SIZE) \