Re: [PATCH 0/8] USB Audio Gadget part 2: Feedback endpoint, Volume/Mute support

From: Ruslan Bilovol
Date: Tue Mar 02 2021 - 02:10:34 EST


Hi Johannes,

On Mon, Mar 1, 2021 at 6:49 PM Johannes Freyberger
<Johannes@xxxxxxxxxxxxx> wrote:
>
> Hi Ruslan,
>
> thanks for all your efforts to make the USB Audio Gadget work in Win10 using
> UAC2. Meanwhile I managed to apply and compile your previous modifications
> and now my Raspberry PI shows up in the Windows Device Manager as a valid
> UAC2 audio device. Unfortunately it still doesn't work to transfer any audio
> as it seems the audio endpoints or the topology is not working.

Are you testing my previous version of the patches on some older kernel?

Just for records - these two patch sets (part 1 and part 2) are based on Greg's
usb-next branch (commit b5a12546e779d4f5586f58e60e0ef5070a833a64 which
is based on v5.11-rc5 tag). I retested them today with a BBB board and it works
fine under Win 10. Also I rebased these two patchsets today against latest
Greg's usb-next branch which is now Linus's v5.12-rc1 tag and again it works
fine under Win10 - both Volume/Mute controls and audio streaming.

These patches have been tested previously on Raspberry PI 4 running v5.9
and v5.10 stable kernels. The only issues I've seen were because of
Raspberry's DWC2 DMA issue in the driver that I described in this cover letter.
However if you disable volume/mute controls, it won't affect you.

