diff --git a/CMakeLists.txt b/CMakeLists.txt index eda4f18..e0c286d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,7 @@ target_include_directories(uart_bridge PUBLIC pico-sdk/lib/tinyusb/src) target_link_libraries(uart_bridge + hardware_flash pico_multicore pico_stdlib tinyusb_device) diff --git a/tusb_config.h b/tusb_config.h index 7e0ec54..6fcb7b9 100644 --- a/tusb_config.h +++ b/tusb_config.h @@ -16,4 +16,6 @@ #define CFG_TUD_CDC_RX_BUFSIZE 256 #define CFG_TUD_CDC_TX_BUFSIZE 256 +void usbd_serial_init(void); + #endif /* _TUSB_CONFIG_H_ */ diff --git a/uart-bridge.c b/uart-bridge.c index aebbdf6..7ee6a9c 100644 --- a/uart-bridge.c +++ b/uart-bridge.c @@ -269,6 +269,8 @@ int main(void) set_sys_clock_khz(250000, false); + usbd_serial_init(); + for (itf = 0; itf < CFG_TUD_CDC; itf++) init_uart_data(itf); diff --git a/usb-descriptors.c b/usb-descriptors.c index 5c10798..1ccd5de 100644 --- a/usb-descriptors.c +++ b/usb-descriptors.c @@ -9,6 +9,7 @@ * Copyright (c) 2019 Damien P. George */ +#include #include #define DESC_STR_MAX 20 @@ -36,6 +37,7 @@ #define USBD_STR_MANUF 0x01 #define USBD_STR_PRODUCT 0x02 #define USBD_STR_SERIAL 0x03 +#define USBD_STR_SERIAL_LEN 17 #define USBD_STR_CDC 0x04 static const tusb_desc_device_t usbd_desc_device = { @@ -68,10 +70,12 @@ static const uint8_t usbd_desc_cfg[USBD_DESC_LEN] = { USBD_CDC_IN_OUT_MAX_SIZE), }; +static char usbd_serial[USBD_STR_SERIAL_LEN] = "000000000000"; + static const char *const usbd_desc_str[] = { [USBD_STR_MANUF] = "Raspberry Pi", [USBD_STR_PRODUCT] = "Pico", - [USBD_STR_SERIAL] = "000000000000", + [USBD_STR_SERIAL] = usbd_serial, [USBD_STR_CDC] = "Board CDC", }; @@ -95,6 +99,7 @@ const uint16_t *tud_descriptor_string_cb(uint8_t index, uint16_t langid) len = 1; } else { const char *str; + char serial[USBD_STR_SERIAL_LEN]; if (index >= sizeof(usbd_desc_str) / sizeof(usbd_desc_str[0])) return NULL; @@ -108,3 +113,13 @@ const uint16_t *tud_descriptor_string_cb(uint8_t index, uint16_t langid) return desc_str; } + +void usbd_serial_init(void) +{ + uint8_t id[8]; + + flash_get_unique_id(id); + + snprintf(usbd_serial, USBD_STR_SERIAL_LEN, "%02X%02X%02X%02X%02X%02X%02X%02X", + id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7]); +}