2021-03-02 17:25:32

by Ruslan Bilovol

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

Hi Johannes,

On Mon, Mar 1, 2021 at 6:49 PM Johannes Freyberger
<[email protected]> 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
>


2021-03-04 05:26:35

by Johannes Freyberger

[permalink] [raw]
Subject: AW: [PATCH 0/8] USB Audio Gadget part 2: Feedback endpoint, Volume/Mute support

Hi Ruslan,

thanks a lot for your quick answer.

> -----Ursprüngliche Nachricht-----
> Von: Ruslan Bilovol
> Gesendet: Montag, 1. März 2021 22:34
> An: Johannes Freyberger <[email protected]>
> Cc: Felipe Balbi <[email protected]>; Jonathan Corbet <[email protected]>;
> Greg Kroah-Hartman <[email protected]>; Glenn Schmottlach
> <[email protected]>; [email protected]; linux-
> [email protected]; Linux USB <[email protected]>
> Betreff: Re: [PATCH 0/8] USB Audio Gadget part 2: Feedback endpoint,
> Volume/Mute support
>
> Hi Johannes,
>
> On Mon, Mar 1, 2021 at 6:49 PM Johannes Freyberger
> <[email protected]> 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.
>

You are right, they really look screwed up. Meanwhile I found another similar tool which also knows Audio 2.0 and here everything looks fine ( https://www.uwe-sieber.de/usbtreeview.html#download )

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

Yes, I'd like to do this and I want to apologize for my newbie questions in advance. But I have to admit I'm rather new to Linux, Kernel compiling etc. and I followed the description on https://www.raspberrypi.org/documentation/linux/kernel/building.md and then applied your patches - partially I had to do some modifications by hand as the sources had changed. The version I downloaded via "git clone --depth=1 https://github.com/raspberrypi/linux" seems to be Linux 5.10.17-v7l. And I cannot see the version you mention at https://github.com/raspberrypi/linux/branches . Where can I get the version v5.12-rc1 for these tests?

>
> Thanks,
> Ruslan
>

Thanks to you for helping beginners like me,
best regards,
Johannes

> >
> > ---===>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
> >