update all examples to use unique ID as serial if avaialble
This commit is contained in:
		| @@ -23,6 +23,7 @@ | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include "bsp/board_api.h" | ||||
| #include "tusb.h" | ||||
| #include "usb_descriptors.h" | ||||
|  | ||||
| @@ -207,53 +208,65 @@ TU_VERIFY_STATIC(sizeof(desc_ms_os_20) == MS_OS_20_DESC_LEN, "Incorrect size"); | ||||
| // String Descriptors | ||||
| //--------------------------------------------------------------------+ | ||||
|  | ||||
| // String Descriptor Index | ||||
| enum { | ||||
|   STRID_LANGID = 0, | ||||
|   STRID_MANUFACTURER, | ||||
|   STRID_PRODUCT, | ||||
|   STRID_SERIAL, | ||||
| }; | ||||
|  | ||||
| // array of pointer to string descriptors | ||||
| char const* string_desc_arr [] = | ||||
| char const *string_desc_arr[] = | ||||
| { | ||||
|   (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409) | ||||
|   "TinyUSB",                     // 1: Manufacturer | ||||
|   "TinyUSB Device",              // 2: Product | ||||
|   "123456",                      // 3: Serials, should use chip ID | ||||
|   NULL,                          // 3: Serials will use unique ID if possible | ||||
|   "TinyUSB CDC",                 // 4: CDC Interface | ||||
|   "TinyUSB WebUSB"               // 5: Vendor Interface | ||||
| }; | ||||
|  | ||||
| static uint16_t _desc_str[32]; | ||||
| static uint16_t _desc_str[32 + 1]; | ||||
|  | ||||
| // Invoked when received GET STRING DESCRIPTOR request | ||||
| // Application return pointer to descriptor, whose contents must exist long enough for transfer to complete | ||||
| uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) | ||||
| { | ||||
| uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) { | ||||
|   (void) langid; | ||||
|   size_t chr_count; | ||||
|  | ||||
|   uint8_t chr_count; | ||||
|   switch ( index ) { | ||||
|     case STRID_LANGID: | ||||
|       memcpy(&_desc_str[1], string_desc_arr[0], 2); | ||||
|       chr_count = 1; | ||||
|       break; | ||||
|  | ||||
|   if ( index == 0) | ||||
|   { | ||||
|     memcpy(&_desc_str[1], string_desc_arr[0], 2); | ||||
|     chr_count = 1; | ||||
|   }else | ||||
|   { | ||||
|     // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors. | ||||
|     // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors | ||||
|     case STRID_SERIAL: | ||||
|       chr_count = board_usb_get_serial(_desc_str + 1, 32); | ||||
|       break; | ||||
|  | ||||
|     if ( !(index < sizeof(string_desc_arr)/sizeof(string_desc_arr[0])) ) return NULL; | ||||
|     default: | ||||
|       // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors. | ||||
|       // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors | ||||
|  | ||||
|     const char* str = string_desc_arr[index]; | ||||
|       if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) return NULL; | ||||
|  | ||||
|     // Cap at max char | ||||
|     chr_count = (uint8_t) strlen(str); | ||||
|     if ( chr_count > 31 ) chr_count = 31; | ||||
|       const char *str = string_desc_arr[index]; | ||||
|  | ||||
|     // Convert ASCII string into UTF-16 | ||||
|     for(uint8_t i=0; i<chr_count; i++) | ||||
|     { | ||||
|       _desc_str[1+i] = str[i]; | ||||
|     } | ||||
|       // Cap at max char | ||||
|       chr_count = strlen(str); | ||||
|       size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type | ||||
|       if ( chr_count > max_count ) chr_count = max_count; | ||||
|  | ||||
|       // Convert ASCII string into UTF-16 | ||||
|       for ( size_t i = 0; i < chr_count; i++ ) { | ||||
|         _desc_str[1 + i] = str[i]; | ||||
|       } | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   // first byte is length (including header), second byte is string type | ||||
|   _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8 ) | (2*chr_count + 2)); | ||||
|   _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2)); | ||||
|  | ||||
|   return _desc_str; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 hathach
					hathach