summaryrefslogtreecommitdiff
path: root/cros_ec/test/ec_keyboard_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'cros_ec/test/ec_keyboard_test.c')
-rw-r--r--cros_ec/test/ec_keyboard_test.c80
1 files changed, 70 insertions, 10 deletions
diff --git a/cros_ec/test/ec_keyboard_test.c b/cros_ec/test/ec_keyboard_test.c
index a425c0781a..b84e179ece 100644
--- a/cros_ec/test/ec_keyboard_test.c
+++ b/cros_ec/test/ec_keyboard_test.c
@@ -7,8 +7,10 @@
#include "cros_ec/include/ec_common.h"
#include "chip_interface/ec_uart.h"
#include "cros_ec/include/core.h"
+#include "cros_ec/include/ec_keyboard.h"
#include "cros_ec/chip_stub/include/host.h"
#include "cros_ec/chip_stub/include/keyboard.h"
+#include "host_interface/i8042.h"
#define RUN_TEST(func) do { \
int ret; \
@@ -20,42 +22,100 @@
} while (0)
-EcError testKeyMade() {
+EcError TestKeyMade() {
uint8_t buf;
+ /* Fake a key press */
SimulateKeyStateChange(2, 3, 1);
EC_ASSERT(EC_SUCCESS == PullI8042ScanCode(&buf));
- EC_ASSERT(buf == 2 * 13 + 3);
+ EC_ASSERT(buf == 0x24);
+ EC_ASSERT(EC_ERROR_BUFFER_EMPTY == PullI8042ScanCode(&buf));
/* The duplicate press event will be ignored. */
SimulateKeyStateChange(2, 3, 1);
EC_ASSERT(EC_ERROR_BUFFER_EMPTY == PullI8042ScanCode(&buf));
+ /* Test 2-byte scan code */
+ SimulateKeyStateChange(3, 6, 1);
+ EC_ASSERT(EC_SUCCESS == PullI8042ScanCode(&buf));
+ EC_ASSERT(buf == 0xE0);
+ EC_ASSERT(EC_SUCCESS == PullI8042ScanCode(&buf));
+ EC_ASSERT(buf == 0x1f);
+ EC_ASSERT(EC_ERROR_BUFFER_EMPTY == PullI8042ScanCode(&buf));
+
return EC_SUCCESS;
}
-EcError testKeyReleased() {
+EcError TestKeyReleased() {
uint8_t buf;
/* The key is not pressed yet. A release event doesn't send out a code. */
- SimulateKeyStateChange(7, 12, 0);
+ SimulateKeyStateChange(0, 1, 0);
EC_ASSERT(EC_ERROR_BUFFER_EMPTY == PullI8042ScanCode(&buf));
/* Press and release it. Expect a release code. */
- SimulateKeyStateChange(7, 12, 1);
- SimulateKeyStateChange(7, 12, 0);
+ SimulateKeyStateChange(0, 1, 1);
+ EC_ASSERT(EC_SUCCESS == PullI8042ScanCode(&buf));
+ EC_ASSERT(buf == 0x0E);
+ EC_ASSERT(EC_ERROR_BUFFER_EMPTY == PullI8042ScanCode(&buf));
+ SimulateKeyStateChange(0, 1, 0); /* release */
+ EC_ASSERT(EC_SUCCESS == PullI8042ScanCode(&buf));
+ EC_ASSERT(buf == 0xF0);
+ EC_ASSERT(EC_SUCCESS == PullI8042ScanCode(&buf));
+ EC_ASSERT(buf == 0x0E);
+ EC_ASSERT(EC_ERROR_BUFFER_EMPTY == PullI8042ScanCode(&buf));
+
+ /* Test 3-byte break code */
+ SimulateKeyStateChange(7, 3, 1);
+ EC_ASSERT(EC_SUCCESS == PullI8042ScanCode(&buf));
+ EC_ASSERT(buf == 0xE0);
EC_ASSERT(EC_SUCCESS == PullI8042ScanCode(&buf));
- EC_ASSERT(buf == 7 * 13 + 12);
+ EC_ASSERT(buf == 0x37);
+ EC_ASSERT(EC_ERROR_BUFFER_EMPTY == PullI8042ScanCode(&buf));
+ SimulateKeyStateChange(7, 3, 0); /* release */
+ EC_ASSERT(EC_SUCCESS == PullI8042ScanCode(&buf));
+ EC_ASSERT(buf == 0xE0);
+ EC_ASSERT(EC_SUCCESS == PullI8042ScanCode(&buf));
+ EC_ASSERT(buf == 0xF0);
EC_ASSERT(EC_SUCCESS == PullI8042ScanCode(&buf));
- EC_ASSERT(buf == 7 * 13 + 12 + 0x80);
+ EC_ASSERT(buf == 0x37);
+ EC_ASSERT(EC_ERROR_BUFFER_EMPTY == PullI8042ScanCode(&buf));
return EC_SUCCESS;
}
+EcError TestScancodeSet() {
+ int len;
+ uint8_t output[MAX_I8042_OUTPUT_LEN];
+
+ /* Get Scancode Set */
+ len = SimulateI8042Command(EC_I8042_CMD_GSCANSET, EC_SCANCODE_GET_SET,
+ output);
+ EC_ASSERT(len == 1);
+ EC_ASSERT(output[0] == EC_SCANCODE_SET_2);
+
+ /* Set as set 1. Expect failed */
+ len = SimulateI8042Command(EC_I8042_CMD_GSCANSET, EC_SCANCODE_SET_1, output);
+ EC_ASSERT(len == 1);
+ EC_ASSERT(output[0] == EC_I8042_RET_ERR);
+
+ /* Set as set 2. Expect success */
+ len = SimulateI8042Command(EC_I8042_CMD_GSCANSET, EC_SCANCODE_SET_2, output);
+ EC_ASSERT(len == 0);
+
+ /* Set as set 3. Expect failed */
+ len = SimulateI8042Command(EC_I8042_CMD_GSCANSET, EC_SCANCODE_SET_3, output);
+ EC_ASSERT(len == 1);
+ EC_ASSERT(output[0] == EC_I8042_RET_ERR);
+
+ return EC_SUCCESS;
+}
+
int run_test_cases() {
- RUN_TEST(testKeyMade);
- RUN_TEST(testKeyReleased);
+ RUN_TEST(TestKeyMade);
+ RUN_TEST(TestKeyReleased);
+ RUN_TEST(TestScancodeSet);
return EC_SUCCESS;
}