diff options
Diffstat (limited to 'cros_ec/test/ec_keyboard_test.c')
-rw-r--r-- | cros_ec/test/ec_keyboard_test.c | 80 |
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; } |