diff options
-rw-r--r-- | futility/cmd_update.c | 24 | ||||
-rw-r--r-- | futility/updater_utils.c | 43 | ||||
-rw-r--r-- | futility/updater_utils.h | 10 |
3 files changed, 62 insertions, 15 deletions
diff --git a/futility/cmd_update.c b/futility/cmd_update.c index e83095fb..db29db20 100644 --- a/futility/cmd_update.c +++ b/futility/cmd_update.c @@ -7,6 +7,7 @@ #include <assert.h> #include <stdio.h> +#include <stdlib.h> #include <getopt.h> #include "futility.h" @@ -29,6 +30,7 @@ enum { OPT_QUIRKS_LIST, OPT_REPACK, OPT_SERVO, + OPT_SERVO_PORT, OPT_SIGNATURE, OPT_SYS_PROPS, OPT_UNPACK, @@ -51,6 +53,7 @@ static struct option const long_opts[] = { {"ccd", 0, NULL, OPT_CCD}, {"servo", 0, NULL, OPT_SERVO}, + {"servo_port", 1, NULL, OPT_SERVO_PORT}, {"emulate", 1, NULL, OPT_EMULATE}, {"factory", 0, NULL, OPT_FACTORY}, {"fast", 0, NULL, OPT_FAST}, @@ -113,6 +116,7 @@ static void print_help(int argc, char *argv[]) " --model=MODEL \tOverride system model for images\n" " --ccd \tDo fast,force,wp=0,p=raiden_debug_spi\n" " --servo \tFlash using Servo (v2, v4, micro, ...)\n" + " --servo_port=PRT\tOverride servod port, implies --servo\n" " --signature_id=S\tOverride signature ID for key files\n" " --sys_props=LIST\tList of system properties to override\n" "-d, --debug \tPrint debugging messages\n" @@ -127,6 +131,7 @@ static int do_update(int argc, char *argv[]) struct updater_config_arguments args = {0}; int i, errorcnt = 0, do_update = 1; int detect_servo = 0, do_servo_cpu_fw_spi = 0; + char *servo_programmer = NULL; cfg = updater_new_config(); assert(cfg); @@ -226,6 +231,14 @@ static int do_update(int argc, char *argv[]) args.host_only = 1; detect_servo = 1; break; + case OPT_SERVO_PORT: + setenv(ENV_SERVOD_PORT, optarg, 1); + args.fast_update = 1; + args.force_update = 1; + args.write_protection = "0"; + args.host_only = 1; + detect_servo = 1; + break; case OPT_DUMMY: break; @@ -250,9 +263,13 @@ static int do_update(int argc, char *argv[]) ERROR("Unexpected arguments.\n"); } - if (!errorcnt && detect_servo) - errorcnt += host_detect_servo(&args.programmer, - &do_servo_cpu_fw_spi); + if (!errorcnt && detect_servo) { + servo_programmer = host_detect_servo(&do_servo_cpu_fw_spi); + if (!servo_programmer) + errorcnt++; + else if (!args.programmer) + args.programmer = servo_programmer; + } /* * Some boards may need to fetch firmware before starting to * update (i.e., in updater_setup_config) so we want to turn on @@ -280,6 +297,7 @@ static int do_update(int argc, char *argv[]) if (do_servo_cpu_fw_spi) free(host_shell("dut-control cpu_fw_spi:off")); + free(servo_programmer); updater_delete_config(cfg); return !!errorcnt; 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; diff --git a/futility/updater_utils.h b/futility/updater_utils.h index eb8f62b4..25316757 100644 --- a/futility/updater_utils.h +++ b/futility/updater_utils.h @@ -177,12 +177,14 @@ enum wp_state { /* Helper function to return write protection status via given programmer. */ enum wp_state host_get_wp(const char *programmer); +/* The environment variable name for setting servod port. */ +#define ENV_SERVOD_PORT "SERVOD_PORT" + /* - * 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); /* * Returns 1 if a given file (cbfs_entry_name) exists inside a particular CBFS |