diff options
author | Craig Hesling <hesling@chromium.org> | 2022-08-09 13:16:20 -0700 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-08-12 08:28:18 +0000 |
commit | 5bc4ed2c308a9eb77c6908e796fda1caf89d003b (patch) | |
tree | a1deb9df775585076d4db705676194fcd3206aa1 /util/ectool.c | |
parent | 88d0fee0ab39e835b11f8c04fb5501dfdecbc55f (diff) | |
download | chrome-ec-5bc4ed2c308a9eb77c6908e796fda1caf89d003b.tar.gz |
ectool: Use pretty enum names for mkbp and host events
BRANCH=none
BUG=none
TEST=(while true; do ./ectool --name=cros_fp waitevent 1 \
100000; done)&
./ectool --name=cros_fp reboot_ec cold-ap-off
kill %1
# Print out two INTERFACE_READY events (RO and then RW).
> MKBP event 1 data: 00 20 00 00
> Host events: INTERFACE_READY
> MKBP event 1 data: 00 20 00 00
> Host events: INTERFACE_READY
TEST=(while true; do ./ectool --name=cros_fp waitevent HOST_EVENT \
100000; done)&
./ectool --name=cros_fp reboot_ec cold-ap-off
kill %1
# Print out two INTERFACE_READY events (RO and then RW).
TEST=./ectool --name=cros_fp waitevent fingerprint 100000 &
./ectool --name=cros_fp fpmode capture pattern0
# Print out one event.
Change-Id: Iec105cef1f758bd973dc48c9e887f984bb87e5a7
Signed-off-by: Craig Hesling <hesling@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3821373
Reviewed-by: Ting Shen <phoenixshen@chromium.org>
Diffstat (limited to 'util/ectool.c')
-rw-r--r-- | util/ectool.c | 78 |
1 files changed, 76 insertions, 2 deletions
diff --git a/util/ectool.c b/util/ectool.c index 9abe235dfe..c0064efafd 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -3,6 +3,7 @@ * found in the LICENSE file. */ +#include <assert.h> #include <ctype.h> #include <errno.h> #include <getopt.h> @@ -404,6 +405,48 @@ int parse_bool(const char *s, int *dest) } } +/** + * @brief Find the enum value associated the string of enum text or value. + * + * @param str The input string to parse an enum from. + * @param enum_text_map The array that maps enum value (index) to text. + * @param enum_text_map_length The length of the enum_text_map array. + * @param enum_value Output parsed enum value. + * @return int 0 on success, -1 if result cannot be found + */ +static int find_enum_from_text(const char *str, + const char *const enum_text_map[], + long enum_text_map_length, long *enum_value) +{ + char *e; + long value; + + assert(str); + assert(enum_value); + assert(enum_text_map); + assert(enum_text_map_length >= 0); + + if (*str == '\0') + return -1; + + value = strtol(str, &e, 0); + if (!e || !*e) { + *enum_value = value; + return 0; + } + + for (value = 0; value < enum_text_map_length; value++) { + if (!enum_text_map[value]) + continue; + if (strcasecmp(str, enum_text_map[value]) == 0) { + *enum_value = value; + return 0; + } + } + + return -1; +} + void print_help(const char *prog, int print_cmds) { printf("Usage: %s [--dev=n] " @@ -10524,12 +10567,18 @@ err: int cmd_wait_event(int argc, char *argv[]) { + static const char *const mkbp_event_text[] = EC_MKBP_EVENT_TEXT; + static const char *const host_event_text[] = HOST_EVENT_TEXT; + int rv, i; struct ec_response_get_next_event_v1 buffer; long timeout = 5000; long event_type; char *e; + BUILD_ASSERT(ARRAY_SIZE(mkbp_event_text) == EC_MKBP_EVENT_COUNT); + BUILD_ASSERT(ARRAY_SIZE(host_event_text) == 33); /* events start at 1 */ + if (!ec_pollevent) { fprintf(stderr, "Polling for MKBP event not supported\n"); return -EINVAL; @@ -10537,11 +10586,22 @@ int cmd_wait_event(int argc, char *argv[]) if (argc < 2) { fprintf(stderr, "Usage: %s <type> [<timeout>]\n", argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, "type: MKBP event number or name.\n"); + for (int i = 0; i < ARRAY_SIZE(mkbp_event_text); i++) { + const char *name = mkbp_event_text[i]; + + if (name) { + fprintf(stderr, " %s or %d\n", name, i); + } + } + return -1; } - event_type = strtol(argv[1], &e, 0); - if ((e && *e) || event_type < 0 || event_type >= EC_MKBP_EVENT_COUNT) { + rv = find_enum_from_text(argv[1], mkbp_event_text, + ARRAY_SIZE(mkbp_event_text), &event_type); + if (rv < 0 || event_type < 0 || event_type >= EC_MKBP_EVENT_COUNT) { fprintf(stderr, "Bad event type '%s'.\n", argv[1]); return -1; } @@ -10562,6 +10622,20 @@ int cmd_wait_event(int argc, char *argv[]) printf("%02x ", buffer.data.key_matrix[i]); printf("\n"); + switch (event_type) { + case EC_MKBP_EVENT_HOST_EVENT: + printf("Host events:"); + for (int evt = 1; evt <= 32; evt++) { + if (buffer.data.host_event & EC_HOST_EVENT_MASK(evt)) { + const char *name = host_event_text[evt]; + + printf(" %s", name ? name : "UNKNOWN"); + } + } + printf("\n"); + break; + } + return 0; } |