diff options
author | Vadim Bendebury <vbendeb@chromium.org> | 2017-07-06 18:32:41 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-07-10 11:22:36 -0700 |
commit | f50e0086e61aed2b722bd37c188e7e2204735f32 (patch) | |
tree | 5005432302c45a4c1c6f821f5e4daa24857ef145 /extra | |
parent | 5e6f9a2b3836102c784f66b1afa85248fd2ba06e (diff) | |
download | chrome-ec-f50e0086e61aed2b722bd37c188e7e2204735f32.tar.gz |
usb_updater: display board ID information from RW headers
This patch adds code to interpret the contents of the Cr50 image's RW
headers board ID fields.
Board ID fields are added to the RW and RW_B version strings, as a
three field colon separated value.
The actual board ID is likely to be a 4 symbol ASCII string, if it
is, the 4 ASCII characters are displayed. If it is not - the 8
character hex value is printed. The rest of the fields are displayed
as 8 characters hex values.
BRANCH=none
BUG=b:62294740
TEST=tried the new option on various Cr50 images:
$ ./extra/usb_updater/usb_updater -b build/cr50/ec.bin
read 524288(0x80000) bytes from build/cr50/ec.bin
RO_A:4919.0.0 RW_A:0.0.21[00000000:00000000:00000000] ...
$ ./extra/usb_updater/usb_updater -b cr50.bin.dev
read 524288(0x80000) bytes from cr50.bin.dev
RO_A:0.0.10 RW_A:0.0.21[XXXR:00000004:00000001]...
Change-Id: I5a92a600d24e4a7d6d615f256b5979414e883d77
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/562919
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'extra')
-rw-r--r-- | extra/usb_updater/usb_updater.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/extra/usb_updater/usb_updater.c b/extra/usb_updater/usb_updater.c index fa4f5e383f..48d45d08fb 100644 --- a/extra/usb_updater/usb_updater.c +++ b/extra/usb_updater/usb_updater.c @@ -5,6 +5,7 @@ */ #include <asm/byteorder.h> +#include <ctype.h> #include <endian.h> #include <fcntl.h> #include <getopt.h> @@ -1232,11 +1233,45 @@ static int show_headers_versions(const void *image) for (i = 0; i < ARRAY_SIZE(sections); i++) { const struct SignedHeader *h; + size_t j; + uint32_t bid; + uint32_t bid_mask; + uint32_t bid_flags; h = (const struct SignedHeader *)((uintptr_t)image + sections[i].offset); printf("%s%s:%d.%d.%d", i ? " " : "", sections[i].name, h->epoch_, h->major_, h->minor_); + + if (sections[i].name[1] != 'W') + continue; + + /* + * For read/write sections print the board ID fields' + * contents, which are stored XORed with a padding value. + */ + bid = h->board_id_type ^ SIGNED_HEADER_PADDING; + bid_mask = h->board_id_type_mask ^ SIGNED_HEADER_PADDING; + bid_flags = h->board_id_flags ^ SIGNED_HEADER_PADDING; + + /* Beginning of a board ID section of the string. */ + printf("["); + + /* + * If board ID is an ASCII string (as it ought to be), print + * it as 4 symbols, otherwise print it as an 8 digit hex. + */ + for (j = 0; j < sizeof(bid); j++) + if (!isalnum(((const char *)&bid)[j])) + break; + + if (j == sizeof(bid)) + printf("%.4s", (const char *)&bid); + else + printf("%08x", bid); + + /* Print the rest of the board ID fields. */ + printf(":%08x:%08x]", bid_mask, bid_flags); } printf("\n"); |