diff options
author | Hung-Te Lin <hungte@chromium.org> | 2020-06-03 22:59:02 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-06-06 02:14:55 +0000 |
commit | 8467bb3d6ded247b16fc52f7e0d60636a4e16933 (patch) | |
tree | 5625a4464cef056f10f682aa80ceaac40ae97a87 /futility/updater_utils.c | |
parent | 08c2ee1bc9ed96f6f124b428b6027cad9a508937 (diff) | |
download | vboot-8467bb3d6ded247b16fc52f7e0d60636a4e16933.tar.gz |
futility: updater: Add '--servo_port' to select from multiple servods
When multiple servo boards are connected to the host, we usually want to
select the right servo by specifying its port, get the servo serial
number, and pass that to flashrom programmer.
The new --servo_port (or environment variable SERVOD_PORT) now allows
developers to flash firmware via specific servod using futility updater
easily:
futility update --servo_port 9998 -i PATH_TO/image.bin
BRANCH=None
BUG=None
TEST=make runtest; sudo futility update --servo_port 9998 -i image.bin
Change-Id: Ic302f841abf745801995ff233fc209726ed039c8
Signed-off-by: Hung-Te Lin <hungte@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2228258
Reviewed-by: Yu-Ping Wu <yupingso@chromium.org>
Reviewed-by: Joel Kitching <kitching@chromium.org>
Commit-Queue: Douglas Anderson <dianders@chromium.org>
Diffstat (limited to 'futility/updater_utils.c')
-rw-r--r-- | futility/updater_utils.c | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/futility/updater_utils.c b/futility/updater_utils.c index 75f5c0f2..6e2d358d 100644 --- a/futility/updater_utils.c +++ b/futility/updater_utils.c @@ -451,20 +451,37 @@ static int host_get_platform_version(void) } /* - * Helper function to detect type of Servo board attached to host, - * and store the right programmer / prepare settings to arguments. - * Returns 0 if success, non-zero if error. + * Helper function to detect type of Servo board attached to host. + * Returns a string as programmer parameter on success, otherwise NULL. */ -int host_detect_servo(const char **programmer_ptr, int *need_prepare_ptr) +char *host_detect_servo(int *need_prepare_ptr) { - int ret = 0; + const char *servo_port = getenv(ENV_SERVOD_PORT); char *servo_type = host_shell("dut-control -o servo_type 2>/dev/null"); const char *programmer = NULL; + char *ret = NULL; int need_prepare = 0; /* To prepare by dut-control cpu_fw_spi:on */ + char *servo_serial = NULL; + + /* Get serial name if servo port is provided. */ + if (servo_port && *servo_port) { + const char *cmd = "dut-control -o serialname 2>/dev/null"; + + VB2_DEBUG("Select servod using port: %s\n", servo_port); + if (strstr(servo_type, "with_servo_micro")) + cmd = ("dut-control -o servo_micro_serialname" + " 2>/dev/null"); + else if (strstr(servo_type, "with_ccd")) + cmd = "dut-control -o ccd_serialname 2>/dev/null"; + + servo_serial = host_shell(cmd); + VB2_DEBUG("Servo SN=%s (serial cmd: %s)\n", servo_serial, cmd); + } if (!*servo_type) { ERROR("Failed to get servo type. Check servod.\n"); - ret = 1; + } else if (servo_serial && !*servo_serial) { + ERROR("Failed to get serial at servo port %s.\n", servo_port); } else if (strstr(servo_type, "servo_micro")) { VB2_DEBUG("Selected Servo Micro.\n"); programmer = "raiden_debug_spi"; @@ -478,9 +495,19 @@ int host_detect_servo(const char **programmer_ptr, int *need_prepare_ptr) need_prepare = 1; } + if (programmer) { + if (!servo_serial) { + ret = strdup(programmer); + } else { + const char prefix = strchr(programmer, ':') ? ',' : ':'; + ASPRINTF(&ret, "%s%cserial=%s", programmer, prefix, + servo_serial); + } + VB2_DEBUG("Servo programmer: %s\n", ret); + } + free(servo_type); - if (programmer && !*programmer_ptr) - *programmer_ptr = programmer; + free(servo_serial); *need_prepare_ptr = need_prepare; return ret; |