AnsweredAssumed Answered

adding USB interface descriptor

Question asked by James Q. on May 26, 2013
Latest reply on May 28, 2013 by Chinzei.Tsuneo
Hi,

I have a USB configuration descriptor with which the device successfully enumerates. I would like to add one interface (and, eventually, one endpoint). However, adding a dummy interface causes the device to fail enumeration.

The dummy interface has 0 endpoints, and is of the vendor-specific class (0xFF). Adding this interfaces gives me bNumInterfaces = 3, with sequential numbers from 0 through 2. The total length of the configuration descriptor  wTotalLength+= 9. I added the interface descriptor at the end of the configuration descriptor.

What about this descriptor could be causing the device to fail to enumerate?

Thanks!

Guilty interface descriptor:

    0x09,  /* bLength */
    USB_INTERFACE_DESCRIPTOR_TYPE,        /* bDescriptorType */
    0x02,                                 /* bInterfaceNumber */
    0x00,                                 /* bAlternateSetting */
    0x00,                                 /* bNumEndpoints */
    0xFF,               /* bInterfaceClass */
    0x00,          /* bInterfaceSubClass */
    0x00,             /* bInterfaceProtocol */
    0x00,                                 /* iInterface */


Complete configuration descriptor with dummy interface added at the bottom:

