我一直在尝试在我的微控制器设备上设置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等于零的前两个接口描述符。但是,在操作过程中,主机可以发送一个SetInterface请求,该请求指向具有一个替代设置的接口一,以启用另一个接口描述符"-Nutshell 中的USB
修订问题:如何发送SetInterface请求以使USB设备接受输入流
新更新-有没有办法通过描述符将备用设置设置设置为活动?我读到这篇关于流描述符的文章->"bmControls字段包含一组位对,指示存在哪些控件及其功能。"D1..0活动备用设置控件","D3..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
一般来说,描述符中的字段就像指向内存位置的指针。如果映射有故障,设备将无法工作。由于主机的驱动程序中有特定的映射,设备必须遵守该映射
在http://www.usb.org/developers/docs/devclass_docs/audio10.pdf在第117页上,有一个顶级的标准音频控制描述符和更低级别的Class Specific音频控制描述符。
除了音频流描述符之外,还必须正确设置其他描述符。在中的示例中http://www.usb.org/developers/docs/devclass_docs/audio10.pdf第126页必须设置标准音频流接口描述符、类特定音频流描述符类格式描述符、标准端点描述符TR
我不知道你的设备实现了什么类,也许你应该设置所有这些描述符,然后它可能会工作在AudioStreaming描述符中找不到bmControl字段。
通常,备用设置用于在端点或音频流接口之间切换,请参阅第117页的类特定接口描述符
在http://www.usb.org/developers/docs/devclass_docs/audio10.pdf来自第58-64页的是所有音频流相关描述符
在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页)