diff options
author | Randall Spangler <rspangler@chromium.org> | 2017-07-12 12:56:48 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-07-19 14:41:21 -0700 |
commit | a6060f53ee2c2736031b5fea80884886c6e08816 (patch) | |
tree | c412e882d29a0e65fb90ad29e66ac98798fc69e2 /include | |
parent | 1082d99ca629c88a46996f3911f0a5af98dd3ba8 (diff) | |
download | chrome-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.h | 6 | ||||
-rw-r--r-- | include/console_channel.inc | 3 | ||||
-rw-r--r-- | include/physical_presence.h | 64 | ||||
-rw-r--r-- | include/system.h | 2 |
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. */ |