const uint8_t Joystick_ConfigDescriptor[] =
  {
    /* Configuration 1 */
    0x09,                                 /* bLength */
    USB_CONFIGURATION_DESCRIPTOR_TYPE,    /* bDescriptorType */
    0x76,//6D,                                 /* wTotalLength */
    0x00,
    0x03,                                 /* bNumInterfaces */
    0x01,                                 /* bConfigurationValue */
    0x00,                                 /* iConfiguration */
    0x80,                                 /* bmAttributes  BUS Powred*/ // NOTE: CHANGE HERE FOR REMOTE WAKEUP
    0x32,                                 /* bMaxPower = 100 mA*/


    /* USB Speaker Standard interface descriptor */
    SPEAKER_SIZ_INTERFACE_DESC_SIZE,  /* bLength */
    USB_INTERFACE_DESCRIPTOR_TYPE,        /* bDescriptorType */
    0x00,                                 /* bInterfaceNumber */
    0x00,                                 /* bAlternateSetting */
    0x00,                                 /* bNumEndpoints */
    USB_DEVICE_CLASS_AUDIO,               /* bInterfaceClass */
    AUDIO_SUBCLASS_AUDIOCONTROL,          /* bInterfaceSubClass */
    AUDIO_PROTOCOL_UNDEFINED,             /* bInterfaceProtocol */
    0x00,                                 /* iInterface */
    /* 09 byte*/


    /* Class-specific interface header descriptor */
    0x09,                                 /* bLength */
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
    AUDIO_CONTROL_HEADER,                 /* bDescriptorSubtype */
    0x00,          /* 1.00 */             /* bcdADC */
    0x01,
    0x27,                                 /* wTotalLength of all audio class descriptors that follow */
    0x00,
    0x01,                                 /* bInCollection */
    0x01,                                 /* baInterfaceNr */


    /* Input Terminal descriptor (capabilities of controls on audio stream) */
    0x0C,                                 /* bLength */
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
    AUDIO_CONTROL_INPUT_TERMINAL,         /* bDescriptorSubtype */
    0x01,                                 /* bTerminalID */
    0x01,                                 /* wTerminalType AUDIO_TERMINAL_USB_STREAMING   0x0101 */
    0x01,
    0x00,                                 /* bAssocTerminal */
    0x02,                                 /* bNrChannels */
    0x03,                                 /* wChannelConfig 0x0003 Stereo */
    0x00,
    0x00,                                 /* iChannelNames */
    0x00,                                 /* iTerminal */


    /* USB Speaker Audio Feature Unit Descriptor */
    0x09,                                 /* bLength */
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
    AUDIO_CONTROL_FEATURE_UNIT,           /* bDescriptorSubtype */
    0x02,                                 /* bUnitID */
    0x01,                                 /* bSourceID */
    0x01,                                 /* bControlSize */
    0x01,                   /* bmaControls(0)  AUDIO_CONTROL_MUTE + AUDIO_CONTROL_VOLUME*/
    0x00,                                 /* bmaControls(1) */
    0x00,                                 /* iTerminal */


    /* Output Terminal Descriptor */
    0x09,                                 /* bLength */
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
    AUDIO_CONTROL_OUTPUT_TERMINAL,        /* bDescriptorSubtype */
    0x03,                                 /* bTerminalID */
    0x01,                                 /* wTerminalType  0x0301*/
    0x03,
    0x00,                                 /* bAssocTerminal */
    0x02,                                 /* bSourceID */
    0x00,                                 /* iTerminal */


    /* Audio Interface Descriptor - Audio Streaming Zero Bandwith */
    /* Interface 1, Alternate Setting 0 */
    0x09,                                 /* bLength */
    USB_INTERFACE_DESCRIPTOR_TYPE,        /* bDescriptorType */
    0x01,                                 /* bInterfaceNumber */
    0x00,                                 /* bAlternateSetting */
    0x00,                                 /* bNumEndpoints */
    USB_DEVICE_CLASS_AUDIO,               /* bInterfaceClass */
    AUDIO_SUBCLASS_AUDIOSTREAMING,        /* bInterfaceSubClass */
    AUDIO_PROTOCOL_UNDEFINED,             /* bInterfaceProtocol */
    0x00,                                 /* iInterface */


    /* Audio Interface Descriptor - Audio Streaming Operational */
    /* Interface 1, Alternate Setting 1                                           */
    0x09,                                 /* bLength */
    USB_INTERFACE_DESCRIPTOR_TYPE,        /* bDescriptorType */
    0x01,                                 /* bInterfaceNumber */
    0x01,                                 /* bAlternateSetting */
    0x01,                                 /* bNumEndpoints */
    USB_DEVICE_CLASS_AUDIO,               /* bInterfaceClass */
    AUDIO_SUBCLASS_AUDIOSTREAMING,        /* bInterfaceSubClass */
    AUDIO_PROTOCOL_UNDEFINED,             /* bInterfaceProtocol */
    0x00,                                 /* iInterface */


    /* Audio Stream Audio Class descriptor */
    0x07,                                 /* bLength */
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
    AUDIO_STREAMING_GENERAL,              /* bDescriptorSubtype */
    0x01,                                 /* bTerminalLink */
    0x01,                                 /* bDelay */
    //0x02,                                 /* wFormatTag AUDIO_FORMAT_PCM8  0x0002*/
    0x01,                                 /* wFormatTag AUDIO_FORMAT_PCM  0x0001*/
    0x00,


    /* Audio Type I Format Interface Descriptor */
    0x0B,                                 /* bLength */
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
    AUDIO_STREAMING_FORMAT_TYPE,          /* bDescriptorSubtype */
    AUDIO_FORMAT_TYPE_I,                  /* bFormatType */
    0x02,                                 /* bNrChannels */
    0x02,                                 /* bSubFrameSize */
    0x10,                                    /* bBitResolution 0x8 default*/
    0x01,                                 /* bSamFreqType */
    0x80,                               /* tSamFreq 22000 = 0x55F0, for 48000 BB80*/
    0xBB,
    0x00,


    /* Isochronous endpoint descriptor */
    0x09,                                 /* bLength */
    USB_ENDPOINT_DESCRIPTOR_TYPE,         /* bDescriptorType */
    EP_ISOCHRONOUS_ADDRESS,               /* bEndpointAddress 1 out endpoint*/
    USB_ENDPOINT_TYPE_ISOCHRONOUS,        /* bmAttributes */
    EP_ISOCHRONOUS_MAX_PACKET_SIZE,       /* wMaxPacketSize 48*2*2 bytes*/
    0x00,
    0x01,                                 /* bInterval */
    0x00,                                 /* bRefresh */
    0x00,                                 /* bSynchAddress */


    /* Endpoint - Audio Streaming Descriptor*/
    0x07,                                 /* bLength */
    AUDIO_ENDPOINT_DESCRIPTOR_TYPE,       /* bDescriptorType */
    AUDIO_ENDPOINT_GENERAL,               /* bDescriptor */
    0x00,                                 /* bmAttributes */
    0x00,                                 /* bLockDelayUnits */
    0x00,                                 /* wLockDelay */
    0x00,




    /* USB Speaker Standard interface descriptor */
    0x09,  /* bLength */
    USB_INTERFACE_DESCRIPTOR_TYPE,        /* bDescriptorType */
    0x02,                                 /* bInterfaceNumber */
    0x00,                                 /* bAlternateSetting */
    0x00,                                 /* bNumEndpoints */
    0xFF,               /* bInterfaceClass */
    0x00,          /* bInterfaceSubClass */
    0x00,             /* bInterfaceProtocol */
    0x00,                                 /* iInterface */
    /* 09 byte*/


};

Outcomes