Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

USB Audio Descriptor

I'm trying to implement a PIC32 MCU as a Audio device, using USB audio class 1. I have implementet this project: PIC32 USB Digital Audio Accesory Board Demos.zip and it works fine, but now i want to cut away some of the Audio Control Interface, so i'm having a more simple Audio function:

USB Topology

The device seems to get enumerated properly acording to the status LED's on the board, and it appears in Device Manager's list of audio devices, but it has a small yellow exclamation mark.. And when i plug in the device, windows tells me: "Device driver software was not succesfully installed"

Anybody has a clue?

USB descriptors, block of code:

ROM BYTE configDescriptor1[] ={
//CD
0x09,               // Size : 9 Bytes
0x02,               // Configuration Descriptor (0x02)
//0xE4,               // Total length in bytes of data returned   Includes the combined length of all descriptors (configuration, interface, endpoint, and class- or vendor-specific) returned for this configuration.
0xB4,               // Ved simpel Audio Function
0x00,               //      2. Byte af Total Length   // 228
0x03,               // Number of Interfaces: 3
0x01,               // bConfigurationValue, Value to use as an argument to select this configuration
0x00,               // iConfiguration, Index of String Descriptor describing this configuration
_DEFAULT | _SELF,   // bmAttributes, 0b01100000 -> D6: Self-powered, D7: Reserved (set to one)
0xFA,               // Maximum Power : 250 * 2mA = 0,5A

//ID    - INTERFACE 0 Control
0x09,       // Size : 9 Bytes
0x04,       // Interface Descriptor (0x04)
0x00,       // Number of Interface:                     Interface nr 0
0x00,       // Value used to select alternative setting
0x00,       // Number of Endpoints used for this interface, 0
0x01,       // Class Code (Assigned by USB Org),        AUDIO
0x01,       // Subclass Code (Assigned by USB Org),     AUDIOCONTROL
0x00,       // Protocol Code (Assigned by USB Org)
0x00,       // Index of String Descriptor Describing this interface

    //ACID  - HEADER
    0x0A,           // Size : 10 Bytes
    0x24,           // CS_INTERFACE Descriptor Type
    0x01,           // HEADER descriptor subtype
    0x00,0x01,      // Audio Device compliant to the USB Audio specification version 1.00
    //0x64,0x00,    // 100 bytes - 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.
    0x00,0x34,      // wTotalLength
    0x02,           // bInCollection -> Number of streaming interfaces = 2
    0x01,           // baInterfaceNr(1) -> 0x01 = 1 -> Interface number of the first AudioStreaming interface in the Collection
    0x02,           // baInterfaceNr(2) -> 0x02 = 2 -> Interface number of the second AudioStreaming interface in the Collection

    //ACID  - INPUT_TERMINAL    ID = 1
    0x0C,           // size : 12 bytes
    0x24,           // CS_INTERFACE Descriptor Type
    0x02,           // INPUT_TERMINAL - Descriptor subtype = 2
    0x01,           // ID of this Input Terminal. // Constant uniquely identifying the Terminal within the audio function.
    0x01,0x01,      // wTerminalType -> 0x0101 = USB streamming
    0x00,           // bAssocTerminal -> 0x00 = No association.
    //0x03,           // bAssocTerminal -> 0x03 = Associated with OUTPUT TERMINAL 3
    0x02,           // bNrChannels -> 0x02 two channel.
    0x03,0x00,      // wChannelConfig -> 0x0003 = stereo, Right / Left    // se Audio Devices Dok side 34
    //0x00,0x00,      // wChannelConfig -> 0x0000 = mono ?
    0x00,           // iChannelNames -> 0x00 = Unused.
    0x00,           // iTerminal -> 0x00 = Unused.

    //ACID  - INPUT_TERMINAL    ID = 4
    0x0C,           // size : 12 bytes
    0x24,           // CS_INTERFACE Descriptor Type
    0x02,           // INPUT_TERMINAL - Descriptor subtype
    0x04,           // bTerminalID -> ID of this Input Terminal = 4
    0x01,0x02,      // wTerminalType -> 0x0201 = Microphone
    0x00,           // bAssocTerminal -> 0x00 = No association.
    //0x06,           // bAssocTerminal -> 0x06 = Associated with OUTPUT TERMINAL 6
    0x01,           // bNrChannels -> 0x01 one channel.
    0x01,0x00,      // wChannelConfig -> Left Front       <- original fra ex.
    //0x00,0x00,      // wChannelConfig -> 0x0000 = mono
    0x00,           // iChannelNames -> 0x00 = Unused.
    0x00,           // iTerminal -> 0x00 = Unused.

    //ACID  - OUTPUT_TERMINAL   ID = 3
    0x09,           // size : 9 Bytes
    0x24,           // CS_INTERFACE Descriptor Type
    0x03,           // OUTPUT_TERMINAL - Descriptor subtype
    0x03,           // bTerminalID -> ID of this Output Terminal = 3
    0x01,0x03,      // wTerminalType -> 0x0301 = Speaker
    0x00,           // bAssocTerminal -> 0x00 = Unused
    //0x01,           // bAssocTerminal -> 0x01 = Associated with INPUT TERMINAL 1
    //0x02,           // bSourceID -> 0x02 = From FEATURE_UNIT ID 2 = USB stream
    0x01,           // bSourceID -> 0x01 = From Input Terminal ID 1
    0x00,           // iTerminal -> 0x00 = Unused.


    //ACID  - OUTPUT_TERMINAL   ID = 6
    0x09,           // Size : 9 Bytes
    0x24,           // CS_INTERFACE Descriptor Type
    0x03,           // OUTPUT_TERMINAL - Descriptor subtype
    0x06,           // bTerminalID -> ID of this Output Terminal = 6
    0x01,0x01,      // wTerminalType -> 0x0101 = USB streaming
    0x00,           // bAssocTerminal -> 0x00 = Unused
    //0x04,           // bAssocTerminal -> 0x04 = Associated with INPUT TERMINAL 4
    //0x09,           // bSourceID -> 0x09 = From Selector Unit ID 9
    0x04,           // bSourceID -> 0x04 = From INPUT_TERMINAL ID 4
    0x00,           // iTerminal -> 0x00 = Unused.


/* #####   INTERFACE 1     -     OUT  ##### */

//ID    - INTERFACE 1/0 Stream
0x09,                       // Size : 9 Bytes
0x04,                       // Interface Descriptor (0x04)
0x01,                       // bInterfaceNumber -> 0x01 Interface ID = 1        Number of this interface. Zero-based value identifying the index in the array of concurrent interfaces supported by this configuration.
0x00,                       // bAlternateSetting -> 0x00 = index of this interface's alternate setting
0x00,                       // bNumEndpoints -> 0x00 = 0 Endpoints to this interface
0x01,                       // bInterfaceClass -> 0x01 = Audio Interface
0x02,                       // bInterfaceSubclass -> 0x02 = AUDIO_STREAMING
0x00,                       // bInterfaceProtocol -> 0x00 = Unused
0x00,                       // iInterface -> 0x00 = Unused

//ID    - INTERFACE 1/1 Stream
0x09,                       // Size : 9 Bytes
0x04,                       // Interface Descriptor (0x04)
0x01,                       // bInterfaceNumber -> 0x01 Interface ID = 1
0x01,                       // bAlternateSetting -> 0x01 = index of this interface's alternate setting
0x01,                       // bNumEndpoints -> 0x01 = 1 Endpoints to this interface
0x01,                       // bInterfaceClass -> 0x01 = Audio Interface
0x02,                       // bInterfaceSubclass -> 0x02 = AUDIO_STREAMING
0x00,                       // bInterfaceProtocol -> 0x00 = Unused
0x00,                       // iInterface -> 0x00 = Unused

    //ASID  - GENERAL
    0x07,                   // Size : 7 Bytes
    0x24,                   // CS_INTERFACE Descriptor Type
    0x01,                   // bDescriptorSubtype -> 0x01 = GENERAL subtype
    0x01,                   // bTerminalLink -> 0x01 = The Terminal ID of the Terminal to which the endpoint of this interface is connected.
    0x01,                   // bDelay -> 0x01 = Delay (delta) introduced by the data path (see Section 3.4, ?Inter Channel Synchronization? - in Audio Devices). Expressed in number of frames.
    0x01,0x00,              // wFormatTag -> 0x0001 = PCM

    //ASID  - FORMAT_TYPE
    0x0E,                   // Size : 14 Bytes
    0x24,                   // CS_INTERFACE Descriptor Type
    0x02,                   // bDescriptorSubtype -> 0x02 = FORMAT_TYPE
    0x01,                   // bFormatType -> 0x01 = FORMAT_TYPE_I -> ref: A.1.1  Audio Data Format Type I Codes -> Audio Data Format Dok
    0x02,                   // bNrChannels -> 0x02 = Two channels
    0x02,                   // bSubFrameSize -> 0x02 = 2 bytes pr audio subframe
    0x10,                   // bBitResolution -> 0x10 = 16 bit pr sample
    0x02,                   // bSamFreqType -> 0x02 = 2 sample frequencies supported
    0x80,0xBB,0x00,         // tSamFreq -> 0xBB80 = 48000 Hz
    0x00,0x7D,0x00,         // tSamFreq -> 0x7D00 = 32000 Hz
    //0x44,0xAC,0x00,

//ED    - ENDPOINT  OUT
0x09,                   // Size : 9 Bytes
0x05,                   // 0x05 -> ENDPOINT Descriptor Type
0x01,                   // bEndpointAddress -> 0x01 = adress 1, OUT, -> ref 9.6.6 Endpoint -> usb_20 Dok
0x09,                   // bmAttributes -> 0b00001001 -> Bits 0-1 = 01 = Isochronous , Bits 2-3 = 10 = Adaptive
AUDIO_MAX_SAMPLES * sizeof ( AUDIO_PLAY_SAMPLE ), 0x00,  // wMaxPacketSize -> 48 * 4 = 0x0030 :Maximum packet size this endpoint is capable of sending or receiving when this configuration is selected.
0x01,                   // bInterval -> 0x01 = 1 millisecond
0x00,                   // ?? not described -> 0x00 = Unused
0x00,                   // ?? not described -> 0x00 = Unused

    //CSED     - CS ENDPOINT
    0x07,               // Size : 7 Bytes
    0x25,               // CS_ENDPOINT
    0x01,               // bDescriptorSubtype -> 0x01 = GENERAL
    0x01,               // bmAttributes -> 0b00000001 = Bit 1 = 1 => Sample Freq Control is supported by this endpoint
    0x00,               // bLockDelayUnits -> 0x00 = Indicates the units used for the wLockDelay field: 0 = Undefined
    0x00,0x00,          //  the time it takes this endpoint to reliably lock its internal clock recovery circuitry.


/* #####   INTERFACE 2     -     IN  ##### */


//ID    - INTERFACE 2/0 Stream
0x09,                       // Size : 9 Bytes
0x04,                       // Interface Descriptor (0x04)
0x02,                       // bInterfaceNumber -> 0x02 Interface ID = 2
0x00,                       // bAlternateSetting -> 0x00 = Value used to select this alternate setting for the interface identified in the prior field
0x00,                       // bNumEndpoints -> 0x00 = 0 -> Number of endpoints used by this interface
0x01,                       // bInterfaceClass -> 0x01 = 1 = AUDIO
0x02,                       // bInterfaceSubClass -> 0x02 = AUDIO_STREAMING
0x00,                       // bInterfaceProtocol -> 0x00 = Unused
0x00,                       // iInterface -> 0x00 = Unused -> Index of string descriptor.

//ID    - INTERFACE 2/1 Stream
0x09,                       // Size : 9 Bytes
0x04,                       // Interface Descriptor (0x04)
0x02,                       // bInterfaceNumber -> 0x02 Interface ID = 2
0x01,                       // bAlternateSetting -> 0x01 = Value used to select this alternate setting for the interface identified in the prior field
0x01,                       // bNumEndpoints -> 0x01 = 1 -> Number of endpoints used by this interface
0x01,                       // bInterfaceClass -> 0x01 = 1 = AUDIO
0x02,                       // bInterfaceSubClass -> 0x02 = AUDIO_STREAMING
0x00,                       // bInterfaceProtocol -> 0x00 = Unused
0x00,                       // iInterface -> 0x00 = Unused -> Index of string descriptor.

    //ASID      -    GENERAL
    0x07,                   // Size : 7 Bytes
    0x24,                   // CS_INTERFACE Descriptor Type
    0x01,                   // GENERAL Descriptor
    0x06,                   // bTerminalLink -> 0x06 = The Terminal ID of the Terminal to which the endpoint of this interface is connected = 6
    0x01,                   // bDelay -> 0x01 = Delay (delta) introduced by the data path (see Section 3.4, ?Inter Channel Synchronization? - in Audio Devices). Expressed in number of frames.
    0x01,0x00,              // wFormatTag -> 0x0001 = PCM

    //ASID       -    FORMAT_TYPE
    0x0E,                   // Size : 14 Bytes
    0x24,                   // CS_INTERFACE Descriptor Type
    0x02,                   // bDescriptorSubtype -> 0x02 = FORMAT_TYPE
    0x01,                   // bFormatType -> 0x01 = FORMAT_TYPE_I -> ref: A.1.1  Audio Data Format Type I Codes -> Audio Data Format Dok
    0x02,                   // bNrChannels -> 0x02 = Two channels
    0x02,                   // bSubFrameSize -> 0x02 = 2 bytes pr audio subframe
    //0x03,                   // bSubFrameSize -> 0x03 = 3 bytes pr audio subframe
    0x10,                   // bBitResolution -> 0x10 = 16 bit pr sample
    //0x18,                   // bBitResolution -> 0x18 = 24 bit pr sample
    0x02,                   // bSamFreqType -> 0x02 = 2 sample frequencies supported
    0x80,0xBB,0x00,         // tSamFreq -> 0xBB80 = 48000 Hz
    0x00,0x7D,0x00,         // tSamFreq -> 0x7D00 = 32000 Hz
    //0x44,0xAC,0x00,       // 44100 Hz


//ED      -   ENDPOINT  IN
0x09,                   // Size : 9 Bytes
0x05,                   // 0x05 -> ENDPOINT Descriptor Type
0x82,                   // bEndpointAddress -> 0x82 = adress 2, IN, -> ref 9.6.6 Endpoint -> usb_20 Dok
0x05,                   // bmAttributes -> 0b00000101 -> Bits 0-1 = 01 = Isochronous , Bits 2-3 = 01 = Asynchronous
AUDIO_MAX_SAMPLES * (sizeof ( AUDIO_PLAY_SAMPLE )), 0x00,     // wMaxPacketSize -> 48 * 4 = 0x0030 :Maximum packet size this endpoint is capable of sending or receiving when this configuration is selected.
//0x20,0x01,
0x01,                   // bInterval -> 0x01 = 1 millisecond
0x00,                   // bRefresh -> ??
0x00,                   // bSynchAddress -> ??

    //CSED      - CS ENDPOINT
    0x07,               // Size : 7 Bytes
    0x25,               // bDescriptorType -> 0x25 = CS_ENDPOINT
    0x01,               // bDescriptorSubtype -> 0x01 = GENERAL
    0x01,               // bmAttributes -> 0b00000001 = Bit 1 = 1 => Sample Freq Control is supported by this endpoint
    0x00,               // bLockDelayUnits -> 0x00 = Indicates the units used for the wLockDelay field: 0 = Undefined
    0x00,0x00,          //  the time it takes this endpoint to reliably lock its internal clock recovery circuitry
};
like image 203
Wiingaard Avatar asked May 07 '14 13:05

