summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjeffrey <jeffrey_lin@pegatron.corp-partner.google.com>2022-12-12 16:01:07 +0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-12-15 05:04:22 +0000
commit20ccd7a68f442514df5c7d1221ea733994ed39e0 (patch)
treee118806f7a6ee5852750cbd86b1c9e3f1709312c
parentf4fdcfe04999eaf6fe738a41587414ada530e47d (diff)
downloadchrome-ec-20ccd7a68f442514df5c7d1221ea733994ed39e0.tar.gz
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 <jeffrey_lin@pegatron.corp-partner.google.com> Change-Id: Iaf4eb89586854d5accc0643caca52875793e2152 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4087970 Reviewed-by: Eric Yilun Lin <yllin@google.com> Tested-by: Ting Shen <phoenixshen@chromium.org> Commit-Queue: Ting Shen <phoenixshen@chromium.org> Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com>
-rw-r--r--zephyr/program/corsola/tentacruel/cbi.dtsi74
-rw-r--r--zephyr/program/corsola/tentacruel/project.conf2
-rw-r--r--zephyr/program/corsola/tentacruel/project.overlay83
-rw-r--r--zephyr/program/corsola/tentacruel/src/sensor.c83
-rw-r--r--zephyr/test/krabby/CMakeLists.txt5
-rw-r--r--zephyr/test/krabby/cbi_sensor.dts123
-rw-r--r--zephyr/test/krabby/src/fake.c23
-rw-r--r--zephyr/test/krabby/src/fwconfig_tentacruel.c253
-rw-r--r--zephyr/test/krabby/testcase.yaml12
9 files changed, 607 insertions, 51 deletions
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 <zephyr/fff.h>
+
+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 <zephyr/drivers/gpio/gpio_emul.h>
+#include <zephyr/ztest.h>
+
+#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