From e5e676f641dec32ddf4b32d1b8f4f9636e31ff2a Mon Sep 17 00:00:00 2001 From: pandeyan Date: Fri, 31 Jan 2020 12:03:17 +0530 Subject: Button: add ectool command to simulate button press Added a new ectool command 'ectool button' for simulating volume up and volume down button operations along with the duration in milli-seconds for which button needs to be pressed. BUG=b:149659987 BRANCH=None TEST=Tested on hatch board. From Kernel console, entered the below commands: $ectool button vup 500 Observed volume UP key press on EC console. Change-Id: I6fcdf80ea45b80403f72af89ce99214226731d0f Signed-off-by: pandeyan Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2059929 Reviewed-by: Jett Rink --- util/ectool.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'util') diff --git a/util/ectool.c b/util/ectool.c index c521f94900..c04fddb4c6 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -80,6 +80,8 @@ const char help_str[] = " Read or write board-specific battery parameter\n" " boardversion\n" " Prints the board version\n" + " button [vup|vdown|rec] \n" + " Simulates button press.\n" " cbi\n" " Get/Set Cros Board Info\n" " chargecurrentlimit\n" @@ -1106,6 +1108,58 @@ int cmd_reboot_ap_on_g3(int argc, char *argv[]) return (rv < 0 ? rv : 0); } +int cmd_button(int argc, char *argv[]) +{ + struct ec_params_button p; + char *e; + int argv_idx; + int button = KEYBOARD_BUTTON_COUNT; + int rv; + + if (argc < 2) { + fprintf(stderr, "Invalid num param %d.\n", argc); + return -1; + } + + p.press_ms = 50; + p.btn_mask = 0; + + for (argv_idx = 1; argv_idx < argc; argv_idx++) { + if (!strcasecmp(argv[argv_idx], "vup")) + button = KEYBOARD_BUTTON_VOLUME_UP; + else if (!strcasecmp(argv[argv_idx], "vdown")) + button = KEYBOARD_BUTTON_VOLUME_DOWN; + else if (!strcasecmp(argv[argv_idx], "rec")) + button = KEYBOARD_BUTTON_RECOVERY; + else { + /* If last parameter check if it is an integer. */ + if (argv_idx == argc - 1) { + p.press_ms = strtol(argv[argv_idx], &e, 0); + /* If integer, break out of the loop. */ + if (!*e) + break; + } + button = KEYBOARD_BUTTON_COUNT; + } + + if (button == KEYBOARD_BUTTON_COUNT) { + fprintf(stderr, "Invalid button input.\n"); + return -1; + } + + p.btn_mask |= (1 << button); + } + if (!p.btn_mask) + return 0; + + rv = ec_command(EC_CMD_BUTTON, 0, &p, sizeof(p), NULL, 0); + if (rv < 0) + return rv; + + printf("Button(s) %d set to %d ms\n", p.btn_mask, p.press_ms); + return 0; +} + int cmd_flash_info(int argc, char *argv[]) { struct ec_response_flash_info_1 r; @@ -9428,6 +9482,7 @@ const struct command commands[] = { {"batterycutoff", cmd_battery_cut_off}, {"batteryparam", cmd_battery_vendor_param}, {"boardversion", cmd_board_version}, + {"button", cmd_button}, {"cbi", cmd_cbi}, {"chargecurrentlimit", cmd_charge_current_limit}, {"chargecontrol", cmd_charge_control}, -- cgit v1.2.1