From 144acfcb988479d6e5802bfa600a62be39d39be7 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Sun, 21 Feb 2021 21:24:49 -0600 Subject: [PATCH] USB descriptors: Save flash storage for serial number This saves about 60 bytes (Feather M4 went from 45040 -> 45100 bytes free) 66 bytes of data eliminated, but 6 bytes paid back to initialize the length field. --- supervisor/shared/usb/usb.c | 1 + tools/gen_usb_descriptor.py | 42 +++++++++++++++++++------------------ 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/supervisor/shared/usb/usb.c b/supervisor/shared/usb/usb.c index 5b020b8a00..3c777c5056 100644 --- a/supervisor/shared/usb/usb.c +++ b/supervisor/shared/usb/usb.c @@ -62,6 +62,7 @@ void load_serial_number(void) { uint8_t raw_id[COMMON_HAL_MCU_PROCESSOR_UID_LENGTH]; common_hal_mcu_processor_get_uid(raw_id); + usb_serial_number[0] = 0x300 | MP_ARRAY_SIZE(usb_serial_number); for (int i = 0; i < COMMON_HAL_MCU_PROCESSOR_UID_LENGTH; i++) { for (int j = 0; j < 2; j++) { uint8_t nibble = (raw_id[i] >> (j * 4)) & 0xf; diff --git a/tools/gen_usb_descriptor.py b/tools/gen_usb_descriptor.py index 089d00ff23..b21cfd920f 100644 --- a/tools/gen_usb_descriptor.py +++ b/tools/gen_usb_descriptor.py @@ -778,30 +778,32 @@ for idx, descriptor in enumerate(string_descriptors): variable_name = StringIndex.index_to_variable[idx] if not variable_name: variable_name = "string_descriptor{}".format(idx) + pointers_to_strings.append("{name}".format(name=variable_name)) const = "const " if variable_name == "usb_serial_number": - const = "" - c_file.write( - """\ -{const}uint16_t {NAME}[] = {{ -""".format( - const=const, NAME=variable_name + length = len(b) + c_file.write(" uint16_t {NAME}[{length}];\n".format(NAME=variable_name, length=length//2)) + else: + c_file.write( + """\ + const uint16_t {NAME}[] = {{ + """.format( + const=const, NAME=variable_name + ) ) - ) - pointers_to_strings.append("{name}".format(name=variable_name)) - n = 0 - while i < len(b): - length = b[i] - for j in range(length // 2): - c_file.write("0x{:04x}, ".format(b[i + 2 * j + 1] << 8 | b[i + 2 * j])) - n += 1 - c_file.write("\n") - i += length - c_file.write( - """\ -}; -""" + n = 0 + while i < len(b): + length = b[i] + for j in range(length // 2): + c_file.write("0x{:04x}, ".format(b[i + 2 * j + 1] << 8 | b[i + 2 * j])) + n += 1 + c_file.write("\n") + i += length + c_file.write( + """\ + }; + """ ) c_file.write(