summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Chao <scott_chao@wistron.corp-partner.google.com>2023-04-28 16:59:36 +0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-05-12 07:35:15 +0000
commit5c4d8b42efb23ba5334a43145cdc6ad1809ab1b3 (patch)
treed5f2018dd035da53fe6ca019cc27ec3573f337bc
parent9615337c2d27357fa7672837f1088fd1356e6d45 (diff)
downloadchrome-ec-5c4d8b42efb23ba5334a43145cdc6ad1809ab1b3.tar.gz
joxer: Allow alternate rotation parameters for Joxer
This will allow joxer to load different rotation matrix according to cbi. BUG=b:282054731 TEST=make sure joxer rotate correctly Change-Id: I03aa376f05f8f68cbabacf897915cb54d6b80ab7 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4486659 Commit-Queue: Scott Chao <scott_chao@wistron.corp-partner.google.com> Reviewed-by: Peter Marheine <pmarheine@chromium.org> Tested-by: Scott Chao <scott_chao@wistron.corp-partner.google.com>
-rw-r--r--zephyr/program/nissa/CMakeLists.txt1
-rw-r--r--zephyr/program/nissa/joxer/cbi.dtsi21
-rw-r--r--zephyr/program/nissa/joxer/motionsense.dtsi6
-rw-r--r--zephyr/program/nissa/joxer/src/form_factor.c39
4 files changed, 67 insertions, 0 deletions
diff --git a/zephyr/program/nissa/CMakeLists.txt b/zephyr/program/nissa/CMakeLists.txt
index cd45f00a3a..88e2d1c8a4 100644
--- a/zephyr/program/nissa/CMakeLists.txt
+++ b/zephyr/program/nissa/CMakeLists.txt
@@ -71,6 +71,7 @@ if(DEFINED CONFIG_BOARD_JOXER)
zephyr_library_sources(
"joxer/src/led.c"
"joxer/src/keyboard.c"
+ "joxer/src/form_factor.c"
)
zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC "joxer/src/usbc.c")
zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_CHARGER "joxer/src/charger.c")
diff --git a/zephyr/program/nissa/joxer/cbi.dtsi b/zephyr/program/nissa/joxer/cbi.dtsi
index afbd125b32..71424ed681 100644
--- a/zephyr/program/nissa/joxer/cbi.dtsi
+++ b/zephyr/program/nissa/joxer/cbi.dtsi
@@ -28,5 +28,26 @@
value = <1>;
};
};
+
+ /*
+ * FW_CONFIG field to describe lid accelerometer orientation.
+ */
+ lid-inversion {
+ enum-name = "FW_LID_INVERSION";
+ start = <5>;
+ size = <1>;
+
+ default {
+ compatible = "cros-ec,cbi-fw-config-value";
+ enum-name = "SENSOR_DEFAULT";
+ value = <0>;
+ default;
+ };
+ inverted {
+ compatible = "cros-ec,cbi-fw-config-value";
+ enum-name = "SENSOR_INVERTED";
+ value = <1>;
+ };
+ };
};
};
diff --git a/zephyr/program/nissa/joxer/motionsense.dtsi b/zephyr/program/nissa/joxer/motionsense.dtsi
index e9c46a849a..fbac470660 100644
--- a/zephyr/program/nissa/joxer/motionsense.dtsi
+++ b/zephyr/program/nissa/joxer/motionsense.dtsi
@@ -40,6 +40,12 @@
0 0 (-1)>;
};
+ lid_rot_inverted: lid-rotation-inverted {
+ mat33 = <0 1 0
+ (-1) 0 0
+ 0 0 1>;
+ };
+
base_rot_ref: base-rotation-ref {
mat33 = <1 0 0
0 1 0
diff --git a/zephyr/program/nissa/joxer/src/form_factor.c b/zephyr/program/nissa/joxer/src/form_factor.c
new file mode 100644
index 0000000000..1087d7ddca
--- /dev/null
+++ b/zephyr/program/nissa/joxer/src/form_factor.c
@@ -0,0 +1,39 @@
+/* Copyright 2023 The ChromiumOS Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "accelgyro.h"
+#include "cros_cbi.h"
+#include "hooks.h"
+#include "motionsense_sensors.h"
+
+#include <zephyr/devicetree.h>
+#include <zephyr/logging/log.h>
+
+LOG_MODULE_DECLARE(nissa, CONFIG_NISSA_LOG_LEVEL);
+
+#define ALT_MAT SENSOR_ROT_STD_REF_NAME(DT_NODELABEL(lid_rot_inverted))
+#define LID_ACCEL SENSOR_ID(DT_NODELABEL(lid_accel))
+
+static void form_factor_init(void)
+{
+ int ret;
+ uint32_t val;
+ /*
+ * If the firmware config indicates
+ * an inverted form factor, use the alternative
+ * rotation matrix.
+ */
+ ret = cros_cbi_get_fw_config(FW_LID_INVERSION, &val);
+ if (ret != 0) {
+ LOG_ERR("Error retrieving CBI FW_CONFIG field %d",
+ FW_LID_INVERSION);
+ return;
+ }
+ if (val == SENSOR_INVERTED) {
+ LOG_INF("Switching to inverted lid");
+ motion_sensors[LID_ACCEL].rot_standard_ref = &ALT_MAT;
+ }
+}
+DECLARE_HOOK(HOOK_INIT, form_factor_init, HOOK_PRIO_POST_I2C);