Full Duplex USB Audio with KDS 2.0

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Full Duplex USB Audio with KDS 2.0

1,620 Views
andrewdeliso
Contributor IV

Hello All,

 

I am trying to implement a USB Audio full duplex device.  I have the MIC function working fine based off the composite hid audio example.  I am trying to get the Speaker function to work and I am unable to configure the USB setup correctly.  The descriptor is correct, my Linux host has no issues with it and using wireshark I can see the packets being sent and they are being accepted.

 

Here is the snippets of the relevant code.

/* Audio generator stream endpoint information */ /* Direction from HOST view */ usb_device_endpoint_struct_t g_UsbDeviceAudioGeneratorEndpoints[USB_AUDIO_STREAM_ENDPOINT_COUNT] = {     /* Audio generator ISO IN pipe */     {         USB_AUDIO_STREAM_ENDPOINT | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),         USB_ENDPOINT_ISOCHRONOUS, FS_ISO_IN_ENDP_PACKET_SIZE,     },   /* Audio generator ISO OUT pipe */   {      USB_AUDIO_STREAM_OUT_ENDPOINT | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),      USB_ENDPOINT_ISOCHRONOUS, FS_ISO_IN_ENDP_PACKET_SIZE,   }, };   /* Audio generator control endpoint information */ usb_device_endpoint_struct_t g_UsbDeviceAudioControlEndpoints[USB_AUDIO_CONTROL_ENDPOINT_COUNT] = {     {         USB_AUDIO_CONTROL_ENDPOINT | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),         USB_ENDPOINT_INTERRUPT, FS_INTERRUPT_IN_PACKET_SIZE,     }, };   /* Audio generator entity struct */ usb_device_audio_entity_struct_t g_UsbDeviceAudioEntity[] = {     {         0x01, USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_INPUT_TERMINAL, 0U,     },     {         0x02, USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_INPUT_TERMINAL, 0U,     },     {         0x06, USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_OUTPUT_TERMINAL, 0U,     },     {         0x07, USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_OUTPUT_TERMINAL, 0U,     }, };   /* Audio generator entity information */ usb_device_audio_entities_struct_t g_UsbDeviceAudioEntities = {     g_UsbDeviceAudioEntity, sizeof(g_UsbDeviceAudioEntity) / sizeof(usb_device_audio_entity_struct_t), };   /* Audio generator control interface information */ usb_device_interface_struct_t g_UsbDeviceAudioControInterface[] = {{     0U,     {         USB_AUDIO_CONTROL_ENDPOINT_COUNT, g_UsbDeviceAudioControlEndpoints,     },     &g_UsbDeviceAudioEntities, }};   /* Audio generator stream interface information */ usb_device_interface_struct_t g_UsbDeviceAudioStreamInterface[] = {     {         0U,         {             0U, NULL,         },         NULL,     },     {         1U,         {             USB_AUDIO_STREAM_ENDPOINT_COUNT, g_UsbDeviceAudioGeneratorEndpoints,         },         NULL,     },   {   2U,   {   USB_AUDIO_STREAM_ENDPOINT_COUNT, g_UsbDeviceAudioGeneratorEndpoints,   },   NULL,   } };   /* Define interfaces for audio generator */ usb_device_interfaces_struct_t g_UsbDeviceAudioInterfaces[USB_AUDIO_GENERATOR_INTERFACE_COUNT] = {     {         USB_AUDIO_CLASS,                   /* Audio class code */         USB_SUBCLASS_AUDIOCONTROL,         /* Audio control subclass code */         USB_AUDIO_PROTOCOL,                /* Audio protocol code */         USB_AUDIO_CONTROL_INTERFACE_INDEX, /* The interface number of the Audio control */         g_UsbDeviceAudioControInterface,   /* The handle of Audio control */         sizeof(g_UsbDeviceAudioControInterface) / sizeof(usb_device_interfaces_struct_t),     },     {         USB_AUDIO_CLASS,                  /* Audio class code */         USB_SUBCLASS_AUDIOSTREAM,         /* Audio stream subclass code */         USB_AUDIO_PROTOCOL,               /* Audio protocol code */         USB_AUDIO_STREAM_INTERFACE_INDEX, /* The interface number of the Audio control */         g_UsbDeviceAudioStreamInterface,  /* The handle of Audio stream */         sizeof(g_UsbDeviceAudioStreamInterface) / sizeof(usb_device_interfaces_struct_t),     },     {         USB_AUDIO_CLASS,                  /* Audio class code */         USB_SUBCLASS_AUDIOSTREAM,         /* Audio stream subclass code */         USB_AUDIO_PROTOCOL,               /* Audio protocol code */         USB_AUDIO_STREAM_OUT_INTERFACE_INDEX, /* The interface number of the Audio control */         g_UsbDeviceAudioStreamInterface,  /* The handle of Audio stream */         sizeof(g_UsbDeviceAudioStreamInterface) / sizeof(usb_device_interfaces_struct_t),     } };

