summaryrefslogtreecommitdiff
path: root/futility/cmd_update.c
diff options
context:
space:
mode:
Diffstat (limited to 'futility/cmd_update.c')
-rw-r--r--futility/cmd_update.c186
1 files changed, 186 insertions, 0 deletions
diff --git a/futility/cmd_update.c b/futility/cmd_update.c
new file mode 100644
index 00000000..ef9e3813
--- /dev/null
+++ b/futility/cmd_update.c
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2018 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * The command line tool to invoke firmware updater.
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <getopt.h>
+
+#include "futility.h"
+#include "updater.h"
+#include "utility.h"
+
+
+/* Command line options */
+static struct option const long_opts[] = {
+ /* name has_arg *flag val */
+ {"image", 1, NULL, 'i'},
+ {"ec_image", 1, NULL, 'e'},
+ {"pd_image", 1, NULL, 'P'},
+ {"try", 0, NULL, 't'},
+ {"quirks", 1, NULL, 'f'},
+ {"list-quirks", 0, NULL, 'L'},
+ {"mode", 1, NULL, 'm'},
+ {"factory", 0, NULL, 'Y'},
+ {"force", 0, NULL, 'F'},
+ {"programmer", 1, NULL, 'p'},
+ {"wp", 1, NULL, 'W'},
+ {"emulate", 1, NULL, 'E'},
+ {"sys_props", 1, NULL, 'S'},
+ {"debug", 0, NULL, 'd'},
+ {"verbose", 0, NULL, 'v'},
+ {"help", 0, NULL, 'h'},
+ {NULL, 0, NULL, 0},
+};
+
+static const char * const short_opts = "hi:e:tm:p:dv";
+
+static void print_help(int argc, char *argv[])
+{
+ printf("\n"
+ "Usage: " MYNAME " %s [OPTIONS]\n"
+ "\n"
+ "-i, --image=FILE \tAP (host) firmware image (image.bin)\n"
+ "-e, --ec_image=FILE \tEC firmware image (i.e, ec.bin)\n"
+ " --pd_image=FILE \tPD firmware image (i.e, pd.bin)\n"
+ "-t, --try \tTry A/B update on reboot if possible\n"
+ "-p, --programmer=PRG\tChange AP (host) flashrom programmer\n"
+ " --quirks=LIST \tSpecify the quirks to apply\n"
+ " --list-quirks \tPrint all available quirks\n"
+ "\n"
+ "Legacy and compatibility options:\n"
+ "-m, --mode=MODE \tRun updater in given mode\n"
+ " --factory \tAlias for --mode=factory\n"
+ " --force \tForce update (skip checking contents)\n"
+ "\n"
+ "Debugging and testing options:\n"
+ " --wp=1|0 \tSpecify write protection status\n"
+ " --emulate=FILE \tEmulate system firmware using file\n"
+ " --sys_props=LIST\tList of system properties to override\n"
+ "-d, --debug \tPrint debugging messages\n"
+ "-v, --verbose \tPrint verbose messages\n"
+ "",
+ argv[0]);
+}
+
+static int do_update(int argc, char *argv[])
+{
+ const char *opt_image = NULL,
+ *opt_ec_image = NULL,
+ *opt_pd_image = NULL,
+ *opt_quirks = NULL,
+ *opt_mode = NULL,
+ *opt_programmer = NULL,
+ *opt_emulation = NULL,
+ *opt_sys_props = NULL,
+ *opt_write_protection = NULL;
+ int opt_is_factory = 0, opt_try_update = 0, opt_force_update = 0;
+ int i, errorcnt = 0;
+ struct updater_config *cfg;
+
+ printf(">> Firmware updater started.\n");
+ cfg = updater_new_config();
+ assert(cfg);
+
+ opterr = 0;
+ while ((i = getopt_long(argc, argv, short_opts, long_opts, 0)) != -1) {
+ switch (i) {
+ case 'i':
+ opt_image = optarg;
+ break;
+ case 'e':
+ opt_ec_image = optarg;
+ break;
+ case 'P':
+ opt_pd_image = optarg;
+ break;
+ case 't':
+ opt_try_update = 1;
+ break;
+ case 'f':
+ opt_quirks = optarg;
+ break;
+ case 'L':
+ updater_list_config_quirks(cfg);
+ return 0;
+ case 'm':
+ opt_mode = optarg;
+ break;
+ case 'Y':
+ opt_is_factory = 1;
+ break;
+ case 'W':
+ opt_write_protection = optarg;
+ break;
+ case 'E':
+ opt_emulation = optarg;
+ break;
+ case 'p':
+ opt_programmer = optarg;
+ break;
+ case 'F':
+ opt_force_update = 1;
+ break;
+ case 'S':
+ opt_sys_props = optarg;
+ break;
+ case 'v':
+ /* TODO(hungte) Change to better verbosity control. */
+ debugging_enabled = 1;
+ break;
+ case 'd':
+ debugging_enabled = 1;
+ break;
+
+ case 'h':
+ print_help(argc, argv);
+ return !!errorcnt;
+ case '?':
+ errorcnt++;
+ if (optopt)
+ Error("Unrecognized option: -%c\n", optopt);
+ else if (argv[optind - 1])
+ Error("Unrecognized option (possibly '%s')\n",
+ argv[optind - 1]);
+ else
+ Error("Unrecognized option.\n");
+ break;
+ default:
+ errorcnt++;
+ Error("Failed parsing options.\n");
+ }
+ }
+ if (optind < argc) {
+ errorcnt++;
+ Error("Unexpected arguments.\n");
+ }
+ if (!errorcnt)
+ errorcnt += updater_setup_config(
+ cfg, opt_image, opt_ec_image, opt_pd_image,
+ opt_quirks, opt_mode, opt_programmer,
+ opt_emulation, opt_sys_props,
+ opt_write_protection, opt_is_factory,
+ opt_try_update, opt_force_update);
+ if (!errorcnt) {
+ int r = update_firmware(cfg);
+ if (r != UPDATE_ERR_DONE) {
+ r = Min(r, UPDATE_ERR_UNKNOWN);
+ Error("%s\n", updater_error_messages[r]);
+ errorcnt++;
+ }
+ }
+ printf(">> %s: Firmware updater %s.\n",
+ errorcnt ? "FAILED": "DONE",
+ errorcnt ? "stopped due to error" : "exited successfully");
+
+ updater_delete_config(cfg);
+ remove_all_temp_files(); /* TODO(hungte) Move this to updater */
+ return !!errorcnt;
+}
+
+DECLARE_FUTIL_COMMAND(update, do_update, VBOOT_VERSION_ALL,
+ "Update system firmware");