stmhal: Make USB serial number actually be unique.

This commit is contained in:
Dave Hylands 2015-10-16 20:40:31 -07:00 committed by Damien George
parent 6a515b95a8
commit affcbe4139

View File

@ -40,9 +40,7 @@
#define USBD_LANGID_STRING 0x409 #define USBD_LANGID_STRING 0x409
#define USBD_MANUFACTURER_STRING "MicroPython" #define USBD_MANUFACTURER_STRING "MicroPython"
#define USBD_PRODUCT_HS_STRING "Pyboard Virtual Comm Port in HS Mode" #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_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_CONFIGURATION_HS_STRING "Pyboard Config"
#define USBD_INTERFACE_HS_STRING "Pyboard Interface" #define USBD_INTERFACE_HS_STRING "Pyboard Interface"
#define USBD_CONFIGURATION_FS_STRING "Pyboard Config" #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 * @retval Pointer to descriptor buffer
*/ */
STATIC uint8_t *USBD_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) { STATIC uint8_t *USBD_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) {
if(speed == USBD_SPEED_HIGH) { // This document: http://www.usb.org/developers/docs/devclass_docs/usbmassbulk_10.pdf
USBD_GetString((uint8_t *)USBD_SERIALNUMBER_HS_STRING, USBD_StrDesc, length); // says that the serial number has to be at least 12 digits long and that
} else { // the last 12 digits need to be unique. It also stipulates that the valid
USBD_GetString((uint8_t *)USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc, length); // 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; return USBD_StrDesc;
} }