summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2012-09-06 14:57:31 -0700
committerGerrit <chrome-bot@google.com>2012-09-10 13:06:49 -0700
commit212dbaf52df693605b2066fbc8a198f1260b474e (patch)
treed2a428a5543d6a34a63a01bade03e17caa3e7ded
parent254a8336bf5c5a39b4611d193006b23a4158f478 (diff)
downloadchrome-ec-212dbaf52df693605b2066fbc8a198f1260b474e.tar.gz
Refactor runtime special key combination code
The code for warm reboot is overly specialized, and makes it hard to add other key cominations for testing. BUG=chrome-os-partner:13763 BRANCH=link TEST=manual 1. boot system 2. hold down (in order) R+T+alt+VolUp. System does not reboot. 3. let go of T (so only R+alt+volup are pressed). System reboots. Change-Id: I14cdb7f790e8a772712085a77eaf4299487788db Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/32439 Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r--chip/lm4/keyboard_scan.c61
-rw-r--r--include/keyboard_scan.h2
2 files changed, 38 insertions, 25 deletions
diff --git a/chip/lm4/keyboard_scan.c b/chip/lm4/keyboard_scan.c
index 4d33e1cd73..9a1f45e2e1 100644
--- a/chip/lm4/keyboard_scan.c
+++ b/chip/lm4/keyboard_scan.c
@@ -37,8 +37,6 @@ struct boot_key_entry {
const struct boot_key_entry boot_key_list[] = {
{0, 0x00}, /* (none) */
{1, 0x02}, /* Esc */
- {2, 0x10}, /* D */
- {3, 0x10}, /* F */
{11, 0x40}, /* Down-arrow */
};
@@ -61,15 +59,15 @@ static const uint8_t actual_key_masks[4][KB_COLS] = {
#define MASK_INDEX_REFRESH 2
#define MASK_VALUE_REFRESH 0x04
-/* Key masks and values for warm reboot combination */
-#define MASK_INDEX_KEYR 3
-#define MASK_VALUE_KEYR 0x80
+/* Key masks for special runtime keys */
#define MASK_INDEX_VOL_UP 4
#define MASK_VALUE_VOL_UP 0x01
#define MASK_INDEX_RIGHT_ALT 10
#define MASK_VALUE_RIGHT_ALT 0x01
#define MASK_INDEX_LEFT_ALT 10
#define MASK_VALUE_LEFT_ALT 0x40
+#define MASK_INDEX_KEY_R 3
+#define MASK_VALUE_KEY_R 0x80
static void wait_for_interrupt(void)
{
@@ -130,15 +128,42 @@ static void print_raw_state(const char *msg)
CPUTS("]\n");
}
-static int check_warm_reboot_keys(void)
+/**
+ * Check special runtime key combinations.
+ */
+static void check_runtime_keys(void)
{
- if (raw_state[MASK_INDEX_KEYR] == MASK_VALUE_KEYR &&
- raw_state[MASK_INDEX_VOL_UP] == MASK_VALUE_VOL_UP &&
- (raw_state[MASK_INDEX_RIGHT_ALT] == MASK_VALUE_RIGHT_ALT ||
- raw_state[MASK_INDEX_LEFT_ALT] == MASK_VALUE_LEFT_ALT))
- return 1;
+ int num_press = 0;
+ int c;
- return 0;
+ /*
+ * All runtime key combos are (right or left ) alt + volume up + (some
+ * key NOT on the same col as alt or volume up )
+ */
+ if (raw_state[MASK_INDEX_VOL_UP] != MASK_VALUE_VOL_UP)
+ return;
+ if (raw_state[MASK_INDEX_RIGHT_ALT] != MASK_VALUE_RIGHT_ALT &&
+ raw_state[MASK_INDEX_LEFT_ALT] != MASK_VALUE_LEFT_ALT)
+ return;
+
+ /*
+ * Count number of columns with keys pressed. We know two columns are
+ * pressed for volume up and alt, so if only one more key is pressed
+ * there will be exactly 3 non-zero columns.
+ */
+ for (c = 0; c < KB_COLS; c++) {
+ if (raw_state[c])
+ num_press++;
+ }
+ if (num_press != 3)
+ return;
+
+ /* Check individual keys */
+ if (raw_state[MASK_INDEX_KEY_R] == MASK_VALUE_KEY_R) {
+ /* R = reboot */
+ CPRINTF("[%T KB warm reboot]\n");
+ x86_power_reset(0);
+ }
}
/* Return 1 if any key is still pressed, 0 if no key is pressed. */
@@ -147,7 +172,6 @@ static int check_keys_changed(void)
int c, c2;
uint8_t r;
int change = 0;
- int num_press = 0;
uint8_t keys[KB_COLS];
for (c = 0; c < KB_COLS; c++) {
@@ -211,18 +235,9 @@ static int check_keys_changed(void)
}
}
- /* Count number of key pressed */
- for (c = 0; c < KB_COLS; c++) {
- if (raw_state[c])
- ++num_press;
- }
-
if (change) {
- if (num_press == 3) {
- if (check_warm_reboot_keys())
- x86_power_reset(0);
- }
print_raw_state("state");
+ check_runtime_keys();
}
out:
diff --git a/include/keyboard_scan.h b/include/keyboard_scan.h
index 0fa526ee48..f92e8a3925 100644
--- a/include/keyboard_scan.h
+++ b/include/keyboard_scan.h
@@ -17,8 +17,6 @@ int keyboard_scan_init(void);
enum boot_key {
BOOT_KEY_NONE, /* No keys other than keyboard-controlled reset keys */
BOOT_KEY_ESC,
- BOOT_KEY_D,
- BOOT_KEY_F,
BOOT_KEY_DOWN_ARROW,
BOOT_KEY_OTHER = -1, /* None of the above */
};