summaryrefslogtreecommitdiff
path: root/util/ectool.c
diff options
context:
space:
mode:
authorCraig Hesling <hesling@chromium.org>2022-08-09 13:16:20 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-08-12 08:28:18 +0000
commit5bc4ed2c308a9eb77c6908e796fda1caf89d003b (patch)
treea1deb9df775585076d4db705676194fcd3206aa1 /util/ectool.c
parent88d0fee0ab39e835b11f8c04fb5501dfdecbc55f (diff)
downloadchrome-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.c78
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;
}