summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYves Arrouye <drcrash@google.com>2019-03-10 23:13:29 -0700
committerCommit Bot <commit-bot@chromium.org>2021-01-19 09:12:33 +0000
commite9e88fa711f80d275b124dfd40c401e26bb49aa3 (patch)
tree91437dd631d2b2c24c0eeee76446bfbc108b64c5
parentba51e4125f6e13155322275bc5c0f7120bf33e84 (diff)
downloadchrome-ec-factory-11164.135.B.tar.gz
Make the argument to --sn_bits a 96-bits hex stringfactory-11164.135.B
This makes the argument simpler to understand and produce. BUG=chromium:940327 TEST=manual on a device Change-Id: I9226116f52011dab1967196e1c236dd36b11e4c4 Signed-off-by: Yves Arrouye <drcrash@google.com> Reviewed-on: https://chromium-review.googlesource.com/1514215 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: Yves Arrouye <drcrash@chromium.org> Reviewed-by: Andrey Pronin <apronin@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2459704 Reviewed-by: Stimim Chen <stimim@chromium.org> Commit-Queue: Stimim Chen <stimim@chromium.org> Tested-by: Stimim Chen <stimim@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2634894 Reviewed-by: Cheng-Han Yang <chenghan@chromium.org> Tested-by: Cheng-Han Yang <chenghan@chromium.org> Commit-Queue: Cheng-Han Yang <chenghan@chromium.org>
-rw-r--r--extra/usb_updater/gsctool.c63
1 files changed, 41 insertions, 22 deletions
diff --git a/extra/usb_updater/gsctool.c b/extra/usb_updater/gsctool.c
index 045a0bee66..8821e5a2bb 100644
--- a/extra/usb_updater/gsctool.c
+++ b/extra/usb_updater/gsctool.c
@@ -205,6 +205,11 @@ struct upgrade_pkt {
#define MAX_BOARD_ID_LENGTH 9
/*
+ * Length, in bytes, of the SN Bits serial number bits.
+ */
+#define SN_BITS_SIZE (96 >> 3)
+
+/*
* Max. length of FW version in the format of <epoch>.<major>.<minor>
* (3 uint32_t string representation + 2 separators + NULL terminator).
*/
@@ -544,9 +549,9 @@ static void usage(int errs)
" Get or set Info1 board ID fields\n"
" ID could be 32 bit hex or 4 "
"character string.\n"
- " -S,--sn_bits SN_1:SN_2:SN_3\n"
+ " -S,--sn_bits SN_BITS\n"
" Set Info1 SN bits fields.\n"
- " SN_n should be 32 bit hex.\n"
+ " SN_BITS should be 96 bit hex.\n"
" -R,--sn_rma_inc RMA_INC\n"
" Increment SN RMA count by RMA_INC.\n"
" RMA_INC should be 0-7.\n"
@@ -1547,22 +1552,41 @@ static int parse_bid(const char *opt,
return 1;
}
-static int parse_sn_bits(const char *opt, uint32_t *sn_bits)
-{
- const char *s;
- char *e;
- int i = 0;
+/*
+ * Reads a two-character hexadecimal byte from a string. If the string is
+ * ill-formed, returns 0. Otherwise, |byte| contains the byte value and the
+ * return value is non-zero.
+ */
+static int read_hex_byte(const char* s, uint8_t* byte) {
+ uint8_t b = 0;
+ for (const char* end = s + 2; s < end; ++s) {
+ if (*s >= '0' && *s <= '9')
+ b = b * 16 + *s - '0';
+ else if (*s >= 'A' && *s <= 'F')
+ b = b * 16 + 10 + *s - 'A';
+ else if (*s >= 'a' && *s <= 'f')
+ b = b * 16 + 10 + *s - 'a';
+ else
+ return 0;
+ }
+ *byte = b;
+ return 1;
+}
- s = opt;
- sn_bits[i] = (uint32_t)strtoul(s, &e, 0);
+static int parse_sn_bits(const char *opt, uint8_t *sn_bits)
+{
+ size_t len = strlen(opt);
- while (s != e && *e == ':' && i < 2) {
- s = e + 1;
- i++;
- sn_bits[i] = (uint32_t)strtoul(s, &e, 0);
+ if (!strncmp(opt, "0x", 2)) {
+ opt += 2;
+ len -= 2;
}
+ if (len != SN_BITS_SIZE * 2) return 0;
- return *e == '\0' && i == 2;
+ for (int i = 0; i < SN_BITS_SIZE; ++i, opt +=2)
+ if (!read_hex_byte(opt, sn_bits++)) return 0;
+
+ return 1;
}
static int parse_sn_inc_rma(const char *opt, uint8_t *arg)
@@ -1952,19 +1976,14 @@ void process_bid(struct transfer_descriptor *td,
}
static void process_sn_bits(struct transfer_descriptor *td,
- uint32_t *sn_bits)
+ uint8_t *sn_bits)
{
int rv;
- int i = 0;
- uint32_t command_body[3];
uint8_t response_code;
size_t response_size = sizeof(response_code);
- for (i = 0; i < 3; i++)
- command_body[i] = htobe32(sn_bits[i]);
-
rv = send_vendor_command(td, VENDOR_CC_SN_SET_HASH,
- command_body, sizeof(command_body),
+ sn_bits, SN_BITS_SIZE,
&response_code, &response_size);
if (rv) {
@@ -2223,7 +2242,7 @@ int main(int argc, char *argv[])
char *factory_mode_arg;
char *tpm_mode_arg = NULL;
int sn_bits = 0;
- uint32_t sn_bits_arg[3];
+ uint8_t sn_bits_arg[SN_BITS_SIZE];
int sn_inc_rma = 0;
uint8_t sn_inc_rma_arg;