summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2017-07-12 12:56:48 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-07-19 14:41:21 -0700
commita6060f53ee2c2736031b5fea80884886c6e08816 (patch)
treec412e882d29a0e65fb90ad29e66ac98798fc69e2 /include
parent1082d99ca629c88a46996f3911f0a5af98dd3ba8 (diff)
downloadchrome-ec-a6060f53ee2c2736031b5fea80884886c6e08816.tar.gz
cr50: Add physical presence state machine
This will be used as part of case closed debugging configuration. Currently, this only adds the state machine, and a test command which is available when CR50_DEV=1. It also adds a new sleep mask flag for physical presence detect, instead of oveloading FORCE_NO_DSLEEP. The physical presence state machine supports both short (tap 5 times in 15 seconds) and long (short, followed by 4 more taps 1-5 minutes apart) sequences. It will call a callback function at the end of the sequence, so that multiple things can each request physical presence in turn. This will be used by ccdopen / ccdunlock / testlab commands for CCD V1. Eventually, CCD config will replace the unlock sequence handling in wp.c. But for now, we don't touch that. See go/cr50-ccd-wp for more information. BUG=b:62537474 BRANCH=none TEST=manual Short sequence: pp short pp pp pp # See "Physical presence good" Timeout pp short pp # 15 sec later, get timeout error Long sequence: pp long pp pp pp (wait 2 sec) pp (wait 2 sec) pp # See "PP good" Long sequence, presses too fast: pp long pp pp pp pp # See "PP L too soon" (wait 2 sec) pp (wait 2 sec) pp # See "Physical presence good" Abort: pp short pp abort # See "Physical presence aborted" Change-Id: I09da81ad11d328e7d7740c3fe838a5f67d7b8708 Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/568796 Reviewed-by: Aseda Aboagye <aaboagye@chromium.org> Reviewed-by: Vadim Bendebury <vbendeb@chromium.org> Reviewed-by: Mary Ruthven <mruthven@chromium.org>
Diffstat (limited to 'include')
-rw-r--r--include/config.h6
-rw-r--r--include/console_channel.inc3
-rw-r--r--include/physical_presence.h64
-rw-r--r--include/system.h2
4 files changed, 75 insertions, 0 deletions
diff --git a/include/config.h b/include/config.h
index 6f8cf1bf77..411fc30f6a 100644
--- a/include/config.h
+++ b/include/config.h
@@ -1819,6 +1819,12 @@
*/
#undef CONFIG_PECI_TJMAX
+/* Support physical presence detection (via a physical button) */
+#undef CONFIG_PHYSICAL_PRESENCE
+
+/* Enable (unsafe!) developer debug features for physical presence */
+#undef CONFIG_PHYSICAL_PRESENCE_DEBUG_UNSAFE
+
/*****************************************************************************/
/* PMU config */
diff --git a/include/console_channel.inc b/include/console_channel.inc
index 145ef53729..dc72d665fb 100644
--- a/include/console_channel.inc
+++ b/include/console_channel.inc
@@ -19,6 +19,9 @@ CONSOLE_CHANNEL(CC_BLUETOOTH_HCI,"bluetooth_hci")
#ifdef CONFIG_EXTENSION_COMMAND
CONSOLE_CHANNEL(CC_EXTENSION, "extension")
#endif
+#if defined(CONFIG_CASE_CLOSED_DEBUG) || defined(CONFIG_PHYSICAL_PRESENCE)
+CONSOLE_CHANNEL(CC_CCD, "ccd")
+#endif
CONSOLE_CHANNEL(CC_CHARGER, "charger")
CONSOLE_CHANNEL(CC_CHIPSET, "chipset")
CONSOLE_CHANNEL(CC_CLOCK, "clock")
diff --git a/include/physical_presence.h b/include/physical_presence.h
new file mode 100644
index 0000000000..f2678993fc
--- /dev/null
+++ b/include/physical_presence.h
@@ -0,0 +1,64 @@
+/* Copyright 2017 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Physical presence detection
+ */
+#ifndef __CROS_EC_PHYSICAL_PRESENCE_H
+#define __CROS_EC_PHYSICAL_PRESENCE_H
+
+/**
+ * Start physical presence detect.
+ *
+ * If the physical presence sequence is successful, callback() will be called
+ * from the hook task context as a deferred function.
+ *
+ * On failure or abort, callback() will not be called.
+ *
+ * @param is_long Use long (!=0) or short (0) sequence)
+ * @param callback Function to call when successful
+ * @return EC_SUCCESS, EC_BUSY if detect already in progress, or other
+ * non-zero error code if error.
+ */
+int physical_detect_start(int is_long, void (*callback)(void));
+
+/**
+ * Check if a physical detect attempt is in progress
+ *
+ * @return non-zero if in progress
+ */
+int physical_detect_busy(void);
+
+/**
+ * Abort a currently-running physical presence detect.
+ *
+ * Note there is a race condition between stopping detect and a running
+ * detect finishing and calling its callback. The intent of this function
+ * is not to prevent that, but instead to avoid an aborted physical detect
+ * tying up the button for long periods when we no longer care.
+ */
+void physical_detect_abort(void);
+
+/**
+ * Handle a physical detect button press.
+ *
+ * This may be called from interrupt level.
+ *
+ * Returns EC_SUCCESS if the press was consumed, or EC_ERROR_NOT_HANDLED if
+ * physical detect was idle (so the press is for someone else).
+ */
+int physical_detect_press(void);
+
+/**
+ * Start/stop capturing the button for physical presence.
+ *
+ * When enabled, a debounced button press+release should call
+ * physical_detect_press().
+ *
+ * This should be implemented by the board.
+ *
+ * @param enable Enable (!=0) or disable (==0) capturing button.
+ */
+void board_physical_presence_enable(int enable);
+
+#endif /* __CROS_EC_PHYSICAL_PRESENCE_H */
diff --git a/include/system.h b/include/system.h
index cd7f42817e..a4595b3651 100644
--- a/include/system.h
+++ b/include/system.h
@@ -389,6 +389,8 @@ enum {
SLEEP_MASK_FAN = (1 << 8), /* Fan control loop ongoing */
SLEEP_MASK_USB_DEVICE = (1 << 9), /* Generic USB device in use */
SLEEP_MASK_PWM = (1 << 10), /* PWM output is enabled */
+ SLEEP_MASK_PHYSICAL_PRESENCE = (1 << 11), /* Physical presence
+ * detection ongoing */
SLEEP_MASK_FORCE_NO_DSLEEP = (1 << 15), /* Force disable. */