summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2017-06-08 13:54:42 -0700
committerVadim Bendebury <vbendeb@chromium.org>2017-06-23 21:32:35 +0000
commit976c99634430026b6d6f38ee89aba01545ce1b14 (patch)
tree756c34fc64b39a1a3ccaba132dc48dcc407eb322
parenta2e2a6a9da6ad2144b009ee0253c0bfca62982be (diff)
downloadchrome-ec-976c99634430026b6d6f38ee89aba01545ce1b14.tar.gz
usb_updater: allow symbolic Board IDs
When specifying board ID to program, it is convenient to be able to specify the ID as a string, as reported by the RLZ stored in the VPD. With this patch the first component of the board_id command line option is considered a string if it is no longer than 4 bytes. BRANCH=cr50 BUG=b:35587387,b:35587053 TEST=ran the following commands (interleaved with erasing INFO1 on the target): localhost ~ # usb_updater -s -i Board ID space: ffffffff:ffffffff:ffffffff localhost ~ # usb_updater -s -i ABCD localhost ~ # usb_updater -s -i Board ID space: 41424344:bebdbcbb:0000ff00 localhost ~ # usb_updater -s -i Board ID space: ffffffff:ffffffff:ffffffff localhost ~ # usb_updater -s -i 0x41424344:0x1234 localhost ~ # usb_updater -s -i Board ID space: 41424344:bebdbcbb:00001234 localhost ~ # usb_updater -s -i Board ID space: ffffffff:ffffffff:ffffffff localhost ~ # usb_updater -s -i ABCD:0x1234 localhost ~ # usb_updater -s -i Board ID space: 41424344:bebdbcbb:00001234 Change-Id: Ied8b240d60ea50f6fc8633f919ce4bc81ac17727 Signed-off-by: Vadim Bendebury <vbendeb@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/528440 Reviewed-by: Randall Spangler <rspangler@chromium.org> (cherry picked from commit bdbb45b14acf4af6acef045272c845204adc77e3) Reviewed-on: https://chromium-review.googlesource.com/547043
-rw-r--r--extra/usb_updater/usb_updater.c51
1 files changed, 41 insertions, 10 deletions
diff --git a/extra/usb_updater/usb_updater.c b/extra/usb_updater/usb_updater.c
index 1758bfab28..fa4f5e383f 100644
--- a/extra/usb_updater/usb_updater.c
+++ b/extra/usb_updater/usb_updater.c
@@ -366,7 +366,9 @@ static void usage(int errs)
" -f,--fwver Report running firmware versions.\n"
" -h,--help Show this message\n"
" -i,--board_id [ID[:FLAGS]]\n"
- " Get or set Info1 board ID fields\n"
+ " Get or set Info1 board ID fields.\n"
+ " ID could be 32 bit hex or 4 "
+ "character string.\n"
" -p,--post_reset Request post reset after transfer\n"
" -s,--systemdev Use /dev/tpm0 (-d is ignored)\n"
" -u,--upstart "
@@ -1263,27 +1265,56 @@ static int parse_bid(const char *opt,
enum board_id_action *bid_action)
{
char *e;
+ const char *param2;
+ size_t param1_length;
if (!opt) {
*bid_action = bid_get;
return 1;
}
- bid->type = (uint32_t)strtoul(opt, &e, 0);
+ /* Set it here to make bailing out easier later. */
+ bid->flags = DEFAULT_BOARD_ID_FLAG;
+
*bid_action = bid_set; /* Ignored by caller on errors. */
- if (!e || !*e) {
- bid->flags = DEFAULT_BOARD_ID_FLAG;
- return 1;
+ /*
+ * Pointer to the optional second component of the command line
+ * parameter, when present - separated by a colon.
+ */
+ param2 = strchr(opt, ':');
+ if (param2) {
+ param1_length = param2 - opt;
+ param2++;
+ if (!*param2)
+ return 0; /* Empty second parameter. */
+ } else {
+ param1_length = strlen(opt);
+ }
+
+ if (!param1_length)
+ return 0; /* Colon is the first character of the string? */
+
+ if (param1_length <= 4) {
+ unsigned i;
+
+ /* Input must be a symbolic board name. */
+ bid->type = 0;
+ for (i = 0; i < param1_length; i++)
+ bid->type = (bid->type << 8) | opt[i];
+ } else {
+ bid->type = (uint32_t)strtoul(opt, &e, 0);
+ if ((param2 && (*e != ':')) || (!param2 && *e))
+ return 0;
}
- if (*e == ':') {
- bid->flags = (uint32_t)strtoul(e + 1, &e, 0);
- if (!e || !*e)
- return 1;
+ if (param2) {
+ bid->flags = (uint32_t)strtoul(param2, &e, 0);
+ if (*e)
+ return 0;
}
- return 0;
+ return 1;
}
static void process_bid(struct transfer_descriptor *td,