> I checked it
> with some tools and found one providing some information on the USB part
> (it's called UVCview.exe and is part of the Windows Driver Kit). Here's the
> output which I hope can give some hints on the problems still existing in
> this driver:

>From the output below I see UAC2 descriptors are completely screwed up
(or UVCview.exe doesn't show them correctly). Windows is very strict to
the descriptors and doesn't allow devices to start in case of any issues.
So if it appears as a valid UAC2 device in Device Manager, most likely
UVCview.exe doesn't decode UAC2 descriptors well.

Could you please also apply these patches to the latest kernel (v5.12-rc1)
and test?

Thanks,
Ruslan

>
> ---===>Device Information<===---
> English product name: "Linux USB Audio Gadget"
>
> ConnectionStatus:
> Current Config Value: 0x01 -> Device Bus Speed: High
> Device Address: 0x0F
> Open Pipes: 0
> *!*ERROR: No open pipes!
>
> ===>Device Descriptor<===
> bLength: 0x12
> bDescriptorType: 0x01
> bcdUSB: 0x0200
> bDeviceClass: 0xEF -> This is a Multi-interface
> Function Code Device
> bDeviceSubClass: 0x02 -> This is the Common Class Sub
> Class
> bDeviceProtocol: 0x01 -> This is the Interface
> Association Descriptor protocol
> bMaxPacketSize0: 0x40 = (64) Bytes
> idVendor: 0x1D6B = The Linux Foundation
> idProduct: 0x0101
> bcdDevice: 0x0510
> iManufacturer: 0x01
> English (United States) "Linux 5.10.17-v7l-R3LAY_TEST+ with
> fe980000.usb"
> iProduct: 0x02
> English (United States) "Linux USB Audio Gadget"
> iSerialNumber: 0x00
> bNumConfigurations: 0x01
>
> ===>Configuration Descriptor<===
> bLength: 0x09
> bDescriptorType: 0x02
> wTotalLength: 0x00E2 -> Validated
> bNumInterfaces: 0x03
> bConfigurationValue: 0x01
> iConfiguration: 0x00
> bmAttributes: 0xC0 -> Bus Powered
> MaxPower: 0x01 = 2 mA
>
> ===>IAD Descriptor<===
> bLength: 0x08
> bDescriptorType: 0x0B
> bFirstInterface: 0x00
> bInterfaceCount: 0x03
> bFunctionClass: 0x01 -> Audio Interface Class
> bFunctionSubClass: 0x00
> *!*CAUTION: This appears to be an invalid bFunctionSubClass
> bFunctionProtocol: 0x20
> iFunction: 0x04
> English (United States) "R3lay PI"
>
> ===>Interface Descriptor<===
> bLength: 0x09
> bDescriptorType: 0x04
> bInterfaceNumber: 0x00
> bAlternateSetting: 0x00
> bNumEndpoints: 0x00
> bInterfaceClass: 0x01 -> Audio Interface Class
> bInterfaceSubClass: 0x01 -> Audio Control Interface SubClass
> bInterfaceProtocol: 0x20
> CAUTION: This may be an invalid bInterfaceProtocol
> iInterface: 0x05
> English (United States) "Topology Control"
>
> ===>Audio Control Interface Header Descriptor<===
> bLength: 0x09
> bDescriptorType: 0x24
> bDescriptorSubtype: 0x01
> bcdADC: 0x0200
> wTotalLength: 0x5308
> bInCollection: 0x00
>
> ===>Descriptor Hex Dump<===
> bLength: 0x08
> bDescriptorType: 0x24
> 08 24 0A 06 01 01 00 06
>
> ===>Descriptor Hex Dump<===
> bLength: 0x08
> bDescriptorType: 0x24
> 08 24 0A 05 01 01 00 07
>
> ===>Descriptor Hex Dump<===
> bLength: 0x11
> bDescriptorType: 0x24
> 11 24 02 01 01 01 00 05 02 03 00 00 00 00 03 00
> 08
>
> ===>Descriptor Hex Dump<===
> bLength: 0x11
> bDescriptorType: 0x24
> 11 24 02 02 00 02 00 06 02 03 00 00 00 00 03 00
> 09
>
> ===>Descriptor Hex Dump<===
> bLength: 0x0C
> bDescriptorType: 0x24
> 0C 24 03 04 01 01 00 02 06 03 00 0A
>
> ===>Descriptor Hex Dump<===
> bLength: 0x0C
> bDescriptorType: 0x24
> 0C 24 03 03 00 03 00 01 05 03 00 0B
>
> ===>Interface Descriptor<===
> bLength: 0x09
> bDescriptorType: 0x04
> bInterfaceNumber: 0x01
> bAlternateSetting: 0x00
> bNumEndpoints: 0x00
> bInterfaceClass: 0x01 -> Audio Interface Class
> bInterfaceSubClass: 0x02 -> Audio Streaming Interface
> SubClass
> bInterfaceProtocol: 0x20
> CAUTION: This may be an invalid bInterfaceProtocol
> iInterface: 0x0C
> English (United States) "Playback Inactive"
>
> ===>Interface Descriptor<===
> bLength: 0x09
> bDescriptorType: 0x04
> bInterfaceNumber: 0x01
> bAlternateSetting: 0x01
> bNumEndpoints: 0x02
> bInterfaceClass: 0x01 -> Audio Interface Class
> bInterfaceSubClass: 0x02 -> Audio Streaming Interface
> SubClass
> bInterfaceProtocol: 0x20
> CAUTION: This may be an invalid bInterfaceProtocol
> iInterface: 0x0D
> English (United States) "Playback Active"
>
> ===>Descriptor Hex Dump<===
> bLength: 0x10
> bDescriptorType: 0x24
> 10 24 01 01 00 01 01 00 00 00 02 03 00 00 00 00
>
> ===>Audio Streaming Format Type Descriptor<===
> bLength: 0x06
> bDescriptorType: 0x24
> bDescriptorSubtype: 0x02
> bFormatType: 0x01
> bNrChannels: 0x02
> bSubframeSize: 0x10
> bBitResolution: 0x07
> bSamFreqType: 0x05
> tSamFreq[1]: 0x380501 (3671297 Hz)
> tSamFreq[2]: 0x080401 (525313 Hz)
> tSamFreq[3]: 0x000125 (293 Hz)
> tSamFreq[4]: 0x000000 (0 Hz)
> tSamFreq[5]: 0x050700 (329472 Hz)
>
> ===>Endpoint Descriptor<===
> bLength: 0x07
> bDescriptorType: 0x05
> bEndpointAddress: 0x01 -> Direction: OUT - EndpointID: 1
> bmAttributes: 0x05 -> Isochronous Transfer Type
> Synchronization Type = Asynchronous
> Bulk Transfer Type
> wMaxPacketSize: 0x0138 = 1 transactions per microframe,
> 0x138 max bytes
> bInterval: 0x04
>
> ===>Descriptor Hex Dump<===
> bLength: 0x08
> bDescriptorType: 0x25
> 08 25 01 00 00 00 00 00
>
> ===>Endpoint Descriptor<===
> bLength: 0x07
> bDescriptorType: 0x05
> bEndpointAddress: 0x81 -> Direction: IN - EndpointID: 1
> bmAttributes: 0x11 -> Isochronous Transfer Type
> Synchronization Type = No Synchronization
> Bulk Transfer Type
> wMaxPacketSize: 0x0004 = 1 transactions per microframe,
> 0x04 max bytes
> bInterval: 0x04
>
> ===>Interface Descriptor<===
> bLength: 0x09
> bDescriptorType: 0x04
> bInterfaceNumber: 0x02
> bAlternateSetting: 0x00
> bNumEndpoints: 0x00
> bInterfaceClass: 0x01 -> Audio Interface Class
> bInterfaceSubClass: 0x02 -> Audio Streaming Interface
> SubClass
> bInterfaceProtocol: 0x20
> CAUTION: This may be an invalid bInterfaceProtocol
> iInterface: 0x0E
> English (United States) "Capture Inactive"
>
> ===>Interface Descriptor<===
> bLength: 0x09
> bDescriptorType: 0x04
> bInterfaceNumber: 0x02
> bAlternateSetting: 0x01
> bNumEndpoints: 0x01
> bInterfaceClass: 0x01 -> Audio Interface Class
> bInterfaceSubClass: 0x02 -> Audio Streaming Interface
> SubClass
> bInterfaceProtocol: 0x20
> CAUTION: This may be an invalid bInterfaceProtocol
> iInterface: 0x0F
> English (United States) "Capture Active"
>
> ===>Descriptor Hex Dump<===
> bLength: 0x10
> bDescriptorType: 0x24
> 10 24 01 04 00 01 01 00 00 00 02 03 00 00 00 00
>
> ===>Audio Streaming Format Type Descriptor<===
> bLength: 0x06
> bDescriptorType: 0x24
> bDescriptorSubtype: 0x02
> bFormatType: 0x01
> bNrChannels: 0x02
> bSubframeSize: 0x10
> bBitResolution: 0x07
> bSamFreqType: 0x05
> tSamFreq[1]: 0xC40582 (12846466 Hz)
> tSamFreq[2]: 0x080400 (525312 Hz)
> tSamFreq[3]: 0x000125 (293 Hz)
> tSamFreq[4]: 0x000000 (0 Hz)
> tSamFreq[5]: 0x000000 (0 Hz)
>
> ===>Endpoint Descriptor<===
> bLength: 0x07
> bDescriptorType: 0x05
> bEndpointAddress: 0x82 -> Direction: IN - EndpointID: 2
> bmAttributes: 0x05 -> Isochronous Transfer Type
> Synchronization Type = Asynchronous
> Bulk Transfer Type
> wMaxPacketSize: 0x00C4 = 1 transactions per microframe,
> 0xC4 max bytes
> bInterval: 0x04
>
> ===>Descriptor Hex Dump<===
> bLength: 0x08
> bDescriptorType: 0x25
> 08 25 01 00 00 00 00 00
>