启用 USB 音频 Class 2.0 音频输入流
Enabling a USB Audio Class 2.0 Audio Input Stream
我一直在尝试在我的微控制器设备上设置 USB 音频输入流。我知道每个 USB 音频流都有两个备用设置;备用设置 0 是没有流可用的地方;备用设置 1 是在有流可用时。
我已经设置了 USB 音频输出,所以我知道流描述符工作正常。显然,当主机告诉它音频何时通过(告诉微控制器启用备用设置 1...)时,微控制器调用 USB 中断来激活输出。但是,现在我很困惑如何启用 USB 音频输入端。我很困惑,因为显然主机没有告诉微控制器输入正在通过……而是设备告诉主机它正在发送数据。
如果有人能告诉我如何正确启用输入流,那就太好了。我想知道我是否应该硬启用端点并以这种方式发送数据?如果需要,我可以提供更多代码,但我想这更像是一种思考 type/algorithmic 问题的方法。
这是我对流的备用设置的描述符:
.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
谢谢!
编辑 - 只需阅读此来源:
"When this configuration is enabled, the first two interface descriptors with bAlternativeSettings equal to zero is used. However during operation the host can send a SetInterface request directed to that of Interface one with a alternative setting of one to enable the other interface descriptor." - USB in a Nutshell
修改问题:如何发送 SetInterface 请求以使 USB 设备接受输入流?
new update - 有没有办法可以通过描述符将备用设置激活?我正在阅读有关流描述符的文章 -> "The bmControls field contains a set of bit pairs, indicating which Controls are present and what their capabilities are." "D1..0 Active Alternate Setting Control"、"D3..2 Valid Alternate Setting Control"。
已解决 -
所以看起来我只需要在我的主机设备上打开一个音频应用程序来启用备用设置……我不知道是这样的。
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
一般来说,描述符中的字段就像指向内存位置的指针。如果映射错误,设备将不会 work.as 主机在其驱动程序中有特定映射 设备必须遵守此映射
在第 117 页的 http://www.usb.org/developers/docs/devclass_docs/audio10.pdf 中据说有一个 top-level Standard AudioControl 描述符 和 lower-level Class-Specific 音频控制描述符。
除了 AudioStreaming 描述符之外,您 还必须正确设置其他描述符。在 http://www.usb.org/developers/docs/devclass_docs/audio10.pdf 第 126 页的示例中,必须设置 标准音频流接口描述符 、Class-Specific 音频流描述符、 I 类格式描述符、标准端点描述符、Class-specific 同步音频数据端点描述符
我不知道 class 你的设备实现了什么,也许你应该设置所有这些描述符然后它可能会工作
我在 AudioStreaming 描述符中找不到 bmControl 字段。
通常备用设置用于在端点或 AudioStreaming 接口之间切换,请参阅第 117 页的 Class-specific 接口描述符
在第 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 页)
我一直在尝试在我的微控制器设备上设置 USB 音频输入流。我知道每个 USB 音频流都有两个备用设置;备用设置 0 是没有流可用的地方;备用设置 1 是在有流可用时。
我已经设置了 USB 音频输出,所以我知道流描述符工作正常。显然,当主机告诉它音频何时通过(告诉微控制器启用备用设置 1...)时,微控制器调用 USB 中断来激活输出。但是,现在我很困惑如何启用 USB 音频输入端。我很困惑,因为显然主机没有告诉微控制器输入正在通过……而是设备告诉主机它正在发送数据。
如果有人能告诉我如何正确启用输入流,那就太好了。我想知道我是否应该硬启用端点并以这种方式发送数据?如果需要,我可以提供更多代码,但我想这更像是一种思考 type/algorithmic 问题的方法。
这是我对流的备用设置的描述符:
.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
谢谢!
编辑 - 只需阅读此来源:
"When this configuration is enabled, the first two interface descriptors with bAlternativeSettings equal to zero is used. However during operation the host can send a SetInterface request directed to that of Interface one with a alternative setting of one to enable the other interface descriptor." - USB in a Nutshell
修改问题:如何发送 SetInterface 请求以使 USB 设备接受输入流?
new update - 有没有办法可以通过描述符将备用设置激活?我正在阅读有关流描述符的文章 -> "The bmControls field contains a set of bit pairs, indicating which Controls are present and what their capabilities are." "D1..0 Active Alternate Setting Control"、"D3..2 Valid Alternate Setting Control"。
已解决 -
所以看起来我只需要在我的主机设备上打开一个音频应用程序来启用备用设置……我不知道是这样的。
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
一般来说,描述符中的字段就像指向内存位置的指针。如果映射错误,设备将不会 work.as 主机在其驱动程序中有特定映射 设备必须遵守此映射
在第 117 页的 http://www.usb.org/developers/docs/devclass_docs/audio10.pdf 中据说有一个 top-level Standard AudioControl 描述符 和 lower-level Class-Specific 音频控制描述符。
除了 AudioStreaming 描述符之外,您 还必须正确设置其他描述符。在 http://www.usb.org/developers/docs/devclass_docs/audio10.pdf 第 126 页的示例中,必须设置 标准音频流接口描述符 、Class-Specific 音频流描述符、 I 类格式描述符、标准端点描述符、Class-specific 同步音频数据端点描述符
我不知道 class 你的设备实现了什么,也许你应该设置所有这些描述符然后它可能会工作 我在 AudioStreaming 描述符中找不到 bmControl 字段。
通常备用设置用于在端点或 AudioStreaming 接口之间切换,请参阅第 117 页的 Class-specific 接口描述符
在第 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 页)