I feel that this config is wrong, but a can't find a example of how to configure it for 2 interfaces.  I am not getting any interrupts when the speaker endpoint is called.  Thou in wireshark I see successful transfers.

 

Here is the descriptor:

uint8_t g_UsbDeviceConfigurationDescriptor[USB_DESCRIPTOR_LENGTH_CONFIGURATION_ALL] = {     USB_DESCRIPTOR_LENGTH_CONFIGURE, /* Size of this descriptor in bytes */     USB_DESCRIPTOR_TYPE_CONFIGURE,   /* CONFIGURATION Descriptor Type */     USB_SHORT_GET_LOW(USB_DESCRIPTOR_LENGTH_CONFIGURATION_ALL),     USB_SHORT_GET_HIGH(         USB_DESCRIPTOR_LENGTH_CONFIGURATION_ALL), /* Total length of data returned for this configuration. */     USB_DEVICE_INTERFACE_COUNT,                   /* Number of interfaces supported by this configuration */     USB_COMPOSITE_CONFIGURE_INDEX,                /* Value to use as an argument to the                                                      SetConfiguration() request to select this configuration */     0x00U,                                        /* Index of string descriptor describing this configuration */     (USB_DESCRIPTOR_CONFIGURE_ATTRIBUTE_D7_MASK) |         (USB_DEVICE_CONFIG_SELF_POWER << USB_DESCRIPTOR_CONFIGURE_ATTRIBUTE_SELF_POWERED_SHIFT) |         (USB_DEVICE_CONFIG_REMOTE_WAKEUP << USB_DESCRIPTOR_CONFIGURE_ATTRIBUTE_REMOTE_WAKEUP_SHIFT),     /* Configuration characteristics        D7: Reserved (set to one)        D6: Self-powered        D5: Remote Wakeup        D4...0: Reserved (reset to zero)     */     USB_DEVICE_MAX_POWER, /* Maximum power consumption of the USB                            * device from the bus in this specific                            * configuration when the device is fully                            * operational. Expressed in 2 mA units                            *  (i.e., 50 = 100 mA).                            */       USB_DESCRIPTOR_LENGTH_INTERFACE,   /* Size of this descriptor in bytes */     USB_DESCRIPTOR_TYPE_INTERFACE,     /* INTERFACE Descriptor Type */     USB_AUDIO_CONTROL_INTERFACE_INDEX, /* Number of this interface. */     0x00U,                             /* Value used to select this alternate setting                                           for the interface identified in the prior field */     0x01U,                             /* Number of endpoints used by this                                           interface (excluding endpoint zero). */     USB_AUDIO_CLASS,                   /*The interface implements the Audio Interface class  */     USB_SUBCLASS_AUDIOCONTROL,         /*The interface implements the AUDIOCONTROL Subclass  */     0x00U,                             /*The interface doesn't use any class-specific protocols  */     0x00U,                             /* The device doesn't have a string descriptor describing this iInterface  */       /* Audio Class Specific type of INTERFACE Descriptor */     USB_AUDIO_CONTROL_INTERFACE_HEADER_LENGTH+1,   /* Size of the descriptor, in bytes  */     USB_DESCRIPTOR_TYPE_AUDIO_CS_INTERFACE,      /* CS_INTERFACE Descriptor Type   */     USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_HEADER, /* HEADER descriptor subtype   */     0x00U, 0x01U, /* Audio Device compliant to the USB Audio specification version 1.00  */     0x2A, 0x00U,  /* Total number of bytes returned for the class-specific AudioControl interface descriptor.                      Includes the combined length of this descriptor header and all Unit and Terminal                      descriptors. */     0x02U,        /* The number of AudioStreaming and MIDIStreaming interfaces in the Audio Interface Collection to                      which this AudioControl interface belongs   */     0x01U,        /* The number of AudioStreaming and MIDIStreaming interfaces in the Audio Interface baNumber */   0x02U,        /* The number of AudioStreaming and MIDIStreaming interfaces in the Audio Interface baNumber */       /* Audio Class Specific type of Input Terminal*/     USB_AUDIO_INPUT_TERMINAL_ONLY_DESC_SIZE, /* Size of the descriptor, in bytes  */     USB_DESCRIPTOR_TYPE_AUDIO_CS_INTERFACE,  /* CS_INTERFACE Descriptor Type   */     USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_INPUT_TERMINAL,     /* INPUT_TERMINAL descriptor subtype  */     0x01U,        /* Constant uniquely identifying the Terminal within the audio function. This value is used in all                      requests to address this Terminal.  */     0x01U, 0x01,  /* A USB Streaming.  */     0x00U,        /* This Input Terminal has no association  */     0x02U,        /* This Terminal's output audio channel cluster has 2 logical output channels  */     0x03U, 0x00U, /* Left Front (L) and Right Front (R) */     0x00U,        /* Index of a string descriptor, describing the name of the first logical channel.   */     0x00U,        /* Index of a string descriptor, describing the Input Terminal.   */       /* Audio Class Specific type of Input Terminal*/     USB_AUDIO_INPUT_TERMINAL_ONLY_DESC_SIZE, /* Size of the descriptor, in bytes  */     USB_DESCRIPTOR_TYPE_AUDIO_CS_INTERFACE,  /* CS_INTERFACE Descriptor Type   */     USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_INPUT_TERMINAL,     /* INPUT_TERMINAL descriptor subtype  */     0x02U,        /* Constant uniquely identifying the Terminal within the audio function. This value is used in all                      requests to address this Terminal.  */     0x01U, 0x02,  /* A generic microphone that does not fit under any of the other classifications.  */     0x00U,        /* This Input Terminal has no association  */     0x01U,        /* This Terminal's output audio channel cluster has 1 logical output channels  */     0x00U, 0x00U, /* Mono */     0x00U,        /* Index of a string descriptor, describing the name of the first logical channel.   */     0x00U,        /* Index of a string descriptor, describing the Input Terminal.   */       /* Audio Class Specific type of  Output Terminal */     USB_AUDIO_OUTPUT_TERMINAL_ONLY_DESC_SIZE, /* Size of the descriptor, in bytes  */     USB_DESCRIPTOR_TYPE_AUDIO_CS_INTERFACE,   /* CS_INTERFACE Descriptor Type   */     USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_OUTPUT_TERMINAL,     /* OUTPUT_TERMINAL descriptor subtype  */     0x06,         /* Constant uniquely identifying the Terminal within the audio function*/     0x01U, 0x03U, /* Speaker Interface */     0x00U,        /*  This Output Terminal has no association   */     0x01U,        /* ID of the Unit or Terminal to which this Terminal is connected.   */     0x00U,        /* Index of a string descriptor, describing the Output Terminal.  */       /* Audio Class Specific type of  Output Terminal */     USB_AUDIO_OUTPUT_TERMINAL_ONLY_DESC_SIZE, /* Size of the descriptor, in bytes  */     USB_DESCRIPTOR_TYPE_AUDIO_CS_INTERFACE,   /* CS_INTERFACE Descriptor Type   */     USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_OUTPUT_TERMINAL,     /* OUTPUT_TERMINAL descriptor subtype  */     0x07,         /* Constant uniquely identifying the Terminal within the audio function*/     0x01U, 0x01U, /* A Terminal dealing with a signal carried over an endpoint in an AudioStreaming interface */     0x00U,        /*  This Output Terminal has no association   */     0x02U,        /* ID of the Unit or Terminal to which this Terminal is connected.   */     0x00U,        /* Index of a string descriptor, describing the Output Terminal.  */   // End of Control Section     // Optional Control endpoint....     USB_DESCRIPTOR_LENGTH_AC_INTERRUPT_ENDPOINT, /* Size of this descriptor, in bytes: 9U */     USB_DESCRIPTOR_TYPE_ENDPOINT,                /* ENDPOINT descriptor type */     USB_AUDIO_CONTROL_ENDPOINT | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),     /* Endpoint address */     USB_ENDPOINT_INTERRUPT, /* Transfer type */     USB_SHORT_GET_LOW(FS_INTERRUPT_IN_PACKET_SIZE), USB_SHORT_GET_HIGH(FS_INTERRUPT_IN_PACKET_SIZE),     /* Max Packet Size */     FS_INTERRUPT_IN_INTERVAL, /* Interval */     0, 0,   /* MIC to the Host on the USB Interface */     /* Audio Class Specific INTERFACE Descriptor, alternative interface 0  */     USB_DESCRIPTOR_LENGTH_INTERFACE,  /* Descriptor size is 9 bytes  */     USB_DESCRIPTOR_TYPE_INTERFACE,    /* INTERFACE Descriptor Type   */     USB_AUDIO_STREAM_INTERFACE_INDEX, /* The number of this interface is 1.  */     0x00U,                            /* The value used to select the alternate setting for this interface is 0   */     0x00U,                    /* The number of endpoints used by this interface is 0 (excluding endpoint zero)   */     USB_AUDIO_CLASS,          /* The interface implements the Audio Interface class   */     USB_SUBCLASS_AUDIOSTREAM, /* The interface implements the AUDIOSTREAMING Subclass   */     0x00U,                    /* The interface doesn't use any class-specific protocols   */     0x00U,                    /* The device doesn't have a string descriptor describing this iInterface  */       /* Audio Class Specific INTERFACE Descriptor, alternative interface 1 */     USB_DESCRIPTOR_LENGTH_INTERFACE,  /* Descriptor size is 9 bytes  */     USB_DESCRIPTOR_TYPE_INTERFACE,    /* INTERFACE Descriptor Type  */     USB_AUDIO_STREAM_INTERFACE_INDEX, /*The number of this interface is 1.  */     0x01U,                            /* The value used to select the alternate setting for this interface is 1  */     0x01U,                    /* The number of endpoints used by this interface is 1 (excluding endpoint zero)    */     USB_AUDIO_CLASS,          /* The interface implements the Audio Interface class   */     USB_SUBCLASS_AUDIOSTREAM, /* The interface implements the AUDIOSTREAMING Subclass   */     0x00U,                    /* The interface doesn't use any class-specific protocols  */     0x00U,                    /* The device doesn't have a string descriptor describing this iInterface  */       /* Audio Class Specific CS INTERFACE Descriptor*/     USB_AUDIO_STREAMING_IFACE_DESC_SIZE,            /* Size of the descriptor, in bytes  */     USB_DESCRIPTOR_TYPE_AUDIO_CS_INTERFACE,         /* CS_INTERFACE Descriptor Type  */     USB_DESCRIPTOR_SUBTYPE_AUDIO_STREAMING_GENERAL, /* AS_GENERAL descriptor subtype  */     0x07U,        /* The Terminal ID of the Terminal to which the endpoint of this interface is connected. */     0x00U,        /* Delay introduced by the data path. Expressed in number of frames.  */     0x01U, 0x00U, /* PCM16  */       /* Audio Class Specific type I format INTERFACE Descriptor */     USB_AUDIO_STREAMING_TYPE_I_DESC_SIZE,   /* Size of the descriptor, in bytes  */     USB_DESCRIPTOR_TYPE_AUDIO_CS_INTERFACE, /* CS_INTERFACE Descriptor Type   */     USB_DESCRIPTOR_SUBTYPE_AUDIO_STREAMING_FORMAT_TYPE,     /* FORMAT_TYPE descriptor subtype  */     USB_AUDIO_FORMAT_TYPE_I, /* FORMAT_TYPE_I  */     0x01U,                   /* Indicates the number of physical channels in the audio data stream.  */     0x02U,                   /* The number of bytes occupied by one audio subframe. Can be 1, 2, 3 or 4.   */     0x10U,                   /* The number of effectively used bits from the available bits in an audio subframe.*/     0x01U,                   /* Indicates how the sampling frequency can be programmed:   */     0x40, 0x1F, 0x00U,       /* Sampling frequency 1 in Hz for this isochronous data endpoint.   */       /* ENDPOINT Descriptor */     USB_ENDPOINT_AUDIO_DESCRIPTOR_LENGTH,      /* Descriptor size is 9 bytes  */     USB_DESCRIPTOR_TYPE_ENDPOINT,              /* ENDPOINT Descriptor Type   */     USB_AUDIO_STREAM_ENDPOINT | (USB_IN << 7), /* This is an IN endpoint with endpoint number 2   */     USB_ENDPOINT_ISOCHRONOUS,                  /* Types - Transfer: ISOCHRONOUS */     USB_SHORT_GET_LOW(FS_ISO_IN_ENDP_PACKET_SIZE),     USB_SHORT_GET_HIGH(FS_ISO_IN_ENDP_PACKET_SIZE), /* Maximum packet size for this endpoint is 8 Bytes.  */     ISO_IN_ENDP_INTERVAL, /* The polling interval value is every 1 Frames. If Hi-Speed, every 1 uFrames   */     0x00U,                /* Refresh Rate 2**n ms where n = 0   */     0x00U,                /* Synchronization Endpoint (if used) is endpoint 0   */       /* Audio Class Specific ENDPOINT Descriptor  */     USB_AUDIO_STREAMING_ENDP_DESC_SIZE,      /*  Size of the descriptor, in bytes  */     USB_AUDIO_STREAM_ENDPOINT_DESCRIPTOR,    /* CS_ENDPOINT Descriptor Type  */     USB_AUDIO_EP_GENERAL_DESCRIPTOR_SUBTYPE, /* AUDIO_EP_GENERAL descriptor subtype  */     0x00U,                                   /* Bit 0: Sampling Frequency 0                                                 Bit 1: Pitch 0                                                 Bit 7: MaxPacketsOnly 0   */     0x00U,                                   /* Indicates the units used for the wLockDelay field: 0: Undefined  */     0x00U, 0x00U, /* Indicates the time it takes this endpoint to reliably lock its internal clock recovery                      circuitry */     /* Speaker from the Host on the USB Interface */   /* Audio Class Specific INTERFACE Descriptor, alternative interface 0  */   USB_DESCRIPTOR_LENGTH_INTERFACE,  /* Descriptor size is 9 bytes  */   USB_DESCRIPTOR_TYPE_INTERFACE,    /* INTERFACE Descriptor Type   */   USB_AUDIO_STREAM_OUT_INTERFACE_INDEX, /* The number of this interface is 2.  */   0x00U,                            /* The value used to select the alternate setting for this interface is 0   */   0x00U,                    /* The number of endpoints used by this interface is 0 (excluding endpoint zero)   */   USB_AUDIO_CLASS,          /* The interface implements the Audio Interface class   */   USB_SUBCLASS_AUDIOSTREAM, /* The interface implements the AUDIOSTREAMING Subclass   */   0x00U,                    /* The interface doesn't use any class-specific protocols   */   0x00U,                    /* The device doesn't have a string descriptor describing this iInterface  */     /* Audio Class Specific INTERFACE Descriptor, alternative interface 1 */   USB_DESCRIPTOR_LENGTH_INTERFACE,  /* Descriptor size is 9 bytes  */   USB_DESCRIPTOR_TYPE_INTERFACE,    /* INTERFACE Descriptor Type  */   USB_AUDIO_STREAM_OUT_INTERFACE_INDEX, /*The number of this interface is 2.  */   0x01U,                            /* The value used to select the alternate setting for this interface is 1  */   0x01U,                    /* The number of endpoints used by this interface is 1 (excluding endpoint zero)    */   USB_AUDIO_CLASS,          /* The interface implements the Audio Interface class   */   USB_SUBCLASS_AUDIOSTREAM, /* The interface implements the AUDIOSTREAMING Subclass   */   0x00U,                    /* The interface doesn't use any class-specific protocols  */   0x00U,                    /* The device doesn't have a string descriptor describing this iInterface  */     /* Audio Class Specific CS INTERFACE Descriptor*/   USB_AUDIO_STREAMING_IFACE_DESC_SIZE,            /* Size of the descriptor, in bytes  */   USB_DESCRIPTOR_TYPE_AUDIO_CS_INTERFACE,         /* CS_INTERFACE Descriptor Type  */   USB_DESCRIPTOR_SUBTYPE_AUDIO_STREAMING_GENERAL, /* AS_GENERAL descriptor subtype  */   0x01U,        /* The Terminal ID of the Terminal to which the endpoint of this interface is connected. */   0x00U,        /* Delay introduced by the data path. Expressed in number of frames.  */   0x01U, 0x00U, /* PCM16  */     /* Audio Class Specific type I format INTERFACE Descriptor */   USB_AUDIO_STREAMING_TYPE_I_DESC_SIZE,   /* Size of the descriptor, in bytes  */   USB_DESCRIPTOR_TYPE_AUDIO_CS_INTERFACE, /* CS_INTERFACE Descriptor Type   */   USB_DESCRIPTOR_SUBTYPE_AUDIO_STREAMING_FORMAT_TYPE,   /* FORMAT_TYPE descriptor subtype  */   USB_AUDIO_FORMAT_TYPE_I, /* FORMAT_TYPE_I  */   0x02U,                   /* Indicates the number of physical channels in the audio data stream.  */   0x02U,                   /* The number of bytes occupied by one audio subframe. Can be 1, 2, 3 or 4.   */   0x10U,                   /* The number of effectively used bits from the available bits in an audio subframe.*/   0x01U,                   /* Indicates how the sampling frequency can be programmed:   */   0x40, 0x1F, 0x00U,       /* Sampling frequency 1 in Hz for this isochronous data endpoint.   */     /* ENDPOINT Descriptor */   USB_ENDPOINT_AUDIO_DESCRIPTOR_LENGTH,      /* Descriptor size is 9 bytes  */   USB_DESCRIPTOR_TYPE_ENDPOINT,              /* ENDPOINT Descriptor Type   */   USB_AUDIO_STREAM_OUT_ENDPOINT | (USB_OUT << 7), /* This is an OUT endpoint with endpoint number 2   */   USB_ENDPOINT_ISOCHRONOUS,                  /* Types - Transfer: ISOCHRONOUS */   USB_SHORT_GET_LOW(FS_ISO_IN_ENDP_PACKET_SIZE),   USB_SHORT_GET_HIGH(FS_ISO_IN_ENDP_PACKET_SIZE), /* Maximum packet size for this endpoint is 8 Bytes.  */   ISO_IN_ENDP_INTERVAL, /* The polling interval value is every 1 Frames. If Hi-Speed, every 1 uFrames   */   0x00U,                /* Refresh Rate 2**n ms where n = 0   */   0x00U,                /* Synchronization Endpoint (if used) is endpoint 0   */     /* Audio Class Specific ENDPOINT Descriptor  */   USB_AUDIO_STREAMING_ENDP_DESC_SIZE,      /*  Size of the descriptor, in bytes  */   USB_AUDIO_STREAM_ENDPOINT_DESCRIPTOR,    /* CS_ENDPOINT Descriptor Type  */   USB_AUDIO_EP_GENERAL_DESCRIPTOR_SUBTYPE, /* AUDIO_EP_GENERAL descriptor subtype  */   0x00U,                                   /* Bit 0: Sampling Frequency 0                                                  Bit 1: Pitch 0                                                  Bit 7: MaxPacketsOnly 0   */   0x00U,                                   /* Indicates the units used for the wLockDelay field: 0: Undefined  */   0x00U, 0x00U, /* Indicates the time it takes this endpoint to reliably lock its internal clock recovery                   circuitry */       /* Interface Descriptor */     USB_DESCRIPTOR_LENGTH_INTERFACE, /* Size of this descriptor in bytes */     USB_DESCRIPTOR_TYPE_INTERFACE,   /* INTERFACE Descriptor Type */     0x03,                            /* Number of this interface. */     0x00U,                           /* Value used to select this alternate setting                                         for the interface identified in the prior field */     USB_HID_GAMEPAD_ENDPOINT_COUNT,    /* Number of endpoints used by this                                         interface (excluding endpoint zero). */     USB_HID_GAMEPAD_CLASS,             /* Class code (assigned by the USB-IF). */     USB_HID_GAMEPAD_SUBCLASS,          /* Subclass code (assigned by the USB-IF). */     USB_HID_GAMEPAD_PROTOCOL,          /* Protocol code (assigned by the USB). */     0x00U,                           /* Index of string descriptor describing this interface */       USB_DESCRIPTOR_LENGTH_HID, /* Numeric expression that is the total size of the HID descriptor. */     USB_DESCRIPTOR_TYPE_HID,   /* Constant name specifying type of HID descriptor. */     0x00U, 0x01U,              /* Numeric expression identifying the HID Class Specification release. */     0x00U,                     /* Numeric expression identifying country code of the localized hardware */     0x01U, /* Numeric expression specifying the number of class descriptors(at least one report descriptor) */     USB_DESCRIPTOR_TYPE_HID_REPORT, /* Constant name identifying type of class descriptor. */     USB_SHORT_GET_LOW(USB_DESCRIPTOR_LENGTH_HID_GAMEPAD_REPORT),     USB_SHORT_GET_HIGH(USB_DESCRIPTOR_LENGTH_HID_GAMEPAD_REPORT),     /* Numeric expression that is the total size of the Report descriptor. */     USB_DESCRIPTOR_LENGTH_ENDPOINT, /* Size of this descriptor in bytes */     USB_DESCRIPTOR_TYPE_ENDPOINT,   /* ENDPOINT Descriptor Type */     USB_HID_GAMEPAD_ENDPOINT | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),     /* The address of the endpoint on the USB device        described by this descriptor. */     USB_ENDPOINT_INTERRUPT, /* This field describes the endpoint's attributes */     USB_SHORT_GET_LOW(FS_INTERRUPT_IN_PACKET_SIZE),     USB_SHORT_GET_HIGH(FS_INTERRUPT_IN_PACKET_SIZE), /* Maximum packet size this endpoint is capable of                                                         sending or receiving when this configuration is selected. */     FS_INTERRUPT_IN_INTERVAL,                        /* Interval for polling endpoint for data transfers. */ };

 

Thanks for the help.

Andrew

Labels (1)
Tags (1)
0 Kudos
2 Replies

691 Views
andrewdeliso
Contributor IV

Hi All,

I looking deeper into this I think I found the issue.  The KSDK 2.0 only supports 1 audio streaming endpoint.  In usb_status_t USB_DeviceAudioStreamEndpointsInit(usb_device_audio_struct_t *audioHandle) [ usb_device_audio.c] breaks on the first streaming interface found, and only stores 1 stream interface number.   Based on the USB Audio spec as I read it, only 1 ISO data stream is allowed per interface.  So to accomplish input and output I need a second interface and hence the bug.

Can someone confirm this analysis?

Thanks,

Andrew

0 Kudos

691 Views
isaacavila
NXP Employee
NXP Employee

Hello Andrew,

Sorry for late response, Indeed, you need to configure 2 interfaces (one for ISO OUT data and other for ISO IN data) and also another interface to describe the topology for your audio device (features, units, terminals, etc). At least, 3 interfaces should be defined in order to be detected correctly.

You can give a look to this thread: https://community.nxp.com/thread/379812 

I hope this helps!

Regards,

Isaac

0 Kudos