update all examples to use unique ID as serial if avaialble
This commit is contained in:
		| @@ -42,35 +42,33 @@ | ||||
| //--------------------------------------------------------------------+ | ||||
| // Device Descriptors | ||||
| //--------------------------------------------------------------------+ | ||||
| tusb_desc_device_t const desc_device = | ||||
| { | ||||
|   .bLength            = sizeof(tusb_desc_device_t), | ||||
|   .bDescriptorType    = TUSB_DESC_DEVICE, | ||||
|   .bcdUSB             = USB_BCD, | ||||
| tusb_desc_device_t const desc_device = { | ||||
|     .bLength            = sizeof(tusb_desc_device_t), | ||||
|     .bDescriptorType    = TUSB_DESC_DEVICE, | ||||
|     .bcdUSB             = USB_BCD, | ||||
|  | ||||
|   // Use Interface Association Descriptor (IAD) for CDC | ||||
|   // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1) | ||||
|   .bDeviceClass       = TUSB_CLASS_MISC, | ||||
|   .bDeviceSubClass    = MISC_SUBCLASS_COMMON, | ||||
|   .bDeviceProtocol    = MISC_PROTOCOL_IAD, | ||||
|     // Use Interface Association Descriptor (IAD) for CDC | ||||
|     // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1) | ||||
|     .bDeviceClass       = TUSB_CLASS_MISC, | ||||
|     .bDeviceSubClass    = MISC_SUBCLASS_COMMON, | ||||
|     .bDeviceProtocol    = MISC_PROTOCOL_IAD, | ||||
|  | ||||
|   .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE, | ||||
|     .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE, | ||||
|  | ||||
|   .idVendor           = USB_VID, | ||||
|   .idProduct          = USB_PID, | ||||
|   .bcdDevice          = 0x0100, | ||||
|     .idVendor           = USB_VID, | ||||
|     .idProduct          = USB_PID, | ||||
|     .bcdDevice          = 0x0100, | ||||
|  | ||||
|   .iManufacturer      = 0x01, | ||||
|   .iProduct           = 0x02, | ||||
|   .iSerialNumber      = 0x03, | ||||
|     .iManufacturer      = 0x01, | ||||
|     .iProduct           = 0x02, | ||||
|     .iSerialNumber      = 0x03, | ||||
|  | ||||
|   .bNumConfigurations = 0x01 | ||||
|     .bNumConfigurations = 0x01 | ||||
| }; | ||||
|  | ||||
| // Invoked when received GET DEVICE DESCRIPTOR | ||||
| // Application return pointer to descriptor | ||||
| uint8_t const * tud_descriptor_device_cb(void) | ||||
| { | ||||
| uint8_t const *tud_descriptor_device_cb(void) { | ||||
|   return (uint8_t const *) &desc_device; | ||||
| } | ||||
|  | ||||
| @@ -78,8 +76,7 @@ uint8_t const * tud_descriptor_device_cb(void) | ||||
| // Configuration Descriptor | ||||
| //--------------------------------------------------------------------+ | ||||
|  | ||||
| enum | ||||
| { | ||||
| enum { | ||||
|   ITF_NUM_CDC = 0, | ||||
|   ITF_NUM_CDC_DATA, | ||||
|   ITF_NUM_MSC, | ||||
| @@ -96,7 +93,7 @@ enum | ||||
|   #define EPNUM_MSC_OUT     0x05 | ||||
|   #define EPNUM_MSC_IN      0x85 | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_SAMG  || CFG_TUSB_MCU ==  OPT_MCU_SAMX7X | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_SAMG || CFG_TUSB_MCU == OPT_MCU_SAMX7X | ||||
|   // SAMG & SAME70 don't support a same endpoint number with different direction IN and OUT | ||||
|   //    e.g EP1 OUT & EP1 IN cannot exist together | ||||
|   #define EPNUM_CDC_NOTIF   0x81 | ||||
| @@ -141,67 +138,62 @@ enum | ||||
| #define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN + TUD_MSC_DESC_LEN) | ||||
|  | ||||
| // full speed configuration | ||||
| uint8_t const desc_fs_configuration[] = | ||||
| { | ||||
|   // Config number, interface count, string index, total length, attribute, power in mA | ||||
|   TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100), | ||||
| uint8_t const desc_fs_configuration[] = { | ||||
|     // Config number, interface count, string index, total length, attribute, power in mA | ||||
|     TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100), | ||||
|  | ||||
|   // Interface number, string index, EP notification address and size, EP data address (out, in) and size. | ||||
|   TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64), | ||||
|     // Interface number, string index, EP notification address and size, EP data address (out, in) and size. | ||||
|     TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64), | ||||
|  | ||||
|   // Interface number, string index, EP Out & EP In address, EP size | ||||
|   TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 5, EPNUM_MSC_OUT, EPNUM_MSC_IN, 64), | ||||
|     // Interface number, string index, EP Out & EP In address, EP size | ||||
|     TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 5, EPNUM_MSC_OUT, EPNUM_MSC_IN, 64), | ||||
| }; | ||||
|  | ||||
| #if TUD_OPT_HIGH_SPEED | ||||
| // Per USB specs: high speed capable device must report device_qualifier and other_speed_configuration | ||||
|  | ||||
| // high speed configuration | ||||
| uint8_t const desc_hs_configuration[] = | ||||
| { | ||||
|   // Config number, interface count, string index, total length, attribute, power in mA | ||||
|   TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100), | ||||
| uint8_t const desc_hs_configuration[] = { | ||||
|     // Config number, interface count, string index, total length, attribute, power in mA | ||||
|     TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100), | ||||
|  | ||||
|   // Interface number, string index, EP notification address and size, EP data address (out, in) and size. | ||||
|   TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 512), | ||||
|     // Interface number, string index, EP notification address and size, EP data address (out, in) and size. | ||||
|     TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 512), | ||||
|  | ||||
|   // Interface number, string index, EP Out & EP In address, EP size | ||||
|   TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 5, EPNUM_MSC_OUT, EPNUM_MSC_IN, 512), | ||||
|     // Interface number, string index, EP Out & EP In address, EP size | ||||
|     TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 5, EPNUM_MSC_OUT, EPNUM_MSC_IN, 512), | ||||
| }; | ||||
|  | ||||
| // other speed configuration | ||||
| uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN]; | ||||
|  | ||||
| // device qualifier is mostly similar to device descriptor since we don't change configuration based on speed | ||||
| tusb_desc_device_qualifier_t const desc_device_qualifier = | ||||
| { | ||||
|   .bLength            = sizeof(tusb_desc_device_qualifier_t), | ||||
|   .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER, | ||||
|   .bcdUSB             = USB_BCD, | ||||
| tusb_desc_device_qualifier_t const desc_device_qualifier = { | ||||
|     .bLength            = sizeof(tusb_desc_device_qualifier_t), | ||||
|     .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER, | ||||
|     .bcdUSB             = USB_BCD, | ||||
|  | ||||
|   .bDeviceClass       = TUSB_CLASS_MISC, | ||||
|   .bDeviceSubClass    = MISC_SUBCLASS_COMMON, | ||||
|   .bDeviceProtocol    = MISC_PROTOCOL_IAD, | ||||
|     .bDeviceClass       = TUSB_CLASS_MISC, | ||||
|     .bDeviceSubClass    = MISC_SUBCLASS_COMMON, | ||||
|     .bDeviceProtocol    = MISC_PROTOCOL_IAD, | ||||
|  | ||||
|   .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE, | ||||
|   .bNumConfigurations = 0x01, | ||||
|   .bReserved          = 0x00 | ||||
|     .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE, | ||||
|     .bNumConfigurations = 0x01, | ||||
|     .bReserved          = 0x00 | ||||
| }; | ||||
|  | ||||
| // Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request | ||||
| // Application return pointer to descriptor, whose contents must exist long enough for transfer to complete. | ||||
| // device_qualifier descriptor describes information about a high-speed capable device that would | ||||
| // change if the device were operating at the other speed. If not highspeed capable stall this request. | ||||
| uint8_t const* tud_descriptor_device_qualifier_cb(void) | ||||
| { | ||||
|   return (uint8_t const*) &desc_device_qualifier; | ||||
| uint8_t const *tud_descriptor_device_qualifier_cb(void) { | ||||
|   return (uint8_t const *) &desc_device_qualifier; | ||||
| } | ||||
|  | ||||
| // Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request | ||||
| // Application return pointer to descriptor, whose contents must exist long enough for transfer to complete | ||||
| // Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa | ||||
| uint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index) | ||||
| { | ||||
| uint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) { | ||||
|   (void) index; // for multiple configurations | ||||
|  | ||||
|   // if link speed is high return fullspeed config, and vice versa | ||||
| @@ -221,13 +213,12 @@ uint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index) | ||||
| // Invoked when received GET CONFIGURATION DESCRIPTOR | ||||
| // Application return pointer to descriptor | ||||
| // Descriptor contents must exist long enough for transfer to complete | ||||
| uint8_t const * tud_descriptor_configuration_cb(uint8_t index) | ||||
| { | ||||
| uint8_t const *tud_descriptor_configuration_cb(uint8_t index) { | ||||
|   (void) index; // for multiple configurations | ||||
|  | ||||
| #if TUD_OPT_HIGH_SPEED | ||||
|   // Although we are highspeed, host may be fullspeed. | ||||
|   return (tud_speed_get() == TUSB_SPEED_HIGH) ?  desc_hs_configuration : desc_fs_configuration; | ||||
|   return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_hs_configuration : desc_fs_configuration; | ||||
| #else | ||||
|   return desc_fs_configuration; | ||||
| #endif | ||||
| @@ -246,57 +237,55 @@ enum { | ||||
| }; | ||||
|  | ||||
| // array of pointer to string descriptors | ||||
| char const* string_desc_arr [] = | ||||
| { | ||||
|   (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409) | ||||
|   "TinyUSB",                     // 1: Manufacturer | ||||
|   "TinyUSB Device",              // 2: Product | ||||
|   "123456789012",                // 3: Serials, should use chip ID | ||||
|   "TinyUSB CDC",                 // 4: CDC Interface | ||||
|   "TinyUSB MSC",                 // 5: MSC Interface | ||||
| char const *string_desc_arr[] = { | ||||
|     (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409) | ||||
|     "TinyUSB",                     // 1: Manufacturer | ||||
|     "TinyUSB Device",              // 2: Product | ||||
|     NULL,                          // 3: Serials will use unique ID if possible | ||||
|     "TinyUSB CDC",                 // 4: CDC Interface | ||||
|     "TinyUSB MSC",                 // 5: MSC Interface | ||||
| }; | ||||
|  | ||||
| static uint16_t _desc_str[32+1]; | ||||
| 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; | ||||
|  | ||||
|   switch(index) { | ||||
|   switch ( index ) { | ||||
|     case STRID_LANGID: | ||||
|       memcpy(&_desc_str[1], string_desc_arr[0], 2); | ||||
|       chr_count = 1; | ||||
|       break; | ||||
|  | ||||
|     case STRID_SERIAL: | ||||
|       chr_count = board_usb_get_serial(_desc_str+1, 32); | ||||
|       chr_count = board_usb_get_serial(_desc_str + 1, 32); | ||||
|       break; | ||||
|  | ||||
|     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 | ||||
|  | ||||
|       if ( !(index < sizeof(string_desc_arr)/sizeof(string_desc_arr[0])) ) return NULL; | ||||
|       if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) return NULL; | ||||
|  | ||||
|       const char* str = string_desc_arr[index]; | ||||
|       const char *str = string_desc_arr[index]; | ||||
|  | ||||
|       // Cap at max char | ||||
|       chr_count = strlen(str); | ||||
|       if ( chr_count > 31 ) chr_count = 31; | ||||
|       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]; | ||||
|       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