diff options
author | Jett Rink <jettrink@chromium.org> | 2019-04-09 13:25:57 -0600 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-04-18 19:51:59 -0700 |
commit | d584b1b4e05251774f61b77acf88deac2448af54 (patch) | |
tree | 9220e02f92a0d93ea3d21e94ec1c168c41b531c8 /test | |
parent | cef861ec4bfe5b66d3cf4436991f80227b5498d5 (diff) | |
download | chrome-ec-d584b1b4e05251774f61b77acf88deac2448af54.tar.gz |
mkbp: handle multiple writes of interrupt
We need to handle the case of multiple tasks trying to set the mkbp
interrupt while the host command task is trying to clear it. The setting
of the interrupt may also take a while and we need to ensure that we
synchronize correct after a longer delay.
BRANCH=none
BUG=b:129159505
TEST=passing CTS sensor run (except test 133 nullptr) with this change
TEST=pass CTS sensor run on eSPI-based system
TEST=pass CTS sensor run on GPIO-based system
Change-Id: I056b72c1210d7525c29a8555f97e6f09d773d12f
Signed-off-by: Jett Rink <jettrink@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1560229
Tested-by: Alexandru M Stan <amstan@chromium.org>
Reviewed-by: Jack Rosenthal <jrosenth@chromium.org>
Diffstat (limited to 'test')
-rw-r--r-- | test/kb_mkbp.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/test/kb_mkbp.c b/test/kb_mkbp.c index 15952e74bb..324b5b3e91 100644 --- a/test/kb_mkbp.c +++ b/test/kb_mkbp.c @@ -101,6 +101,46 @@ int verify_key(int c, int r, int pressed) return 1; } +int verify_key_v2(int c, int r, int pressed, int expect_more) +{ + struct host_cmd_handler_args args; + struct ec_response_get_next_event_v1 event; + int i; + + args.version = 2; + args.command = EC_CMD_GET_NEXT_EVENT; + args.params = NULL; + args.params_size = 0; + args.response = &event; + args.response_max = sizeof(event); + args.response_size = 0; + + if (c >= 0 && r >= 0) { + ccprintf("Verify %s (%d, %d). Expect %smore.\n", + action[pressed], c, r, expect_more ? "" : "no "); + set_state(c, r, pressed); + + if (host_command_process(&args) != EC_RES_SUCCESS) + return 0; + + if (!!(event.event_type & EC_MKBP_HAS_MORE_EVENTS) != + expect_more) { + ccprintf("Incorrect more events!\n"); + return 0; + } + + for (i = 0; i < KEYBOARD_COLS_MAX; ++i) + if (event.data.key_matrix[i] != state[i]) + return 0; + } else { + ccprintf("Verify no events available\n"); + if (host_command_process(&args) != EC_RES_UNAVAILABLE) + return 0; + } + + return 1; +} + int mkbp_config(struct ec_params_mkbp_set_config params) { struct host_cmd_handler_args args; @@ -179,6 +219,24 @@ int single_key_press(void) return EC_SUCCESS; } +int single_key_press_v2(void) +{ + keyboard_clear_buffer(); + clear_state(); + TEST_ASSERT(press_key(0, 0, 1) == EC_SUCCESS); + TEST_ASSERT(FIFO_NOT_EMPTY()); + TEST_ASSERT(press_key(0, 0, 0) == EC_SUCCESS); + TEST_ASSERT(FIFO_NOT_EMPTY()); + + clear_state(); + TEST_ASSERT(verify_key_v2(0, 0, 1, 1)); + TEST_ASSERT(FIFO_NOT_EMPTY()); + TEST_ASSERT(verify_key_v2(0, 0, 0, 0)); + TEST_ASSERT(FIFO_EMPTY()); + + return EC_SUCCESS; +} + int test_fifo_size(void) { keyboard_clear_buffer(); @@ -236,6 +294,7 @@ void run_test(void) /* Clear any pending events such as lid open. */ clear_mkbp_events(); RUN_TEST(single_key_press); + RUN_TEST(single_key_press_v2); RUN_TEST(test_fifo_size); RUN_TEST(test_enable); RUN_TEST(fifo_underrun); |