3      Copyright (C) Dean Camera, 2009. 
   5   dean [at] fourwalledcubicle [dot] com 
   6       www.fourwalledcubicle.com 
  10   Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com) 
  12   Permission to use, copy, modify, and distribute this software 
  13   and its documentation for any purpose and without fee is hereby 
  14   granted, provided that the above copyright notice appear in all 
  15   copies and that both that the copyright notice and this 
  16   permission notice and warranty disclaimer appear in supporting 
  17   documentation, and that the name of the author not be used in 
  18   advertising or publicity pertaining to distribution of the 
  19   software without specific, written prior permission. 
  21   The author disclaim all warranties with regard to this 
  22   software, including all implied warranties of merchantability 
  23   and fitness.  In no event shall the author be liable for any 
  24   special, indirect or consequential damages or any damages 
  25   whatsoever resulting from loss of use, data or profits, whether 
  26   in an action of contract, negligence or other tortious action, 
  27   arising out of or in connection with the use or performance of 
  33  *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special  
  34  *  computer-readable structures which the host requests upon device enumeration, to determine 
  35  *  the device's capabilities and functions.   
  38 #include "Descriptors.h" 
  40 /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall 
  41  *  device characteristics, including the supported USB version, control endpoint size and the 
  42  *  number of device configurations. The descriptor is read out by the USB host when the enumeration 
  45 USB_Descriptor_Device_t PROGMEM DeviceDescriptor 
= 
  47         Header
:                 {Size
: sizeof(USB_Descriptor_Device_t
), Type
: DTYPE_Device
}, 
  49         USBSpecification
:       VERSION_BCD(01.10), 
  58         ReleaseNumber
:          0x0000, 
  60         ManufacturerStrIndex
:   0x01, 
  61         ProductStrIndex
:        0x02, 
  62         SerialNumStrIndex
:      NO_DESCRIPTOR
, 
  64         NumberOfConfigurations
