summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2013-06-16 22:36:07 +0800
committerChromeBot <chrome-bot@google.com>2013-06-18 10:31:09 -0700
commit7381c7c5f6ff5581523e2a3d8eccda0b2d3b2830 (patch)
tree7ca870ccab3537f1a4aeb67fdaccf69eb877325a
parent80aa9604d26de0dadd79a3380420d91c40e9c87c (diff)
downloadchrome-ec-7381c7c5f6ff5581523e2a3d8eccda0b2d3b2830.tar.gz
More keyboard scan test
BUG=chrome-os-partner:19236 TEST=Pass the test BRANCH=None Change-Id: Ie0b0657c0bca2ec459cc8b04d9e06199b70414d9 Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/58795 Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r--include/keyboard_config.h28
-rw-r--r--test/kb_scan.c122
2 files changed, 134 insertions, 16 deletions
diff --git a/include/keyboard_config.h b/include/keyboard_config.h
index ff2eded50c..ae70bf7352 100644
--- a/include/keyboard_config.h
+++ b/include/keyboard_config.h
@@ -14,22 +14,32 @@
#define KEYBOARD_COLS 13
#define KEYBOARD_ROWS 8
+#define KEYBOARD_ROW_TO_MASK(r) (1 << (r))
+
/* Columns and masks for keys we particularly care about */
-#define KEYBOARD_COL_DOWN 11
-#define KEYBOARD_MASK_DOWN 0x40
+#define KEYBOARD_COL_DOWN 11
+#define KEYBOARD_ROW_DOWN 6
+#define KEYBOARD_MASK_DOWN KEYBOARD_ROW_TO_MASK(KEYBOARD_ROW_DOWN)
#define KEYBOARD_COL_ESC 1
-#define KEYBOARD_MASK_ESC 0x02
+#define KEYBOARD_ROW_ESC 1
+#define KEYBOARD_MASK_ESC KEYBOARD_ROW_TO_MASK(KEYBOARD_ROW_ESC)
#define KEYBOARD_COL_KEY_H 6
-#define KEYBOARD_MASK_KEY_H 0x02
+#define KEYBOARD_ROW_KEY_H 1
+#define KEYBOARD_MASK_KEY_H KEYBOARD_ROW_TO_MASK(KEYBOARD_ROW_KEY_H)
#define KEYBOARD_COL_KEY_R 3
-#define KEYBOARD_MASK_KEY_R 0x80
+#define KEYBOARD_ROW_KEY_R 7
+#define KEYBOARD_MASK_KEY_R KEYBOARD_ROW_TO_MASK(KEYBOARD_ROW_KEY_R)
#define KEYBOARD_COL_LEFT_ALT 10
-#define KEYBOARD_MASK_LEFT_ALT 0x40
+#define KEYBOARD_ROW_LEFT_ALT 6
+#define KEYBOARD_MASK_LEFT_ALT KEYBOARD_ROW_TO_MASK(KEYBOARD_ROW_LEFT_ALT)
#define KEYBOARD_COL_REFRESH 2
-#define KEYBOARD_MASK_REFRESH 0x04
+#define KEYBOARD_ROW_REFRESH 2
+#define KEYBOARD_MASK_REFRESH KEYBOARD_ROW_TO_MASK(KEYBOARD_ROW_REFRESH)
#define KEYBOARD_COL_RIGHT_ALT 10
-#define KEYBOARD_MASK_RIGHT_ALT 0x01
+#define KEYBOARD_ROW_RIGHT_ALT 0
+#define KEYBOARD_MASK_RIGHT_ALT KEYBOARD_ROW_TO_MASK(KEYBOARD_ROW_RIGHT_ALT)
#define KEYBOARD_COL_VOL_UP 4
-#define KEYBOARD_MASK_VOL_UP 0x01
+#define KEYBOARD_ROW_VOL_UP 0
+#define KEYBOARD_MASK_VOL_UP KEYBOARD_ROW_TO_MASK(KEYBOARD_ROW_VOL_UP)
#endif /* __CROS_EC_KEYBOARD_CONFIG_H */
diff --git a/test/kb_scan.c b/test/kb_scan.c
index 3822e155ae..79dcd79576 100644
--- a/test/kb_scan.c
+++ b/test/kb_scan.c
@@ -9,6 +9,7 @@
#include "common.h"
#include "console.h"
#include "gpio.h"
+#include "host_command.h"
#include "keyboard_raw.h"
#include "keyboard_scan.h"
#include "lid_switch.h"
@@ -32,6 +33,10 @@ static uint8_t mock_state[KEYBOARD_COLS];
static int column_driven;
static int fifo_add_count;
static int lid_open;
+#ifdef EMU_BUILD
+static int hibernated;
+static int reset_called;
+#endif
#ifdef CONFIG_LID_SWITCH
int lid_is_open(void)
@@ -67,7 +72,23 @@ int keyboard_fifo_add(const uint8_t *buffp)
return EC_SUCCESS;
}
-void mock_key(int r, int c, int keydown)
+#ifdef EMU_BUILD
+void system_hibernate(uint32_t s, uint32_t us)
+{
+ hibernated = 1;
+}
+
+void chipset_reset(int cold_reset)
+{
+ reset_called = 1;
+}
+#endif
+
+#define mock_defined_key(k, p) mock_key(KEYBOARD_ROW_ ## k, \
+ KEYBOARD_COL_ ## k, \
+ p)
+
+static void mock_key(int r, int c, int keydown)
{
ccprintf("%s (%d, %d)\n", keydown ? "Pressing" : "Releasing", r, c);
if (keydown)
@@ -76,7 +97,7 @@ void mock_key(int r, int c, int keydown)
mock_state[c] &= ~(1 << r);
}
-int expect_keychange(void)
+static int expect_keychange(void)
{
int old_count = fifo_add_count;
int retry = KEYDOWN_RETRY;
@@ -89,7 +110,7 @@ int expect_keychange(void)
return EC_ERROR_UNKNOWN;
}
-int expect_no_keychange(void)
+static int expect_no_keychange(void)
{
int old_count = fifo_add_count;
task_wake(TASK_ID_KEYSCAN);
@@ -97,7 +118,19 @@ int expect_no_keychange(void)
return (fifo_add_count == old_count) ? EC_SUCCESS : EC_ERROR_UNKNOWN;
}
-int verify_key_presses(int old, int expected)
+static int host_command_simulate(int r, int c, int keydown)
+{
+ struct ec_params_mkbp_simulate_key params;
+
+ params.col = c;
+ params.row = r;
+ params.pressed = keydown;
+
+ return test_send_host_command(EC_CMD_MKBP_SIMULATE_KEY, 0, &params,
+ sizeof(params), NULL, 0);
+}
+
+static int verify_key_presses(int old, int expected)
{
int retry = KEYDOWN_RETRY;
@@ -114,7 +147,7 @@ int verify_key_presses(int old, int expected)
}
}
-int deghost_test(void)
+static int deghost_test(void)
{
/* Test we can detect a keypress */
mock_key(1, 1, 1);
@@ -157,7 +190,7 @@ int deghost_test(void)
return EC_SUCCESS;
}
-int debounce_test(void)
+static int debounce_test(void)
{
int old_count = fifo_add_count;
mock_key(1, 1, 1);
@@ -217,8 +250,79 @@ int debounce_test(void)
return EC_SUCCESS;
}
+static int simulate_key_test(void)
+{
+ host_command_simulate(1, 1, 1);
+ TEST_ASSERT(expect_keychange() == EC_SUCCESS);
+ host_command_simulate(1, 1, 0);
+ TEST_ASSERT(expect_keychange() == EC_SUCCESS);
+
+ return EC_SUCCESS;
+}
+
+#ifdef EMU_BUILD
+static int wait_variable_set(int *var)
+{
+ int retry = KEYDOWN_RETRY;
+ *var = 0;
+ task_wake(TASK_ID_KEYSCAN);
+ while (retry--) {
+ msleep(KEYDOWN_DELAY_MS);
+ if (*var == 1)
+ return EC_SUCCESS;
+ }
+ return EC_ERROR_UNKNOWN;
+}
+
+static int verify_variable_not_set(int *var)
+{
+ *var = 0;
+ task_wake(TASK_ID_KEYSCAN);
+ msleep(NO_KEYDOWN_DELAY_MS);
+ return *var ? EC_ERROR_UNKNOWN : EC_SUCCESS;
+}
+
+static int runtime_key_test(void)
+{
+ /* Alt-VolUp-H triggers system hibernation */
+ mock_defined_key(LEFT_ALT, 1);
+ mock_defined_key(VOL_UP, 1);
+ mock_defined_key(KEY_H, 1);
+ TEST_ASSERT(wait_variable_set(&hibernated) == EC_SUCCESS);
+ mock_defined_key(LEFT_ALT, 0);
+ mock_defined_key(VOL_UP, 0);
+ mock_defined_key(KEY_H, 0);
+ TEST_ASSERT(expect_keychange() == EC_SUCCESS);
+
+ /* Alt-VolUp-R triggers chipset reset */
+ mock_defined_key(RIGHT_ALT, 1);
+ mock_defined_key(VOL_UP, 1);
+ mock_defined_key(KEY_R, 1);
+ TEST_ASSERT(wait_variable_set(&reset_called) == EC_SUCCESS);
+ mock_defined_key(RIGHT_ALT, 0);
+ mock_defined_key(VOL_UP, 0);
+ mock_defined_key(KEY_R, 0);
+ TEST_ASSERT(expect_keychange() == EC_SUCCESS);
+
+ /* Must press exactly 3 keys to trigger runtime keys */
+ mock_defined_key(LEFT_ALT, 1);
+ mock_defined_key(KEY_H, 1);
+ mock_defined_key(KEY_R, 1);
+ mock_defined_key(VOL_UP, 1);
+ TEST_ASSERT(verify_variable_not_set(&hibernated) == EC_SUCCESS);
+ TEST_ASSERT(verify_variable_not_set(&reset_called) == EC_SUCCESS);
+ mock_defined_key(VOL_UP, 0);
+ mock_defined_key(KEY_R, 0);
+ mock_defined_key(KEY_H, 0);
+ mock_defined_key(LEFT_ALT, 0);
+ TEST_ASSERT(expect_keychange() == EC_SUCCESS);
+
+ return EC_SUCCESS;
+}
+#endif
+
#ifdef CONFIG_LID_SWITCH
-int lid_test(void)
+static int lid_test(void)
{
lid_open = 0;
mock_key(1, 1, 1);
@@ -243,6 +347,10 @@ void run_test(void)
RUN_TEST(deghost_test);
RUN_TEST(debounce_test);
+ RUN_TEST(simulate_key_test);
+#ifdef EMU_BUILD
+ RUN_TEST(runtime_key_test);
+#endif
#ifdef CONFIG_LID_SWITCH
RUN_TEST(lid_test);
#endif