From 20ccd7a68f442514df5c7d1221ea733994ed39e0 Mon Sep 17 00:00:00 2001 From: jeffrey Date: Mon, 12 Dec 2022 16:01:07 +0800 Subject: tentacruel: add lid sensor 2nd source BMA422. add BMA422 lid sensor and modify FW config conditions. BUG=b:255501962 TEST=ectool motionsense info to check sensor are initial success. confirm lid angle. BRANCH=firmware-corsola-15194.B Signed-off-by: jeffrey Change-Id: Iaf4eb89586854d5accc0643caca52875793e2152 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4087970 Reviewed-by: Eric Yilun Lin Tested-by: Ting Shen Commit-Queue: Ting Shen Code-Coverage: Zoss --- zephyr/program/corsola/tentacruel/cbi.dtsi | 74 +++++++ zephyr/program/corsola/tentacruel/project.conf | 2 + zephyr/program/corsola/tentacruel/project.overlay | 83 ++++--- zephyr/program/corsola/tentacruel/src/sensor.c | 83 +++++-- zephyr/test/krabby/CMakeLists.txt | 5 +- zephyr/test/krabby/cbi_sensor.dts | 123 +++++++++++ zephyr/test/krabby/src/fake.c | 23 ++ zephyr/test/krabby/src/fwconfig_tentacruel.c | 253 ++++++++++++++++++++++ zephyr/test/krabby/testcase.yaml | 12 +- 9 files changed, 607 insertions(+), 51 deletions(-) create mode 100644 zephyr/program/corsola/tentacruel/cbi.dtsi create mode 100644 zephyr/test/krabby/cbi_sensor.dts create mode 100644 zephyr/test/krabby/src/fake.c create mode 100644 zephyr/test/krabby/src/fwconfig_tentacruel.c diff --git a/zephyr/program/corsola/tentacruel/cbi.dtsi b/zephyr/program/corsola/tentacruel/cbi.dtsi new file mode 100644 index 0000000000..cce0fff199 --- /dev/null +++ b/zephyr/program/corsola/tentacruel/cbi.dtsi @@ -0,0 +1,74 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/ { + /* tentacruel-specific fw_config fields. */ + tentacruel-fw-config { + compatible = "cros-ec,cbi-fw-config"; + /* + * FW_CONFIG field to describe mainboard orientation in chassis. + */ + form_factor { + enum-name = "FORM_FACTOR"; + start = <7>; + size = <1>; + + clamshell { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "CLAMSHELL"; + value = <0>; + }; + convertible { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "CONVERTIBLE"; + value = <1>; + }; + }; + base-sensor { + enum-name = "BASE_SENSOR"; + start = <8>; + size = <2>; + + none { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "BASE_NONE"; + value = <0>; + default; + }; + icm42607 { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "BASE_ICM42607"; + value = <1>; + }; + bmi323 { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "BASE_BMI323"; + value = <2>; + }; + }; + lid-sensor { + enum-name = "LID_SENSOR"; + start = <10>; + size = <2>; + + none { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "LID_NONE"; + value = <0>; + default; + }; + lis2dwltr { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "LID_LIS2DWLTR"; + value = <1>; + }; + bma422 { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "LID_BMA422"; + value = <2>; + }; + }; + }; +}; diff --git a/zephyr/program/corsola/tentacruel/project.conf b/zephyr/program/corsola/tentacruel/project.conf index 594a0f477a..587e3932ba 100644 --- a/zephyr/program/corsola/tentacruel/project.conf +++ b/zephyr/program/corsola/tentacruel/project.conf @@ -14,7 +14,9 @@ CONFIG_PLATFORM_EC_KEYBOARD_PWRBTN_ASSERTS_KSI3=y # Sensor CONFIG_PLATFORM_EC_ACCELGYRO_BMI3XX=y +CONFIG_PLATFORM_EC_ACCEL_BMA4XX=y CONFIG_PLATFORM_EC_ACCELGYRO_BMI_COMM_I2C=y +CONFIG_PLATFORM_EC_DYNAMIC_MOTION_SENSOR_COUNT=y # Battery CONFIG_PLATFORM_EC_CHARGER_PROFILE_OVERRIDE=y diff --git a/zephyr/program/corsola/tentacruel/project.overlay b/zephyr/program/corsola/tentacruel/project.overlay index 80c8668388..8a3b053980 100644 --- a/zephyr/program/corsola/tentacruel/project.overlay +++ b/zephyr/program/corsola/tentacruel/project.overlay @@ -18,6 +18,7 @@ #include "../ite_motionsense.dtsi" #include "../ite_usbc.dtsi" #include "./thermistor.dtsi" +#include "./cbi.dtsi" / { aliases { @@ -27,6 +28,7 @@ * its own <>_INT_EVENT. */ bmi3xx-int = &base_accel; + bma4xx-int = &lid_accel; }; named-gpios { @@ -80,7 +82,11 @@ gpio-interrupts { int_base_imu: base_imu { - handler = "motion_interrupt"; + handler = "base_sensor_interrupt"; + }; + + int_lid_imu: lid_imu { + handler = "lid_sensor_interrupt"; }; /delete-node/ usb_c0_ppc_bc12; @@ -152,11 +158,20 @@ motionsense-mutex { base_mutex_bmi323: bmi323-mutex { }; + + lid_mutex_bma422: bma422-mutex { + }; }; /* Rotation matrix used by drivers. */ motionsense-rotation-ref { - base_rot_ref_bmi: base-rotation-ref-bmi { + lid_rot_ref_bma422: lid-rotation-ref-bma422 { + mat33 = <1 0 0 + 0 1 0 + 0 0 1>; + }; + + base_rot_ref_bmi323: base-rotation-ref-bmi323 { mat33 = <0 1 0 (-1) 0 0 0 0 1>; @@ -177,9 +192,39 @@ compatible = "cros-ec,drvdata-bmi3xx"; status = "okay"; }; + + bma422_data: bma422-drv-data { + compatible = "cros-ec,drvdata-bma4xx"; + status = "okay"; + }; }; motionsense-sensor-alt { + alt_lid_accel: alt-lid-accel { + compatible = "cros-ec,bma4xx"; + status = "okay"; + + active-mask = "SENSOR_ACTIVE_S0_S3"; + location = "MOTIONSENSE_LOC_LID"; + mutex = <&lid_mutex_bma422>; + port = <&i2c_sensor>; + rot-standard-ref = <&lid_rot_ref_bma422>; + default-range = <2>; + drv-data = <&bma422_data>; + i2c-spi-addr-flags = "BMA4_I2C_ADDR_SECONDARY"; + alternate-for = <&lid_accel>; + configs { + compatible = + "cros-ec,motionsense-sensor-config"; + ec-s0 { + odr = <(10000 | ROUND_UP_FLAG)>; + }; + ec-s3 { + odr = <(10000 | ROUND_UP_FLAG)>; + }; + }; + }; + alt_base_accel: alt-base-accel { compatible = "cros-ec,bmi3xx-accel"; status = "okay"; @@ -188,7 +233,7 @@ location = "MOTIONSENSE_LOC_BASE"; mutex = <&base_mutex_bmi323>; port = <&i2c_sensor>; - rot-standard-ref = <&base_rot_ref_bmi>; + rot-standard-ref = <&base_rot_ref_bmi323>; drv-data = <&bmi323_data>; alternate-for = <&base_accel>; configs { @@ -211,7 +256,7 @@ location = "MOTIONSENSE_LOC_BASE"; mutex = <&base_mutex_bmi323>; port = <&i2c_sensor>; - rot-standard-ref = <&base_rot_ref_bmi>; + rot-standard-ref = <&base_rot_ref_bmi323>; drv-data = <&bmi323_data>; alternate-for = <&base_gyro>; }; @@ -346,36 +391,6 @@ compatible = "dynapack,c140254", "battery-smart"; }; }; - - /* tentacruel-specific fw_config fields. */ - tentacruel-fw-config { - compatible = "cros-ec,cbi-fw-config"; - /* - * FW_CONFIG field to describe mainboard orientation in chassis. - */ - base-gyro { - enum-name = "FW_BASE_GYRO"; - start = <8>; - size = <2>; - - None { - compatible = "cros-ec,cbi-fw-config-value"; - enum-name = "FW_BASE_NONE"; - value = <0>; - }; - icm42607 { - compatible = "cros-ec,cbi-fw-config-value"; - enum-name = "FW_BASE_ICM42607"; - value = <1>; - default; - }; - bmi323 { - compatible = "cros-ec,cbi-fw-config-value"; - enum-name = "FW_BASE_BMI323"; - value = <2>; - }; - }; - }; }; diff --git a/zephyr/program/corsola/tentacruel/src/sensor.c b/zephyr/program/corsola/tentacruel/src/sensor.c index 16c2ac9fef..d0b89ac77a 100644 --- a/zephyr/program/corsola/tentacruel/src/sensor.c +++ b/zephyr/program/corsola/tentacruel/src/sensor.c @@ -5,36 +5,89 @@ #include "accelgyro.h" #include "cros_cbi.h" +#include "driver/accel_bma422.h" +#include "driver/accel_lis2dw12.h" #include "driver/accelgyro_bmi323.h" #include "driver/accelgyro_icm42607.h" +#include "gpio/gpio_int.h" #include "hooks.h" +#include "motion_sense.h" #include "motionsense_sensors.h" +#include "tablet_mode.h" -void motion_interrupt(enum gpio_signal signal) +static bool base_is_none; +static bool lid_is_none; + +void base_sensor_interrupt(enum gpio_signal signal) { uint32_t val; - cros_cbi_get_fw_config(FW_BASE_GYRO, &val); - if (val == FW_BASE_ICM42607) { + cros_cbi_get_fw_config(BASE_SENSOR, &val); + if (val == BASE_ICM42607) { icm42607_interrupt(signal); - } else if (val == FW_BASE_BMI323) { + } else if (val == BASE_BMI323) { bmi3xx_interrupt(signal); + } else if (val == BASE_NONE) { + base_is_none = true; } } -static void motionsense_init(void) +void lid_sensor_interrupt(enum gpio_signal signal) { uint32_t val; - cros_cbi_get_fw_config(FW_BASE_GYRO, &val); - if (val == FW_BASE_ICM42607) { - ccprints("BASE ACCEL is ICM42607"); - } else if (val == FW_BASE_BMI323) { - MOTIONSENSE_ENABLE_ALTERNATE(alt_base_accel); - MOTIONSENSE_ENABLE_ALTERNATE(alt_base_gyro); - ccprints("BASE ACCEL IS BMI323"); - } else { - ccprints("no motionsense"); + cros_cbi_get_fw_config(LID_SENSOR, &val); + if (val == LID_LIS2DWLTR) { + lis2dw12_interrupt(signal); + } else if (val == LID_BMA422) { + bma4xx_interrupt(signal); + } else if (val == LID_NONE) { + lid_is_none = true; + } +} + +static void disable_base_lid_irq(void) +{ + if (base_is_none && lid_is_none) { + gpio_disable_dt_interrupt( + GPIO_INT_FROM_NODELABEL(int_base_imu)); + gpio_pin_configure_dt(GPIO_DT_FROM_NODELABEL(base_imu_int_l), + GPIO_INPUT | GPIO_PULL_UP); + gpio_disable_dt_interrupt(GPIO_INT_FROM_NODELABEL(int_lid_imu)); + gpio_pin_configure_dt(GPIO_DT_FROM_NODELABEL(lid_accel_int_l), + GPIO_INPUT | GPIO_PULL_UP); + } +} +DECLARE_HOOK(HOOK_INIT, disable_base_lid_irq, HOOK_PRIO_POST_DEFAULT); + +static void board_sensor_init(void) +{ + uint32_t val; + + cros_cbi_get_fw_config(FORM_FACTOR, &val); + if (val == CLAMSHELL) { + motion_sensor_count = 0; + gmr_tablet_switch_disable(); + ccprints("Board is Clamshell"); + } else if (val == CONVERTIBLE) { + ccprints("Board is Convertible"); + + cros_cbi_get_fw_config(BASE_SENSOR, &val); + if (val == BASE_ICM42607) { + ccprints("Base sensor is ICM42607"); + } else if (val == BASE_BMI323) { + MOTIONSENSE_ENABLE_ALTERNATE(alt_base_accel); + MOTIONSENSE_ENABLE_ALTERNATE(alt_base_gyro); + ccprints("Base sensor is BMI323"); + } + + cros_cbi_get_fw_config(LID_SENSOR, &val); + if (val == LID_LIS2DWLTR) { + ccprints("Lid sensnor is LIS2DWLTR"); + } else if (val == LID_BMA422) { + MOTIONSENSE_ENABLE_ALTERNATE(alt_lid_accel); + ccprints("Lid sensnor is BMA422"); + } } } -DECLARE_HOOK(HOOK_INIT, motionsense_init, HOOK_PRIO_DEFAULT); +DECLARE_HOOK(HOOK_INIT, board_sensor_init, HOOK_PRIO_DEFAULT); diff --git a/zephyr/test/krabby/CMakeLists.txt b/zephyr/test/krabby/CMakeLists.txt index 30cc709cad..f7361974c6 100644 --- a/zephyr/test/krabby/CMakeLists.txt +++ b/zephyr/test/krabby/CMakeLists.txt @@ -24,5 +24,8 @@ target_sources_ifdef(CONFIG_TEST_KRABBY target_sources_ifdef(CONFIG_TEST_TENTACRUEL app PRIVATE + src/fake.c src/temp_tentacruel.c - ${PLATFORM_EC_PROGRAM_DIR}/corsola/tentacruel/src/temp.c) + src/fwconfig_tentacruel.c + ${PLATFORM_EC_PROGRAM_DIR}/corsola/tentacruel/src/temp.c + ${PLATFORM_EC_PROGRAM_DIR}/corsola/tentacruel/src/sensor.c) diff --git a/zephyr/test/krabby/cbi_sensor.dts b/zephyr/test/krabby/cbi_sensor.dts new file mode 100644 index 0000000000..46e6ccf9ca --- /dev/null +++ b/zephyr/test/krabby/cbi_sensor.dts @@ -0,0 +1,123 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + +/ { + aliases { + /* + * motion sense's <>_INT_EVENT is handled + * by alias. Using the alias, each driver creates + * its own <>_INT_EVENT. + */ + bmi3xx-int = &base_accel; + bma4xx-int = &lid_accel; + }; + named-i2c-ports { + compatible = "named-i2c-ports"; + + i2c_sensor: i2c-sensor { + i2c-port = <&i2c_ctrl0>; + enum-names = "I2C_PORT_SENSOR"; + }; + i2c_eeprom: i2c-eeprom { + i2c-port = <&i2c_ctrl0>; + enum-names = "I2C_PORT_EEPROM"; + }; + }; + gpio-interrupts { + int_base_imu: base_imu { + handler = "base_sensor_interrupt"; + }; + + int_lid_imu: lid_imu { + handler = "lid_sensor_interrupt"; + }; + }; + /* + * change all underlying sensor drivers to bmi260 to have a easier way + * to mock interrupt handlers. + */ + motionsense-sensor-data { + bmi323_data: bmi323-drv-data { + compatible = "cros-ec,drvdata-bmi260"; + status = "okay"; + }; + + bma422_data: bma422-drv-data { + compatible = "cros-ec,drvdata-bmi260"; + status = "okay"; + }; + }; + motionsense-sensor-alt { + alt_lid_accel: alt-lid-accel { + compatible = "cros-ec,bmi260-accel"; + status = "okay"; + + active-mask = "SENSOR_ACTIVE_S0_S3"; + location = "MOTIONSENSE_LOC_LID"; + port = <&i2c_sensor>; + drv-data = <&bma422_data>; + alternate-for = <&lid_accel>; + mutex = <&lid_mutex>; + }; + + alt_base_accel: alt-base-accel { + compatible = "cros-ec,bmi260-accel"; + status = "okay"; + + active-mask = "SENSOR_ACTIVE_S0_S3"; + location = "MOTIONSENSE_LOC_BASE"; + port = <&i2c_sensor>; + drv-data = <&bmi323_data>; + alternate-for = <&base_accel>; + mutex = <&base_mutex>; + }; + + alt_base_gyro: alt-base-gyro { + compatible = "cros-ec,bmi260-gyro"; + status = "okay"; + + active-mask = "SENSOR_ACTIVE_S0_S3"; + location = "MOTIONSENSE_LOC_BASE"; + port = <&i2c_sensor>; + drv-data = <&bmi323_data>; + alternate-for = <&base_gyro>; + mutex = <&base_mutex>; + }; + }; +}; + +&i2c_ctrl0 { + status="okay"; + + cbi_eeprom: eeprom@50 { + compatible = "atmel,at24"; + reg = <0x50>; + size = <2048>; + pagesize = <16>; + address-width = <8>; + timeout = <5>; + }; +}; + +&lid_accel { + compatible = "cros-ec,bmi260-accel"; +}; + +&base_accel { + compatible = "cros-ec,bmi260-accel"; +}; + +&base_gyro { + compatible = "cros-ec,bmi260-gyro"; +}; + +&icm42607_data { + compatible = "cros-ec,drvdata-bmi260"; +}; + +&lis2dw12_data { + compatible = "cros-ec,drvdata-bmi260"; +}; diff --git a/zephyr/test/krabby/src/fake.c b/zephyr/test/krabby/src/fake.c new file mode 100644 index 0000000000..e66ee101e7 --- /dev/null +++ b/zephyr/test/krabby/src/fake.c @@ -0,0 +1,23 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "gpio_signal.h" + +#include + +FAKE_VOID_FUNC(power_button_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(button_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(lid_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(chipset_reset_request_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(power_signal_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(chipset_watchdog_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(extpower_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(usb_a0_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(switch_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(spi_event, enum gpio_signal); +FAKE_VOID_FUNC(ppc_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(bc12_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(ccd_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(x_ec_interrupt, enum gpio_signal); diff --git a/zephyr/test/krabby/src/fwconfig_tentacruel.c b/zephyr/test/krabby/src/fwconfig_tentacruel.c new file mode 100644 index 0000000000..f1f2222ca3 --- /dev/null +++ b/zephyr/test/krabby/src/fwconfig_tentacruel.c @@ -0,0 +1,253 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "cros_board_info.h" +#include "cros_cbi.h" +#include "gpio_signal.h" +#include "hooks.h" +#include "tablet_mode.h" +#include "zephyr/kernel.h" + +#include +#include + +#define BOARD_CLAMSHELL (0 << 7) +#define BOARD_CONVERTIBLE (1 << 7) +#define MAIN_BASE_SENSOR (1 << 8) +#define ALT_BASE_SENSOR (2 << 8) +#define MAIN_LID_SENSOR (1 << 10) +#define ALT_LID_SENSOR (2 << 10) + +#define MAIN_FWCONFIG (BOARD_CONVERTIBLE | MAIN_BASE_SENSOR | MAIN_LID_SENSOR) +#define ALT_FWCONFIG (BOARD_CONVERTIBLE | ALT_BASE_SENSOR | ALT_LID_SENSOR) + +static int base_interrupt_id; +static int lid_interrupt_id; + +static void *clamshell_setup(void) +{ + uint32_t val; + const struct device *wp_gpio = + DEVICE_DT_GET(DT_GPIO_CTLR(DT_ALIAS(gpio_wp), gpios)); + const gpio_port_pins_t wp_pin = DT_GPIO_PIN(DT_ALIAS(gpio_wp), gpios); + + base_interrupt_id = 0; + lid_interrupt_id = 0; + + /* Make sure that write protect is disabled */ + zassert_ok(gpio_emul_input_set(wp_gpio, wp_pin, 1), NULL); + /* Set CBI to BOARD_CLAMSHELL */ + zassert_ok(cbi_set_fw_config(BOARD_CLAMSHELL), NULL); + /* Run init hooks to initialize cbi. */ + hook_notify(HOOK_INIT); + + /* Check if CBI write worked. */ + zassert_ok(cros_cbi_get_fw_config(FORM_FACTOR, &val), NULL); + zassert_equal(CLAMSHELL, val, "val=%d", val); + zassert_ok(cros_cbi_get_fw_config(BASE_SENSOR, &val), NULL); + zassert_equal(BASE_NONE, val, "val=%d", val); + zassert_ok(cros_cbi_get_fw_config(LID_SENSOR, &val), NULL); + zassert_equal(LID_NONE, val, "val=%d", val); + + return NULL; +} + +ZTEST_SUITE(tentacruel_clamshell, NULL, clamshell_setup, NULL, NULL, NULL); + +static void *main_sensor_setup(void) +{ + uint32_t val; + const struct device *wp_gpio = + DEVICE_DT_GET(DT_GPIO_CTLR(DT_ALIAS(gpio_wp), gpios)); + const gpio_port_pins_t wp_pin = DT_GPIO_PIN(DT_ALIAS(gpio_wp), gpios); + + base_interrupt_id = 0; + lid_interrupt_id = 0; + + /* Make sure that write protect is disabled */ + zassert_ok(gpio_emul_input_set(wp_gpio, wp_pin, 1), NULL); + /* Set CBI to main sensor config */ + zassert_ok(cbi_set_fw_config(MAIN_FWCONFIG), NULL); + /* Run init hooks to initialize cbi. */ + hook_notify(HOOK_INIT); + + /* Check if CBI write worked. */ + zassert_ok(cros_cbi_get_fw_config(FORM_FACTOR, &val), NULL); + zassert_equal(CONVERTIBLE, val, "val=%d", val); + zassert_ok(cros_cbi_get_fw_config(BASE_SENSOR, &val), NULL); + zassert_equal(BASE_ICM42607, val, "val=%d", val); + zassert_ok(cros_cbi_get_fw_config(LID_SENSOR, &val), NULL); + zassert_equal(LID_LIS2DWLTR, val, "val=%d", val); + + return NULL; +} + +ZTEST_SUITE(tentacruel_main_sensor, NULL, main_sensor_setup, NULL, NULL, NULL); + +static void *alt_sensor_setup(void) +{ + uint32_t val; + const struct device *wp_gpio = + DEVICE_DT_GET(DT_GPIO_CTLR(DT_ALIAS(gpio_wp), gpios)); + const gpio_port_pins_t wp_pin = DT_GPIO_PIN(DT_ALIAS(gpio_wp), gpios); + + base_interrupt_id = 0; + lid_interrupt_id = 0; + + /* Make sure that write protect is disabled */ + zassert_ok(gpio_emul_input_set(wp_gpio, wp_pin, 1), NULL); + /* Set CBI to alt sensor config */ + zassert_ok(cbi_set_fw_config(ALT_FWCONFIG), NULL); + /* Run init hooks to initialize cbi. */ + hook_notify(HOOK_INIT); + + /* Check if CBI write worked. */ + zassert_ok(cros_cbi_get_fw_config(FORM_FACTOR, &val), NULL); + zassert_equal(CONVERTIBLE, val, "val=%d", val); + zassert_ok(cros_cbi_get_fw_config(BASE_SENSOR, &val), NULL); + zassert_equal(BASE_BMI323, val, "val=%d", val); + zassert_ok(cros_cbi_get_fw_config(LID_SENSOR, &val), NULL); + zassert_equal(LID_BMA422, val, "val=%d", val); + + return NULL; +} + +ZTEST_SUITE(tentacruel_alt_sensor, NULL, alt_sensor_setup, NULL, NULL, NULL); + +/* Main gyro sensor. */ +void icm42607_interrupt(enum gpio_signal signal) +{ + base_interrupt_id = 1; +} + +void bmi3xx_interrupt(enum gpio_signal signal) +{ + base_interrupt_id = 2; +} + +/* Main lid sensor. */ +void lis2dw12_interrupt(enum gpio_signal signal) +{ + lid_interrupt_id = 1; +} + +void bma4xx_interrupt(enum gpio_signal signal) +{ + lid_interrupt_id = 2; +} + +ZTEST(tentacruel_clamshell, test_tabletmode_disable) +{ + const struct device *tablet_mode_gpio = + DEVICE_DT_GET(DT_GPIO_CTLR(DT_NODELABEL(tablet_mode_l), gpios)); + const gpio_port_pins_t tablet_mode_pin = + DT_GPIO_PIN(DT_NODELABEL(tablet_mode_l), gpios); + + /* Verify gmr_tablet_switch is disabled, by checking the side effects + * of calling tablet_set_mode, and setting gpio_tablet_mode_l. + */ + zassert_ok(gpio_emul_input_set(tablet_mode_gpio, tablet_mode_pin, 0), + NULL); + k_sleep(K_MSEC(100)); + tablet_set_mode(1, TABLET_TRIGGER_LID); + zassert_equal(0, tablet_get_mode(), NULL); + zassert_ok(gpio_emul_input_set(tablet_mode_gpio, tablet_mode_pin, 1), + NULL); + k_sleep(K_MSEC(100)); + tablet_set_mode(0, TABLET_TRIGGER_LID); + zassert_equal(0, tablet_get_mode(), NULL); + zassert_ok(gpio_emul_input_set(tablet_mode_gpio, tablet_mode_pin, 0), + NULL); + k_sleep(K_MSEC(100)); + tablet_set_mode(1, TABLET_TRIGGER_LID); + zassert_equal(0, tablet_get_mode(), NULL); +} + +ZTEST(tentacruel_clamshell, test_irq_disable) +{ + const struct device *base_imu_gpio = DEVICE_DT_GET( + DT_GPIO_CTLR(DT_NODELABEL(base_imu_int_l), gpios)); + const gpio_port_pins_t base_imu_pin = + DT_GPIO_PIN(DT_NODELABEL(base_imu_int_l), gpios); + + zassert_ok(gpio_emul_input_set(base_imu_gpio, base_imu_pin, 1), NULL); + k_sleep(K_MSEC(100)); + zassert_ok(gpio_emul_input_set(base_imu_gpio, base_imu_pin, 0), NULL); + k_sleep(K_MSEC(100)); + + zassert_equal(base_interrupt_id, 0, "base_interrupt_id=%d", + base_interrupt_id); + + const struct device *lid_imu_gpio = DEVICE_DT_GET( + DT_GPIO_CTLR(DT_NODELABEL(lid_accel_int_l), gpios)); + const gpio_port_pins_t lid_imu_pin = + DT_GPIO_PIN(DT_NODELABEL(lid_accel_int_l), gpios); + + zassert_ok(gpio_emul_input_set(lid_imu_gpio, lid_imu_pin, 1), NULL); + k_sleep(K_MSEC(100)); + zassert_ok(gpio_emul_input_set(lid_imu_gpio, lid_imu_pin, 0), NULL); + k_sleep(K_MSEC(100)); + + zassert_equal(lid_interrupt_id, 0, "lid_interrupt_id=%d", + lid_interrupt_id); +} + +ZTEST(tentacruel_main_sensor, test_tentacruel_main_sensor) +{ + const struct device *base_imu_gpio = DEVICE_DT_GET( + DT_GPIO_CTLR(DT_NODELABEL(base_imu_int_l), gpios)); + const gpio_port_pins_t base_imu_pin = + DT_GPIO_PIN(DT_NODELABEL(base_imu_int_l), gpios); + + zassert_ok(gpio_emul_input_set(base_imu_gpio, base_imu_pin, 1), NULL); + k_sleep(K_MSEC(100)); + zassert_ok(gpio_emul_input_set(base_imu_gpio, base_imu_pin, 0), NULL); + k_sleep(K_MSEC(100)); + + zassert_equal(base_interrupt_id, 1, "base_interrupt_id=%d", + base_interrupt_id); + + const struct device *lid_imu_gpio = DEVICE_DT_GET( + DT_GPIO_CTLR(DT_NODELABEL(lid_accel_int_l), gpios)); + const gpio_port_pins_t lid_imu_pin = + DT_GPIO_PIN(DT_NODELABEL(lid_accel_int_l), gpios); + + zassert_ok(gpio_emul_input_set(lid_imu_gpio, lid_imu_pin, 1), NULL); + k_sleep(K_MSEC(100)); + zassert_ok(gpio_emul_input_set(lid_imu_gpio, lid_imu_pin, 0), NULL); + k_sleep(K_MSEC(100)); + + zassert_equal(lid_interrupt_id, 1, "lid_interrupt_id=%d", + lid_interrupt_id); +} + +ZTEST(tentacruel_alt_sensor, test_tentacruel_alt_sensor) +{ + const struct device *base_imu_gpio = DEVICE_DT_GET( + DT_GPIO_CTLR(DT_NODELABEL(base_imu_int_l), gpios)); + const gpio_port_pins_t base_imu_pin = + DT_GPIO_PIN(DT_NODELABEL(base_imu_int_l), gpios); + + zassert_ok(gpio_emul_input_set(base_imu_gpio, base_imu_pin, 1), NULL); + k_sleep(K_MSEC(100)); + zassert_ok(gpio_emul_input_set(base_imu_gpio, base_imu_pin, 0), NULL); + k_sleep(K_MSEC(100)); + + zassert_equal(base_interrupt_id, 2, "base_interrupt_id=%d", + base_interrupt_id); + + const struct device *lid_imu_gpio = DEVICE_DT_GET( + DT_GPIO_CTLR(DT_NODELABEL(lid_accel_int_l), gpios)); + const gpio_port_pins_t lid_imu_pin = + DT_GPIO_PIN(DT_NODELABEL(lid_accel_int_l), gpios); + + zassert_ok(gpio_emul_input_set(lid_imu_gpio, lid_imu_pin, 1), NULL); + k_sleep(K_MSEC(100)); + zassert_ok(gpio_emul_input_set(lid_imu_gpio, lid_imu_pin, 0), NULL); + k_sleep(K_MSEC(100)); + + zassert_equal(lid_interrupt_id, 2, "lid_interrupt_id=%d", + lid_interrupt_id); +} diff --git a/zephyr/test/krabby/testcase.yaml b/zephyr/test/krabby/testcase.yaml index df29e24982..0994091c5a 100644 --- a/zephyr/test/krabby/testcase.yaml +++ b/zephyr/test/krabby/testcase.yaml @@ -11,7 +11,17 @@ tests: - CONFIG_TEST_KRABBY=y - CONFIG_MUX_INIT_ADC=y krabby.tentacruel: - extra_args: DTC_OVERLAY_FILE="common.dts;adc_temp.dts;../program/corsola/ite_interrupts.dtsi;../program/corsola/ite_gpio.dtsi;../program/corsola/tentacruel/thermistor.dtsi;pinctrl.dts" + extra_args: DTC_OVERLAY_FILE="common.dts;adc_temp.dts;../program/corsola/ite_interrupts.dtsi;../program/corsola/ite_gpio.dtsi;../program/corsola/tentacruel/thermistor.dtsi;pinctrl.dts;../program/corsola/ite_motionsense.dtsi;../program/corsola/tentacruel/cbi.dtsi;cbi_sensor.dts"" extra_configs: - CONFIG_TEST_TENTACRUEL=y - CONFIG_PLATFORM_EC_CHARGER_PROFILE_OVERRIDE=y + - CONFIG_EEPROM=y + - CONFIG_EEPROM_SIMULATOR=n + - CONFIG_EMUL_EEPROM_AT2X=y + - CONFIG_PLATFORM_EC_MOTIONSENSE=y + - CONFIG_PLATFORM_EC_DYNAMIC_MOTION_SENSOR_COUNT=y + - CONFIG_PLATFORM_EC_GMR_TABLET_MODE=y + - CONFIG_PLATFORM_EC_TABLET_MODE=y + - CONFIG_PLATFORM_EC_LID_ANGLE=y + - CONFIG_PLATFORM_EC_ACCELGYRO_BMI260=y + - CONFIG_PLATFORM_EC_ACCELGYRO_BMI_COMM_I2C=y -- cgit v1.2.1