diff options
| author | Dave Hylands <dhylands@gmail.com> | 2015-10-16 20:40:31 -0700 |
|---|---|---|
| committer | Damien George <damien.p.george@gmail.com> | 2015-10-17 22:02:57 +0100 |
| commit | affcbe4139bfa6bb331edc207d687bb13aa05d65 (patch) | |
| tree | 15ad5a92ac110b867c29beabd32f73a0e1039642 /stmhal/usbd_desc.c | |
| parent | 6a515b95a83e5c3c34e7fc0ef0f666f452c36868 (diff) | |
stmhal: Make USB serial number actually be unique.
Diffstat (limited to 'stmhal/usbd_desc.c')
| -rw-r--r-- | stmhal/usbd_desc.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/stmhal/usbd_desc.c b/stmhal/usbd_desc.c index 23b6f3405..a3f1a7bc1 100644 --- a/stmhal/usbd_desc.c +++ b/stmhal/usbd_desc.c @@ -40,9 +40,7 @@ #define USBD_LANGID_STRING 0x409 #define USBD_MANUFACTURER_STRING "MicroPython" #define USBD_PRODUCT_HS_STRING "Pyboard Virtual Comm Port in HS Mode" -#define USBD_SERIALNUMBER_HS_STRING "000000000010" #define USBD_PRODUCT_FS_STRING "Pyboard Virtual Comm Port in FS Mode" -#define USBD_SERIALNUMBER_FS_STRING "000000000011" #define USBD_CONFIGURATION_HS_STRING "Pyboard Config" #define USBD_INTERFACE_HS_STRING "Pyboard Interface" #define USBD_CONFIGURATION_FS_STRING "Pyboard Config" @@ -158,11 +156,26 @@ STATIC uint8_t *USBD_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t * @retval Pointer to descriptor buffer */ STATIC uint8_t *USBD_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) { - if(speed == USBD_SPEED_HIGH) { - USBD_GetString((uint8_t *)USBD_SERIALNUMBER_HS_STRING, USBD_StrDesc, length); - } else { - USBD_GetString((uint8_t *)USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc, length); - } + // This document: http://www.usb.org/developers/docs/devclass_docs/usbmassbulk_10.pdf + // says that the serial number has to be at least 12 digits long and that + // the last 12 digits need to be unique. It also stipulates that the valid + // character set is that of upper-case hexadecimal digits. + // + // The onboard DFU bootloader produces a 12-digit serial number based on + // the 96-bit unique ID, so for consistency we go with this algorithm. + // You can see the serial number if you do: + // + // dfu-util -l + // + // See: https://my.st.com/52d187b7 for the algorithim used. + + uint8_t *id = (uint8_t *)0x1fff7a10; + char serial_buf[16]; + snprintf(serial_buf, sizeof(serial_buf), + "%02X%02X%02X%02X%02X%02X", + id[11], id[10] + id[2], id[9], id[8] + id[0], id[7], id[6]); + + USBD_GetString((uint8_t *)serial_buf, USBD_StrDesc, length); return USBD_StrDesc; } |
