سؤال

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
};
هل كانت مفيدة؟

المحلول

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top