summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJett Rink <jettrink@chromium.org>2019-04-09 13:25:57 -0600
committerchrome-bot <chrome-bot@chromium.org>2019-04-18 19:51:59 -0700
commitd584b1b4e05251774f61b77acf88deac2448af54 (patch)
tree9220e02f92a0d93ea3d21e94ec1c168c41b531c8 /test
parentcef861ec4bfe5b66d3cf4436991f80227b5498d5 (diff)
downloadchrome-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.c59
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);