Commit affcbe41 authored by Dave Hylands's avatar Dave Hylands Committed by Damien George
Browse files

stmhal: Make USB serial number actually be unique.

parent 6a515b95
......@@ -40,9 +40,7 @@
#define USBD_LANGID_STRING 0x409
#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_INTERFACE_HS_STRING "Pyboard Interface"
......@@ -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:
// 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: for the algorithim used.
uint8_t *id = (uint8_t *)0x1fff7a10;
char serial_buf[16];
snprintf(serial_buf, sizeof(serial_buf),
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;
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment