diff --git a/lib/tinyusb b/lib/tinyusb index e07b1ac..7b35cd0 160000 --- a/lib/tinyusb +++ b/lib/tinyusb @@ -1 +1 @@ -Subproject commit e07b1acbed02fff395c91b421b7fdf6c7cda61a4 +Subproject commit 7b35cd0203bc409d7c1aefc075672103cb4a913e diff --git a/src/usb/usb.c b/src/usb/usb.c index 5efd24f..b968f5b 100644 --- a/src/usb/usb.c +++ b/src/usb/usb.c @@ -54,6 +54,13 @@ extern tusb_desc_device_t usb_desc_dev; extern usb_desc_cfg_t usb_desc_cfg; +/* Serial should be different for Application mode, DFU with UF2, and DFU with CDC only therefore + * - DeviceID : (Arduino + CircuitPython) + * - DeviceID + 1 : DFU with UF2 + * - DeviceID + 2 : DFU with CDC only + */ +extern uint16_t usb_desc_str_serial[1+16]; + /* tinyusb function that handles power event (detected, ready, removed) * We must call it within SD's SOC event handler, or set it as power event handler if SD is not enabled. */ extern void tusb_hal_nrf_power_event(uint32_t event); @@ -100,6 +107,8 @@ void usb_init(bool cdc_only) tusb_hal_nrf_power_event(NRFX_POWER_USB_EVT_READY); } + uint32_t devid_low = NRF_FICR->DEVICEID[0] + 1; // default uf2 + if ( cdc_only ) { // Change PID to CDC only @@ -108,6 +117,17 @@ void usb_init(bool cdc_only) // Remove MSC interface = reduce total interface + adjust config desc length usb_desc_cfg.config.bNumInterfaces--; usb_desc_cfg.config.wTotalLength -= sizeof(usb_desc_cfg.msc); + + devid_low++; + } + + // Create Serial string descriptor + char tmp_serial[17]; + sprintf(tmp_serial, "%08lX%08lX", NRF_FICR->DEVICEID[1], devid_low); + + for(uint8_t i=0; i<16; i++) + { + usb_desc_str_serial[1+i] = tmp_serial[i]; } // Init tusb stack diff --git a/src/usb/usb_desc.c b/src/usb/usb_desc.c index 1f2b687..630a369 100644 --- a/src/usb/usb_desc.c +++ b/src/usb/usb_desc.c @@ -77,6 +77,9 @@ enum { // STRING DESCRIPTORS //--------------------------------------------------------------------+ +// Serial is 64-bit DeviceID -> 16 chars len +uint16_t usb_desc_str_serial[1+16] = { TUD_DESC_STR_HEADER(16) }; + // array of pointer to string descriptors uint16_t const * const string_desc_arr [] = { @@ -90,7 +93,7 @@ uint16_t const * const string_desc_arr [] = TUD_DESC_STRCONV('B','l','u','e','f','r','u','i','t',' ','n','R','F','5','2','8','4','0', ' ', 'D','F','U'), // 3: Serials TODO use chip ID - TUD_DESC_STRCONV('1', '2', '3', '4'), + usb_desc_str_serial, // 4: CDC Interface TUD_DESC_STRCONV('B','l','u','e','f','r','u','i','t',' ','S','e','r','i','a','l'),