1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2018 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker *
5*8617a60dSAndroid Build Coastguard Worker * The command line tool to invoke firmware updater.
6*8617a60dSAndroid Build Coastguard Worker */
7*8617a60dSAndroid Build Coastguard Worker
8*8617a60dSAndroid Build Coastguard Worker #include <assert.h>
9*8617a60dSAndroid Build Coastguard Worker #include <stdio.h>
10*8617a60dSAndroid Build Coastguard Worker #include <stdlib.h>
11*8617a60dSAndroid Build Coastguard Worker #include <getopt.h>
12*8617a60dSAndroid Build Coastguard Worker
13*8617a60dSAndroid Build Coastguard Worker #include "futility.h"
14*8617a60dSAndroid Build Coastguard Worker #include "updater.h"
15*8617a60dSAndroid Build Coastguard Worker
16*8617a60dSAndroid Build Coastguard Worker #ifdef USE_FLASHROM
17*8617a60dSAndroid Build Coastguard Worker
18*8617a60dSAndroid Build Coastguard Worker enum {
19*8617a60dSAndroid Build Coastguard Worker OPT_DUMMY = 0x1000,
20*8617a60dSAndroid Build Coastguard Worker OPT_DETECT_MODEL_ONLY,
21*8617a60dSAndroid Build Coastguard Worker OPT_FACTORY,
22*8617a60dSAndroid Build Coastguard Worker OPT_FAST,
23*8617a60dSAndroid Build Coastguard Worker OPT_FORCE,
24*8617a60dSAndroid Build Coastguard Worker OPT_GBB_FLAGS,
25*8617a60dSAndroid Build Coastguard Worker OPT_HOST_ONLY,
26*8617a60dSAndroid Build Coastguard Worker OPT_MANIFEST,
27*8617a60dSAndroid Build Coastguard Worker OPT_MODEL,
28*8617a60dSAndroid Build Coastguard Worker OPT_OUTPUT_DIR,
29*8617a60dSAndroid Build Coastguard Worker OPT_QUIRKS,
30*8617a60dSAndroid Build Coastguard Worker OPT_QUIRKS_LIST,
31*8617a60dSAndroid Build Coastguard Worker OPT_REPACK,
32*8617a60dSAndroid Build Coastguard Worker OPT_SERVO_NORESET,
33*8617a60dSAndroid Build Coastguard Worker OPT_SIGNATURE,
34*8617a60dSAndroid Build Coastguard Worker OPT_SYS_PROPS,
35*8617a60dSAndroid Build Coastguard Worker OPT_UNLOCK_ME,
36*8617a60dSAndroid Build Coastguard Worker OPT_UNPACK,
37*8617a60dSAndroid Build Coastguard Worker OPT_WRITE_PROTECTION,
38*8617a60dSAndroid Build Coastguard Worker };
39*8617a60dSAndroid Build Coastguard Worker
40*8617a60dSAndroid Build Coastguard Worker /* Command line options */
41*8617a60dSAndroid Build Coastguard Worker static struct option const long_opts[] = {
42*8617a60dSAndroid Build Coastguard Worker SHARED_FLASH_ARGS_LONGOPTS
43*8617a60dSAndroid Build Coastguard Worker /* name has_arg *flag val */
44*8617a60dSAndroid Build Coastguard Worker {"help", 0, NULL, 'h'},
45*8617a60dSAndroid Build Coastguard Worker {"debug", 0, NULL, 'd'},
46*8617a60dSAndroid Build Coastguard Worker {"verbose", 0, NULL, 'v'},
47*8617a60dSAndroid Build Coastguard Worker
48*8617a60dSAndroid Build Coastguard Worker {"image", 1, NULL, 'i'},
49*8617a60dSAndroid Build Coastguard Worker {"ec_image", 1, NULL, 'e'},
50*8617a60dSAndroid Build Coastguard Worker {"try", 0, NULL, 't'},
51*8617a60dSAndroid Build Coastguard Worker {"archive", 1, NULL, 'a'},
52*8617a60dSAndroid Build Coastguard Worker {"mode", 1, NULL, 'm'},
53*8617a60dSAndroid Build Coastguard Worker
54*8617a60dSAndroid Build Coastguard Worker {"detect-model-only", 0, NULL, OPT_DETECT_MODEL_ONLY},
55*8617a60dSAndroid Build Coastguard Worker {"factory", 0, NULL, OPT_FACTORY},
56*8617a60dSAndroid Build Coastguard Worker {"fast", 0, NULL, OPT_FAST},
57*8617a60dSAndroid Build Coastguard Worker {"force", 0, NULL, OPT_FORCE},
58*8617a60dSAndroid Build Coastguard Worker {"gbb_flags", 1, NULL, OPT_GBB_FLAGS},
59*8617a60dSAndroid Build Coastguard Worker {"host_only", 0, NULL, OPT_HOST_ONLY},
60*8617a60dSAndroid Build Coastguard Worker {"quirks", 1, NULL, OPT_QUIRKS},
61*8617a60dSAndroid Build Coastguard Worker {"list-quirks", 0, NULL, OPT_QUIRKS_LIST},
62*8617a60dSAndroid Build Coastguard Worker {"manifest", 0, NULL, OPT_MANIFEST},
63*8617a60dSAndroid Build Coastguard Worker {"model", 1, NULL, OPT_MODEL},
64*8617a60dSAndroid Build Coastguard Worker {"output_dir", 1, NULL, OPT_OUTPUT_DIR},
65*8617a60dSAndroid Build Coastguard Worker {"repack", 1, NULL, OPT_REPACK},
66*8617a60dSAndroid Build Coastguard Worker {"signature_id", 1, NULL, OPT_SIGNATURE},
67*8617a60dSAndroid Build Coastguard Worker {"sys_props", 1, NULL, OPT_SYS_PROPS},
68*8617a60dSAndroid Build Coastguard Worker {"unlock_me", 0, NULL, OPT_UNLOCK_ME},
69*8617a60dSAndroid Build Coastguard Worker {"unpack", 1, NULL, OPT_UNPACK},
70*8617a60dSAndroid Build Coastguard Worker {"wp", 1, NULL, OPT_WRITE_PROTECTION},
71*8617a60dSAndroid Build Coastguard Worker
72*8617a60dSAndroid Build Coastguard Worker /* TODO(hungte) Remove following deprecated options. */
73*8617a60dSAndroid Build Coastguard Worker {"noupdate_ec", 0, NULL, OPT_HOST_ONLY},
74*8617a60dSAndroid Build Coastguard Worker {"nocheck_keys", 0, NULL, OPT_FORCE},
75*8617a60dSAndroid Build Coastguard Worker {"update_main", 0, NULL, OPT_DUMMY},
76*8617a60dSAndroid Build Coastguard Worker {"update_ec", 0, NULL, OPT_DUMMY},
77*8617a60dSAndroid Build Coastguard Worker {"check_keys", 0, NULL, OPT_DUMMY},
78*8617a60dSAndroid Build Coastguard Worker
79*8617a60dSAndroid Build Coastguard Worker {NULL, 0, NULL, 0},
80*8617a60dSAndroid Build Coastguard Worker };
81*8617a60dSAndroid Build Coastguard Worker
82*8617a60dSAndroid Build Coastguard Worker static const char *const short_opts =
83*8617a60dSAndroid Build Coastguard Worker "hdvi:e:ta:m:" SHARED_FLASH_ARGS_SHORTOPTS;
84*8617a60dSAndroid Build Coastguard Worker
print_help(int argc,char * argv[])85*8617a60dSAndroid Build Coastguard Worker static void print_help(int argc, char *argv[])
86*8617a60dSAndroid Build Coastguard Worker {
87*8617a60dSAndroid Build Coastguard Worker printf("\n"
88*8617a60dSAndroid Build Coastguard Worker "Usage: " MYNAME " %s [OPTIONS]\n"
89*8617a60dSAndroid Build Coastguard Worker "\n"
90*8617a60dSAndroid Build Coastguard Worker "Updates firmware in one of the following modes (default to recovery):\n"
91*8617a60dSAndroid Build Coastguard Worker " autoupdate:\tUpdate RW[A|B], or recovery if RO changed.\n"
92*8617a60dSAndroid Build Coastguard Worker " recovery: \tUpdate RW[A&B], (RO, RO:GBB[keys] - if RO changed)\n"
93*8617a60dSAndroid Build Coastguard Worker " factory: \tUpdate RW[A&B], RO, RO:GBB[keys,flags]\n"
94*8617a60dSAndroid Build Coastguard Worker "\n"
95*8617a60dSAndroid Build Coastguard Worker "Note: firmware sections with PRESERVE flags like VPD and\n"
96*8617a60dSAndroid Build Coastguard Worker " HWID in GBB are always preserved.\n"
97*8617a60dSAndroid Build Coastguard Worker " GBB flags are preserved in autoupdate and recovery modes.\n"
98*8617a60dSAndroid Build Coastguard Worker "\n"
99*8617a60dSAndroid Build Coastguard Worker "OPTIONS:\n"
100*8617a60dSAndroid Build Coastguard Worker "\n"
101*8617a60dSAndroid Build Coastguard Worker "-i, --image=FILE \tAP (host) firmware image (image.bin)\n"
102*8617a60dSAndroid Build Coastguard Worker "-e, --ec_image=FILE \tEC firmware image (i.e, ec.bin)\n"
103*8617a60dSAndroid Build Coastguard Worker "-t, --try \tTry A/B update on reboot if possible\n"
104*8617a60dSAndroid Build Coastguard Worker "-a, --archive=PATH \tRead resources from archive\n"
105*8617a60dSAndroid Build Coastguard Worker " --unpack=DIR \tExtracts archive to DIR\n"
106*8617a60dSAndroid Build Coastguard Worker " --fast \tReduce read cycles and do not verify\n"
107*8617a60dSAndroid Build Coastguard Worker " --quirks=LIST \tSpecify the quirks to apply\n"
108*8617a60dSAndroid Build Coastguard Worker " --list-quirks \tPrint all available quirks\n"
109*8617a60dSAndroid Build Coastguard Worker "-m, --mode=MODE \tRun updater in the specified mode\n"
110*8617a60dSAndroid Build Coastguard Worker " --manifest \tScan the archive to print a manifest in JSON\n"
111*8617a60dSAndroid Build Coastguard Worker SHARED_FLASH_ARGS_HELP
112*8617a60dSAndroid Build Coastguard Worker "\n"
113*8617a60dSAndroid Build Coastguard Worker " * Option --manifest requires either -a,--archive or -i,--image\n"
114*8617a60dSAndroid Build Coastguard Worker " With -i,--image additional images are accepted with options\n"
115*8617a60dSAndroid Build Coastguard Worker " -e,--ec_image.\n"
116*8617a60dSAndroid Build Coastguard Worker " * If both --manifest and --fast are specified, the updater\n"
117*8617a60dSAndroid Build Coastguard Worker " will not scan the archive and simply dump the previously\n"
118*8617a60dSAndroid Build Coastguard Worker " cached manifest (may be out-dated) from the archive.\n"
119*8617a60dSAndroid Build Coastguard Worker " Works only with -a,--archive option.\n"
120*8617a60dSAndroid Build Coastguard Worker " * Use of -p,--programmer with option other than '%s',\n"
121*8617a60dSAndroid Build Coastguard Worker " or with --ccd effectively disables ability to update EC\n"
122*8617a60dSAndroid Build Coastguard Worker " firmware images.\n"
123*8617a60dSAndroid Build Coastguard Worker " * Emulation works only with the AP (host) firmware image, and\n"
124*8617a60dSAndroid Build Coastguard Worker " does not support the EC firmware image.\n"
125*8617a60dSAndroid Build Coastguard Worker " * Model detection with option --detect-model-only requires\n"
126*8617a60dSAndroid Build Coastguard Worker " archive path -a,--archive\n"
127*8617a60dSAndroid Build Coastguard Worker " * The --quirks provides a set of options to override the\n"
128*8617a60dSAndroid Build Coastguard Worker " default behavior. Run --list-quirks to get the options,\n"
129*8617a60dSAndroid Build Coastguard Worker " and --quirks OPTION to turn on. To disable a quirk that\n"
130*8617a60dSAndroid Build Coastguard Worker " was default turned on from the firmware image CBFS, do\n"
131*8617a60dSAndroid Build Coastguard Worker " --quirks OPTION=0 to turn off.\n"
132*8617a60dSAndroid Build Coastguard Worker "\n"
133*8617a60dSAndroid Build Coastguard Worker "Legacy and compatibility options:\n"
134*8617a60dSAndroid Build Coastguard Worker " --factory \tAlias for --mode=factory\n"
135*8617a60dSAndroid Build Coastguard Worker " --force \tForce update (skip checking contents)\n"
136*8617a60dSAndroid Build Coastguard Worker " --output_dir=DIR\tSpecify the target for --mode=output\n"
137*8617a60dSAndroid Build Coastguard Worker " --unlock_me \t(deprecated) Unlock the Intel ME before flashing\n"
138*8617a60dSAndroid Build Coastguard Worker " --signature_id=S\t(deprecated) Same as --model\n"
139*8617a60dSAndroid Build Coastguard Worker "\n"
140*8617a60dSAndroid Build Coastguard Worker "Debugging and testing options:\n"
141*8617a60dSAndroid Build Coastguard Worker " --wp=1|0 \tSpecify write protection status\n"
142*8617a60dSAndroid Build Coastguard Worker " --host_only \tUpdate only AP (host) firmware\n"
143*8617a60dSAndroid Build Coastguard Worker " --model=MODEL \tOverride system model for images\n"
144*8617a60dSAndroid Build Coastguard Worker " --detect-model-only\tDetect model by reading the FRID and exit\n"
145*8617a60dSAndroid Build Coastguard Worker " --gbb_flags=FLAG\tOverride new GBB flags\n"
146*8617a60dSAndroid Build Coastguard Worker " --sys_props=LIST\tList of system properties to override\n"
147*8617a60dSAndroid Build Coastguard Worker "-d, --debug \tPrint debugging messages\n"
148*8617a60dSAndroid Build Coastguard Worker "-v, --verbose \tPrint verbose messages\n"
149*8617a60dSAndroid Build Coastguard Worker "",
150*8617a60dSAndroid Build Coastguard Worker argv[0], FLASHROM_PROGRAMMER_INTERNAL_AP);
151*8617a60dSAndroid Build Coastguard Worker }
152*8617a60dSAndroid Build Coastguard Worker
do_update(int argc,char * argv[])153*8617a60dSAndroid Build Coastguard Worker static int do_update(int argc, char *argv[])
154*8617a60dSAndroid Build Coastguard Worker {
155*8617a60dSAndroid Build Coastguard Worker struct updater_config_arguments args = {0};
156*8617a60dSAndroid Build Coastguard Worker int i, errorcnt = 0;
157*8617a60dSAndroid Build Coastguard Worker const char *prepare_ctrl_name = NULL;
158*8617a60dSAndroid Build Coastguard Worker char *servo_programmer = NULL;
159*8617a60dSAndroid Build Coastguard Worker char *endptr;
160*8617a60dSAndroid Build Coastguard Worker const char *sig = NULL;
161*8617a60dSAndroid Build Coastguard Worker
162*8617a60dSAndroid Build Coastguard Worker struct updater_config *cfg = updater_new_config();
163*8617a60dSAndroid Build Coastguard Worker assert(cfg);
164*8617a60dSAndroid Build Coastguard Worker
165*8617a60dSAndroid Build Coastguard Worker opterr = 0;
166*8617a60dSAndroid Build Coastguard Worker while ((i = getopt_long(argc, argv, short_opts, long_opts, 0)) != -1) {
167*8617a60dSAndroid Build Coastguard Worker if (handle_flash_argument(&args, i, optarg))
168*8617a60dSAndroid Build Coastguard Worker continue;
169*8617a60dSAndroid Build Coastguard Worker switch (i) {
170*8617a60dSAndroid Build Coastguard Worker case 'h':
171*8617a60dSAndroid Build Coastguard Worker print_help(argc, argv);
172*8617a60dSAndroid Build Coastguard Worker updater_delete_config(cfg);
173*8617a60dSAndroid Build Coastguard Worker return !!errorcnt;
174*8617a60dSAndroid Build Coastguard Worker case 'd':
175*8617a60dSAndroid Build Coastguard Worker debugging_enabled = 1;
176*8617a60dSAndroid Build Coastguard Worker args.verbosity++;
177*8617a60dSAndroid Build Coastguard Worker break;
178*8617a60dSAndroid Build Coastguard Worker case 'v':
179*8617a60dSAndroid Build Coastguard Worker args.verbosity++;
180*8617a60dSAndroid Build Coastguard Worker break;
181*8617a60dSAndroid Build Coastguard Worker case 'i':
182*8617a60dSAndroid Build Coastguard Worker args.image = optarg;
183*8617a60dSAndroid Build Coastguard Worker break;
184*8617a60dSAndroid Build Coastguard Worker case 'e':
185*8617a60dSAndroid Build Coastguard Worker args.ec_image = optarg;
186*8617a60dSAndroid Build Coastguard Worker break;
187*8617a60dSAndroid Build Coastguard Worker case 't':
188*8617a60dSAndroid Build Coastguard Worker args.try_update = 1;
189*8617a60dSAndroid Build Coastguard Worker break;
190*8617a60dSAndroid Build Coastguard Worker case 'a':
191*8617a60dSAndroid Build Coastguard Worker args.archive = optarg;
192*8617a60dSAndroid Build Coastguard Worker break;
193*8617a60dSAndroid Build Coastguard Worker case 'm':
194*8617a60dSAndroid Build Coastguard Worker args.mode = optarg;
195*8617a60dSAndroid Build Coastguard Worker break;
196*8617a60dSAndroid Build Coastguard Worker
197*8617a60dSAndroid Build Coastguard Worker case OPT_REPACK:
198*8617a60dSAndroid Build Coastguard Worker args.repack = optarg;
199*8617a60dSAndroid Build Coastguard Worker ERROR("Sorry, --repack is only for the script.\n");
200*8617a60dSAndroid Build Coastguard Worker errorcnt ++;
201*8617a60dSAndroid Build Coastguard Worker break;
202*8617a60dSAndroid Build Coastguard Worker case OPT_UNPACK:
203*8617a60dSAndroid Build Coastguard Worker args.unpack = optarg;
204*8617a60dSAndroid Build Coastguard Worker break;
205*8617a60dSAndroid Build Coastguard Worker case OPT_UNLOCK_ME:
206*8617a60dSAndroid Build Coastguard Worker WARN("--unlock_me will be deprecated by --quirks unlock_csme.\n");
207*8617a60dSAndroid Build Coastguard Worker args.unlock_me = true;
208*8617a60dSAndroid Build Coastguard Worker break;
209*8617a60dSAndroid Build Coastguard Worker case OPT_QUIRKS:
210*8617a60dSAndroid Build Coastguard Worker args.quirks = optarg;
211*8617a60dSAndroid Build Coastguard Worker break;
212*8617a60dSAndroid Build Coastguard Worker case OPT_QUIRKS_LIST:
213*8617a60dSAndroid Build Coastguard Worker updater_list_config_quirks(cfg);
214*8617a60dSAndroid Build Coastguard Worker updater_delete_config(cfg);
215*8617a60dSAndroid Build Coastguard Worker return 0;
216*8617a60dSAndroid Build Coastguard Worker case OPT_OUTPUT_DIR:
217*8617a60dSAndroid Build Coastguard Worker args.output_dir = optarg;
218*8617a60dSAndroid Build Coastguard Worker break;
219*8617a60dSAndroid Build Coastguard Worker case OPT_MODEL:
220*8617a60dSAndroid Build Coastguard Worker if (sig) {
221*8617a60dSAndroid Build Coastguard Worker WARN("Ignore --model=%s because --signature_id=%s is already specified.\n", optarg, sig);
222*8617a60dSAndroid Build Coastguard Worker } else {
223*8617a60dSAndroid Build Coastguard Worker args.model = optarg;
224*8617a60dSAndroid Build Coastguard Worker }
225*8617a60dSAndroid Build Coastguard Worker break;
226*8617a60dSAndroid Build Coastguard Worker case OPT_SIGNATURE:
227*8617a60dSAndroid Build Coastguard Worker WARN("--signature_id is deprecated by --model. "
228*8617a60dSAndroid Build Coastguard Worker "Please change to `--model=%s` in future.\n",
229*8617a60dSAndroid Build Coastguard Worker optarg);
230*8617a60dSAndroid Build Coastguard Worker sig = optarg;
231*8617a60dSAndroid Build Coastguard Worker args.model = optarg;
232*8617a60dSAndroid Build Coastguard Worker break;
233*8617a60dSAndroid Build Coastguard Worker case OPT_DETECT_MODEL_ONLY:
234*8617a60dSAndroid Build Coastguard Worker args.detect_model_only = true;
235*8617a60dSAndroid Build Coastguard Worker break;
236*8617a60dSAndroid Build Coastguard Worker case OPT_WRITE_PROTECTION:
237*8617a60dSAndroid Build Coastguard Worker args.write_protection = optarg;
238*8617a60dSAndroid Build Coastguard Worker break;
239*8617a60dSAndroid Build Coastguard Worker case OPT_SYS_PROPS:
240*8617a60dSAndroid Build Coastguard Worker args.sys_props = optarg;
241*8617a60dSAndroid Build Coastguard Worker break;
242*8617a60dSAndroid Build Coastguard Worker case OPT_MANIFEST:
243*8617a60dSAndroid Build Coastguard Worker args.do_manifest = 1;
244*8617a60dSAndroid Build Coastguard Worker break;
245*8617a60dSAndroid Build Coastguard Worker case OPT_FACTORY:
246*8617a60dSAndroid Build Coastguard Worker args.is_factory = 1;
247*8617a60dSAndroid Build Coastguard Worker break;
248*8617a60dSAndroid Build Coastguard Worker case OPT_HOST_ONLY:
249*8617a60dSAndroid Build Coastguard Worker args.host_only = 1;
250*8617a60dSAndroid Build Coastguard Worker break;
251*8617a60dSAndroid Build Coastguard Worker case OPT_FORCE:
252*8617a60dSAndroid Build Coastguard Worker args.force_update = 1;
253*8617a60dSAndroid Build Coastguard Worker break;
254*8617a60dSAndroid Build Coastguard Worker case OPT_FAST:
255*8617a60dSAndroid Build Coastguard Worker args.fast_update = 1;
256*8617a60dSAndroid Build Coastguard Worker break;
257*8617a60dSAndroid Build Coastguard Worker case OPT_GBB_FLAGS:
258*8617a60dSAndroid Build Coastguard Worker args.gbb_flags = strtoul(optarg, &endptr, 0);
259*8617a60dSAndroid Build Coastguard Worker if (*endptr) {
260*8617a60dSAndroid Build Coastguard Worker ERROR("Invalid flags: %s\n", optarg);
261*8617a60dSAndroid Build Coastguard Worker errorcnt++;
262*8617a60dSAndroid Build Coastguard Worker } else {
263*8617a60dSAndroid Build Coastguard Worker args.override_gbb_flags = 1;
264*8617a60dSAndroid Build Coastguard Worker }
265*8617a60dSAndroid Build Coastguard Worker break;
266*8617a60dSAndroid Build Coastguard Worker case OPT_DUMMY:
267*8617a60dSAndroid Build Coastguard Worker break;
268*8617a60dSAndroid Build Coastguard Worker
269*8617a60dSAndroid Build Coastguard Worker case '?':
270*8617a60dSAndroid Build Coastguard Worker errorcnt++;
271*8617a60dSAndroid Build Coastguard Worker if (optopt)
272*8617a60dSAndroid Build Coastguard Worker ERROR("Unrecognized option: -%c\n", optopt);
273*8617a60dSAndroid Build Coastguard Worker else if (argv[optind - 1])
274*8617a60dSAndroid Build Coastguard Worker ERROR("Unrecognized option (possibly '%s')\n",
275*8617a60dSAndroid Build Coastguard Worker argv[optind - 1]);
276*8617a60dSAndroid Build Coastguard Worker else
277*8617a60dSAndroid Build Coastguard Worker ERROR("Unrecognized option.\n");
278*8617a60dSAndroid Build Coastguard Worker break;
279*8617a60dSAndroid Build Coastguard Worker default:
280*8617a60dSAndroid Build Coastguard Worker errorcnt++;
281*8617a60dSAndroid Build Coastguard Worker ERROR("Failed parsing options.\n");
282*8617a60dSAndroid Build Coastguard Worker }
283*8617a60dSAndroid Build Coastguard Worker }
284*8617a60dSAndroid Build Coastguard Worker if (optind < argc) {
285*8617a60dSAndroid Build Coastguard Worker errorcnt++;
286*8617a60dSAndroid Build Coastguard Worker ERROR("Unexpected arguments.\n");
287*8617a60dSAndroid Build Coastguard Worker }
288*8617a60dSAndroid Build Coastguard Worker
289*8617a60dSAndroid Build Coastguard Worker if (!errorcnt && args.detect_servo) {
290*8617a60dSAndroid Build Coastguard Worker servo_programmer = host_detect_servo(&prepare_ctrl_name);
291*8617a60dSAndroid Build Coastguard Worker
292*8617a60dSAndroid Build Coastguard Worker if (!servo_programmer)
293*8617a60dSAndroid Build Coastguard Worker errorcnt++;
294*8617a60dSAndroid Build Coastguard Worker else if (!args.programmer)
295*8617a60dSAndroid Build Coastguard Worker args.programmer = servo_programmer;
296*8617a60dSAndroid Build Coastguard Worker }
297*8617a60dSAndroid Build Coastguard Worker /*
298*8617a60dSAndroid Build Coastguard Worker * Some boards may need to fetch firmware before starting to
299*8617a60dSAndroid Build Coastguard Worker * update (i.e., in updater_setup_config) so we want to turn on
300*8617a60dSAndroid Build Coastguard Worker * cpu_fw_spi mode now.
301*8617a60dSAndroid Build Coastguard Worker */
302*8617a60dSAndroid Build Coastguard Worker prepare_servo_control(prepare_ctrl_name, true);
303*8617a60dSAndroid Build Coastguard Worker
304*8617a60dSAndroid Build Coastguard Worker const bool update_needed = updater_should_update(&args);
305*8617a60dSAndroid Build Coastguard Worker if (!errorcnt)
306*8617a60dSAndroid Build Coastguard Worker errorcnt += updater_setup_config(cfg, &args);
307*8617a60dSAndroid Build Coastguard Worker if (!errorcnt && update_needed) {
308*8617a60dSAndroid Build Coastguard Worker int r;
309*8617a60dSAndroid Build Coastguard Worker STATUS("Starting firmware updater.\n");
310*8617a60dSAndroid Build Coastguard Worker r = update_firmware(cfg);
311*8617a60dSAndroid Build Coastguard Worker if (r != UPDATE_ERR_DONE) {
312*8617a60dSAndroid Build Coastguard Worker r = VB2_MIN(r, UPDATE_ERR_UNKNOWN);
313*8617a60dSAndroid Build Coastguard Worker ERROR("%s\n", updater_error_messages[r]);
314*8617a60dSAndroid Build Coastguard Worker errorcnt++;
315*8617a60dSAndroid Build Coastguard Worker }
316*8617a60dSAndroid Build Coastguard Worker /* Use stdout for the final result. */
317*8617a60dSAndroid Build Coastguard Worker printf(">> %s: Firmware updater %s.\n",
318*8617a60dSAndroid Build Coastguard Worker errorcnt ? "FAILED": "DONE",
319*8617a60dSAndroid Build Coastguard Worker errorcnt ? "aborted" : "exits successfully");
320*8617a60dSAndroid Build Coastguard Worker }
321*8617a60dSAndroid Build Coastguard Worker
322*8617a60dSAndroid Build Coastguard Worker prepare_servo_control(prepare_ctrl_name, false);
323*8617a60dSAndroid Build Coastguard Worker free(servo_programmer);
324*8617a60dSAndroid Build Coastguard Worker
325*8617a60dSAndroid Build Coastguard Worker updater_delete_config(cfg);
326*8617a60dSAndroid Build Coastguard Worker return !!errorcnt;
327*8617a60dSAndroid Build Coastguard Worker }
328*8617a60dSAndroid Build Coastguard Worker #define CMD_HELP_STR "Update system firmware"
329*8617a60dSAndroid Build Coastguard Worker
330*8617a60dSAndroid Build Coastguard Worker #else /* USE_FLASHROM */
331*8617a60dSAndroid Build Coastguard Worker
do_update(int argc,char * argv[])332*8617a60dSAndroid Build Coastguard Worker static int do_update(int argc, char *argv[])
333*8617a60dSAndroid Build Coastguard Worker {
334*8617a60dSAndroid Build Coastguard Worker FATAL(MYNAME " was built without flashrom support, `update` command unavailable!\n");
335*8617a60dSAndroid Build Coastguard Worker return -1;
336*8617a60dSAndroid Build Coastguard Worker }
337*8617a60dSAndroid Build Coastguard Worker #define CMD_HELP_STR "Update system firmware (unavailable in this build)"
338*8617a60dSAndroid Build Coastguard Worker
339*8617a60dSAndroid Build Coastguard Worker #endif /* !USE_FLASHROM */
340*8617a60dSAndroid Build Coastguard Worker
341*8617a60dSAndroid Build Coastguard Worker DECLARE_FUTIL_COMMAND(update, do_update, VBOOT_VERSION_ALL, CMD_HELP_STR);
342