2

我一直在尝试在我的微控制器设备上设置 USB 音频输入流。我知道每个 USB 音频流都有两个备用设置;备用设置 0 是没有流可用的地方;备用设置 1 是当有可用的流时。

我已经设置了 USB 音频输出,所以我知道流描述符工作正常。显然,当主机告诉它何时有音频通过时,微控制器会调用 USB 中断来激活输出(告诉微控制器启用备用设置 1...)。但是,现在我很困惑如何启用 USB 音频输入端。我很困惑,因为显然主机没有告诉微控制器输入正在通过......而是设备告诉主机它正在发送数据。

如果有人可以让我了解如何正确启用输入流,那就太好了。我想知道我是否应该硬启用端点并以这种方式发送数据?如果需要,我可以提供更多代码,但我想这更像是一种思考类型/算法的问题方法。

这是我对流的备用设置的描述:

.iface_alt0.bLength                  = sizeof(usb_iface_desc_t)
.iface_alt0.bDescriptorType          = USB_DT_INTERFACE
.iface_alt0.bInterfaceNumber         = UDI_AUDIO_IFACE_DATA_IN_NUMBER
.iface_alt0.bAlternateSetting        = 0
.iface_alt0.bNumEndpoints            = 0
.iface_alt0.bInterfaceClass          = AUDIO_IFACE_CLASS
.iface_alt0.bInterfaceSubClass       = AUDIO_IFACE_SUBCLASS_STREAMING
.iface_alt0.bInterfaceProtocol       = AUDIO_IFACE_IP_VERSION_02_00
.iface_alt0.iInterface               = 0
.iface_alt1.bLength                  = sizeof(usb_iface_desc_t)
.iface_alt1.bDescriptorType          = USB_DT_INTERFACE
.iface_alt1.bInterfaceNumber         = UDI_AUDIO_IFACE_DATA_IN_NUMBER
.iface_alt1.bAlternateSetting        = 1
.iface_alt1.bNumEndpoints            = UDI_AUDIO_IN_NB_ENDPOINTS
.iface_alt1.bInterfaceClass          = AUDIO_IFACE_CLASS
.iface_alt1.bInterfaceSubClass       = AUDIO_IFACE_SUBCLASS_STREAMING
.iface_alt1.bInterfaceProtocol       = AUDIO_IFACE_IP_VERSION_02_00
.iface_alt1.iInterface               = 0

谢谢!

编辑- 只需阅读此来源:

“启用此配置后,将使用 bAlternativeSettings 等于 0 的前两个接口描述符。但是,在操作期间,主机可以发送一个 SetInterface 请求,该请求定向到接口一的请求,其中一个替代设置为启用另一个接口描述符。” -简而言之 USB

修订后的问题:如何发送 SetInterface 请求以使 USB 设备接受输入流?

新更新- 有没有办法可以通过描述符设置备用设置?我正在阅读有关流描述符的文章->“bmControls 字段包含一组位对,指示存在哪些控件以及它们的功能。” “D1..0 有效备用设置控制”、“D3..2 有效备用设置控制”。

解决了-
所以看起来我只需要在我的主机设备上打开一个音频应用程序来启用备用设置......我不知道是这种情况。

4

1 回答 1

2

int libusb_set_interface_alt_setting (libusb_device_handle * dev, int interface_number, int alternate_setting)

http://libusb.org/static/api-1.0/group__dev.html#ga3047fea29830a56524388fd423068b53

一般来说,描述符中的字段就像指向内存位置的指针。如果映射有问题,设备将无法工作。由于主机在其驱动程序中有一定的映射,设备必须遵守这个映射

在第 117 页的http://www.usb.org/developers/docs/devclass_docs/audio10.pdf中,据说有一个顶级的Standard AudioControl 描述符和较低级别的Class-Specific Audio Control Descriptors

除了AudioStreaming 描述符之外,您还必须正确设置其他描述符。在http://www.usb.org/developers/docs/devclass_docs/audio10.pdf第 126 页的示例中,必须设置Standard Audio Streaming Interface DescriptorClass-Specific Audio Streaming DescriptorType I format descriptorStandard Endpoint Descriptor ,类特定的同步音频数据端点描述符

我不知道你的设备实现了什么类,也许你应该设置所有这些描述符然后它可能会工作我在 AudioStreaming 描述符中找不到 bmControl 字段。

通常备用设置用于在端点或音频流接口之间切换,请参阅第 117 页的特定于类的接口描述符

在第 58-64 页的http://www.usb.org/developers/docs/devclass_docs/audio10.pdf中都是音频流相关的描述符

在 linux USB 音频驱动程序中有一个 bmControl 字段:

/* 22  * bmControl field decoders
 23  *
 24  * From the USB Audio spec v2.0:
 25  *
 26  *   bmaControls() is a (ch+1)-element array of 4-byte bitmaps,
 27  *   each containing a set of bit pairs. **If a Control is present,
 28  *   it must be Host readable.** If a certain Control is not
 29  *   present then the bit pair must be set to 0b00.
 30  *   If a Control is present but read-only, the bit pair must be
 31  *   set to 0b01. If a Control is also Host programmable, the bit
 32  *   pair must be set to 0b11. The value 0b10 is not allowed.
 33  *
 34  */

http://lxr.free-electrons.com/source/include/linux/usb/audio-v2.h

http://www.usb.org/developers/docs/devclass_docs/audio10.pdf第 36 页)

于 2017-01-13T13:22:04.567 回答