diff options
author | Vincent Palatin <vpalatin@chromium.org> | 2017-11-24 16:45:34 +0100 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-01-23 05:25:08 -0800 |
commit | b16f759652f074ee597fc4db8c403a46eab32c50 (patch) | |
tree | 7588cc544e3f88b471100d16cc2bbd1133c66a8a /util/ectool.c | |
parent | 96a7e9fe8120e81a40fe7fe208d17cff80f1a4b9 (diff) | |
download | chrome-ec-b16f759652f074ee597fc4db8c403a46eab32c50.tar.gz |
ectool: use poll interface
Test polling for MKBP events through the kernel cros_ec/pd/fp/.. driver
node.
Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
BRANCH=none
BUG=b:69460856
TEST=run on Eve EVT:
ectool --name=cros_fp fpmode fingerdown && \
ectool --name=cros_fp waitevent 5 10000
Change-Id: Ibdec137a3b646cf017a29afcf24ff5bbfb731198
Reviewed-on: https://chromium-review.googlesource.com/806167
Commit-Ready: Vincent Palatin <vpalatin@chromium.org>
Tested-by: Vincent Palatin <vpalatin@chromium.org>
Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'util/ectool.c')
-rw-r--r-- | util/ectool.c | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/util/ectool.c b/util/ectool.c index 3cb86daf22..c0aa05e06c 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -258,6 +258,8 @@ const char help_str[] = " Get USB PD power information\n" " version\n" " Prints EC version\n" + " waitevent <type> [<timeout>]\n" + " Wait for the MKBP event of type and display it\n" " wireless <flags> [<mask> [<suspend_flags> <suspend_mask>]]\n" " Enable/disable WLAN/Bluetooth radio\n" ""; @@ -1264,7 +1266,7 @@ int cmd_fp_mode(int argc, char *argv[]) if (r.mode & FP_MODE_CAPTURE) printf("capture "); printf("\n"); - return rv; + return 0; } int cmd_fp_info(int argc, char *argv[]) @@ -7592,6 +7594,55 @@ err: return rv < 0; } +int cmd_wait_event(int argc, char *argv[]) +{ + int rv, i; + struct ec_response_get_next_event buffer; + long timeout = 5000; + long event_type; + char *e; + + if (!ec_pollevent) { + fprintf(stderr, "Polling for MKBP event not supported\n"); + return -EINVAL; + } + + if (argc < 2) { + fprintf(stderr, "Usage: %s <type> [<timeout>]\n", + argv[0]); + return -1; + } + + event_type = strtol(argv[1], &e, 0); + if ((e && *e) || event_type < 0 || event_type >= EC_MKBP_EVENT_COUNT) { + fprintf(stderr, "Bad event type '%s'.\n", argv[1]); + return -1; + } + if (argc >= 3) { + timeout = strtol(argv[2], &e, 0); + if (e && *e) { + fprintf(stderr, "Bad timeout value '%s'.\n", argv[2]); + return -1; + } + } + + rv = ec_pollevent(1 << event_type, &buffer, sizeof(buffer), timeout); + if (rv == 0) { + fprintf(stderr, "Timeout waitout for MKBP event\n"); + return -ETIMEDOUT; + } else if (rv < 0) { + perror("Error polling for MKBP event\n"); + return -EIO; + } + + printf("MKBP event %d data: ", buffer.event_type); + for (i = 0; i < rv - 1; ++i) + printf("%02x ", buffer.data.key_matrix[i]); + printf("\n"); + + return 0; +} + /* NULL-terminated list of commands */ const struct command commands[] = { {"autofanctrl", cmd_thermal_auto_fan_ctrl}, @@ -7701,6 +7752,7 @@ const struct command commands[] = { {"usbpdmuxinfo", cmd_usb_pd_mux_info}, {"usbpdpower", cmd_usb_pd_power}, {"version", cmd_version}, + {"waitevent", cmd_wait_event}, {"wireless", cmd_wireless}, {NULL, NULL} }; |