: 1 
  67 /** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage 
  68  *  of the device in one of its supported configurations, including information about any device interfaces 
  69  *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting 
  70  *  a configuration so that the host may correctly communicate with the USB device. 
  72 USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor 
= 
  76                         Header
:                   {Size
: sizeof(USB_Descriptor_Configuration_Header_t
), Type
: DTYPE_Configuration
}, 
  78                         TotalConfigurationSize
:   sizeof(USB_Descriptor_Configuration_t
), 
  81                         ConfigurationNumber
:      1, 
  82                         ConfigurationStrIndex
:    NO_DESCRIPTOR
, 
  84                         ConfigAttributes
:         (USB_CONFIG_ATTR_BUSPOWERED 
| USB_CONFIG_ATTR_SELFPOWERED
), 
  86                         MaxPowerConsumption
:      USB_CONFIG_POWER_MA(100) 
  89         AudioControlInterface
: 
  91                         Header
:                   {Size
: sizeof(USB_Descriptor_Interface_t
), Type
: DTYPE_Interface
}, 
 102                         InterfaceStrIndex
:        NO_DESCRIPTOR                 
 
 105         AudioControlInterface_SPC
: 
 107                         Header
:                   {Size
: sizeof(USB_AudioInterface_AC_t
), Type
: DTYPE_AudioInterface
}, 
 108                         Subtype
:                  DSUBTYPE_Header
, 
 110                         ACSpecification
:          VERSION_BCD(01.00), 
 111                         TotalLength
:              sizeof(USB_AudioInterface_AC_t
), 
 114                         InterfaceNumbers
:         {1},                   
 117         AudioStreamInterface
: 
 119                         Header
:                   {Size
: sizeof(USB_Descriptor_Interface_t
), Type
: DTYPE_Interface
}, 
 130                         InterfaceStrIndex
:        NO_DESCRIPTOR
 
 133         AudioStreamInterface_SPC
: 
 135                         Header
:                   {Size
: sizeof(USB_AudioInterface_MIDI_AS_t
), Type
: DTYPE_AudioInterface
}, 
 136                         Subtype
:                  DSUBTYPE_General
, 
 138                         AudioSpecification
:       VERSION_BCD(01.00), 
 140                         TotalLength
:              (sizeof(USB_Descriptor_Configuration_t
) - offsetof(USB_Descriptor_Configuration_t
, AudioStreamInterface_SPC
)) 
 145                         Header
:                   {Size
: sizeof(USB_MIDI_In_Jack_t
), Type
: DTYPE_AudioInterface
}, 
 146                         Subtype
:                  DSUBTYPE_InputJack
, 
 148                         JackType
:                 JACKTYPE_EMBEDDED
, 
 151                         JackStrIndex
:             NO_DESCRIPTOR
 
 156                         Header
:                   {Size
: sizeof(USB_MIDI_In_Jack_t
), Type
: DTYPE_AudioInterface
}, 
 157                         Subtype
:                  DSUBTYPE_InputJack
, 
 159                         JackType
:                 JACKTYPE_EXTERNAL
, 
 162                         JackStrIndex
:             NO_DESCRIPTOR
 
 167                         Header
:                   {Size
: sizeof(USB_MIDI_Out_Jack_t
), Type
: DTYPE_AudioInterface
}, 
 168                         Subtype
:                  DSUBTYPE_OutputJack
, 
 170                         JackType
:                 JACKTYPE_EMBEDDED
, 
 174                         SourceJackID
:             {0x02}, 
 177                         JackStrIndex
:             NO_DESCRIPTOR
 
 182                         Header
:                   {Size
: sizeof(USB_MIDI_Out_Jack_t
), Type
: DTYPE_AudioInterface
}, 
 183                         Subtype
:                  DSUBTYPE_OutputJack
, 
 185                         JackType
:                 JACKTYPE_EXTERNAL
, 
 189                         SourceJackID
:             {0x01}, 
 192                         JackStrIndex
:             NO_DESCRIPTOR
 
 195         MIDI_In_Jack_Endpoint
: 
 199                                         Header
:              {Size
: sizeof(USB_AudioStreamEndpoint_Std_t
), Type
: DTYPE_Endpoint
}, 
 201                                         EndpointAddress
:     (ENDPOINT_DESCRIPTOR_DIR_OUT 
| MIDI_STREAM_OUT_EPNUM
), 
 202                                         Attributes
:          (EP_TYPE_BULK 
| ENDPOINT_ATTR_NO_SYNC 
| ENDPOINT_USAGE_DATA
), 
 203                                         EndpointSize
:        MIDI_STREAM_EPSIZE
, 
 208                         SyncEndpointNumber
:       0 
 211         MIDI_In_Jack_Endpoint_SPC
: 
 213                         Header
:                   {Size
: sizeof(USB_MIDI_Jack_Endpoint_t
), Type
: DTYPE_AudioEndpoint
}, 
 214                         Subtype
:                  DSUBTYPE_General
, 
 216                         TotalEmbeddedJacks
:       0x01, 
 217                         AssociatedJackID
:         {0x01} 
 220         MIDI_Out_Jack_Endpoint
: 
 224                                         Header
:              {Size
: sizeof(USB_AudioStreamEndpoint_Std_t
), Type
: DTYPE_Endpoint
}, 
 226                                         EndpointAddress
:     (ENDPOINT_DESCRIPTOR_DIR_IN 
| MIDI_STREAM_IN_EPNUM
), 
 227                                         Attributes
:          (EP_TYPE_BULK 
| ENDPOINT_ATTR_NO_SYNC 
| ENDPOINT_USAGE_DATA
), 
 228                                         EndpointSize
:        MIDI_STREAM_EPSIZE
, 
 233                         SyncEndpointNumber
:       0 
 236         MIDI_Out_Jack_Endpoint_SPC
: 
 238                         Header
:                   {Size
: sizeof(USB_MIDI_Jack_Endpoint_t
), Type
: DTYPE_AudioEndpoint
}, 
 239                         Subtype
:                  DSUBTYPE_General
, 
 241                         TotalEmbeddedJacks
:       0x01, 
 242                         AssociatedJackID
:         {0x03} 
 246 /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests 
 247  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate 
 248  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. 
 250 USB_Descriptor_String_t PROGMEM LanguageString 
= 
 252         Header
:                 {Size
: USB_STRING_LEN(1), Type
: DTYPE_String
}, 
 254         UnicodeString
:          {LANGUAGE_ID_ENG
} 
 257 /** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable 
 258  *  form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device 
 261 USB_Descriptor_String_t PROGMEM ManufacturerString 
= 
 263         Header
:                 {Size
: USB_STRING_LEN(11), Type
: DTYPE_String
}, 
 265         UnicodeString
:          L
"Dean Camera" 
 268 /** Product descriptor string. This is a Unicode string containing the product's details in human readable form, 
 269  *  and is read out upon request by the host when the appropriate string ID is requested, listed in the Device 
 272 USB_Descriptor_String_t PROGMEM ProductString 
= 
 274         Header
:                 {Size
: USB_STRING_LEN(14), Type
: DTYPE_String
}, 
 276         UnicodeString
:          L
"LUFA MIDI Demo" 
 279 /** This function is called by the library when in device mode, and must be overridden (see StdDescriptors.h 
 280  *  documentation) by the application code so that the address and size of a requested descriptor can be given 
 281  *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function 
 282  *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the 
 285 uint16_t USB_GetDescriptor(const uint16_t wValue
, const uint8_t wIndex
, void** const DescriptorAddress
) 
 287         const uint8_t  DescriptorType   
= (wValue 
>> 8); 
 288         const uint8_t  DescriptorNumber 
= (wValue 
& 0xFF); 
 290         void*    Address 
= NULL
; 
 291         uint16_t Size    
= NO_DESCRIPTOR
; 
 293         switch (DescriptorType
) 
 296                         Address 
= DESCRIPTOR_ADDRESS(DeviceDescriptor
); 
 297                         Size    
= sizeof(USB_Descriptor_Device_t
); 
 299                 case DTYPE_Configuration
: 
 300                         Address 
= DESCRIPTOR_ADDRESS(ConfigurationDescriptor
); 
 301                         Size    
= sizeof(USB_Descriptor_Configuration_t
); 
 304                         switch (DescriptorNumber
) 
 307                                         Address 
= DESCRIPTOR_ADDRESS(LanguageString
); 
 308                                         Size    
= pgm_read_byte(&LanguageString
.Header
.Size
); 
 311                                         Address 
= DESCRIPTOR_ADDRESS(ManufacturerString
); 
 312                                         Size    
= pgm_read_byte(&ManufacturerString
.Header
.Size
); 
 315                                         Address 
= DESCRIPTOR_ADDRESS(ProductString
); 
 316                                         Size    
= pgm_read_byte(&ProductString
.Header
.Size
); 
 323         *DescriptorAddress 
= Address
;