Skip to content

Commit cd0f54e

Browse files
authored
Merge pull request arduino#108 from hathach/adafruit-tinyusb
fix load serial string based on device id
2 parents 4d317b0 + dda4eaf commit cd0f54e

File tree

1 file changed

+30
-8
lines changed

1 file changed

+30
-8
lines changed

cores/arduino/Adafruit_TinyUSB_Core/Adafruit_TinyUSB_Core.cpp

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,17 +84,39 @@ static void usb_hardware_init(void)
8484
#endif
8585
}
8686

87+
static void load_serial_number(void)
88+
{
89+
#ifdef __SAMD51__
90+
uint32_t* id_addresses[4] = {(uint32_t *) 0x008061FC, (uint32_t *) 0x00806010,
91+
(uint32_t *) 0x00806014, (uint32_t *) 0x00806018};
92+
#else // samd21
93+
uint32_t* id_addresses[4] = {(uint32_t *) 0x0080A00C, (uint32_t *) 0x0080A040,
94+
(uint32_t *) 0x0080A044, (uint32_t *) 0x0080A048};
95+
96+
#endif
97+
98+
uint8_t raw_id[8];
99+
for (int i=0; i<4; i++) {
100+
for (int k=0; k<4; k++) {
101+
raw_id[4 * i + k] = (*(id_addresses[i]) >> k * 8) & 0xff;
102+
}
103+
}
104+
105+
static const char nibble_to_hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
106+
107+
for (int i = 0; i < sizeof(raw_id); i++) {
108+
for (int j = 0; j < 2; j++) {
109+
uint8_t nibble = (raw_id[i] >> (j * 4)) & 0xf;
110+
// Strings are UTF-16-LE encoded.
111+
usb_desc_str_serial[1 + i * 2 + j] = nibble_to_hex[nibble];
112+
}
113+
}
114+
}
115+
87116
void Adafruit_TinyUSB_Core_init(void)
88117
{
89118
// Create Serial string descriptor
90-
// char tmp_serial[17];
91-
// sprintf(tmp_serial, "%08lX%08lX", NRF_FICR->DEVICEID[1], NRF_FICR->DEVICEID[0]);
92-
//
93-
// for(uint8_t i=0; i<16; i++)
94-
// {
95-
// usb_desc_str_serial[1+i] = tmp_serial[i];
96-
// }
97-
119+
load_serial_number();
98120

99121
USBDevice.addInterface( (Adafruit_USBD_Interface&) Serial);
100122
USBDevice.setID(USB_VID, USB_PID);

0 commit comments

Comments
 (0)