Wiingaard


People also ask

What is USB audio profile?

USB audio is a digital audio connection used to send digital music from your computer to a digital to analogue converter (DAC).

What is USB audio Class?

USB device classes employ transfer types that suit the needs of particular applications and systems. The USB Audio class uses the isochronous transfer type to stream audio across a USB link.

How many audio channels can USB handle?

At the theoretical maximum USB 2 bandwidth, you'd be able to record just over 40 tracks of 24-bit, 96kHz audio, while halving the sample rate to 48kHz would give you 80 tracks.


1 Answers

So i solved my question!

As chris commented, i had to implement some sort of control, into the control interface. First i added two Feature units, as seen on the picture. I implemented made then support no controls, by setting:

bmaControls(1) = 0x00     // No control support

This cause windows to install the device driver properly, but i still couldn't see the microphone in "Recording Devices" in the sound settings. The i implemented Mute control, by changing the control parameter to:

bmaControls(1) = 0x01     // Mute support

Now i could see the microphone in the settings, but the gain was different from what i expected. Then i changed the controls to Volume control, by changing the control parameter to:

bmaControls(1) = 0x02     // Volume support

This made the microphone work as i expected... Thanks Chris!

Simpel Audio Control Interface

like image 60
Wiingaard Avatar answered Nov 05 '22 17:11

Wiingaard