启用USB Audio Class 2.0音频输入流

启用USB Audio Class 2.0音频输入流,audio,usb,microcontroller,usb-descriptor,Audio,Usb,Microcontroller,Usb Descriptor,我一直在尝试在我的微控制器设备上设置USB音频输入流。我知道每个USB音频流有两个备用设置;备用设置0表示没有可用流;备用设置1是指存在可用流时 我已经设置了USB音频输出,所以我知道流描述符工作正常。显然,当主机告知音频何时通过时,微控制器调用USB中断来激活输出(告知微控制器启用备用设置1…)。但是,现在我不知道如何启用USB音频输入端。我很困惑,因为很明显主机没有告诉微控制器输入是通过。。。相反,设备会告诉主机它正在通过它发送数据 如果有人能告诉我如何正确地启用输入流,那就太好了。我想知道

我一直在尝试在我的微控制器设备上设置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请求,指向接口一的SetInterface请求,另一个接口描述符的SetInterface设置为1。”

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

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

解析的排序-

所以看起来我只是需要在我的主机设备上打开一个音频应用程序来启用备用设置。。。我不知道是这样的

int libusb\u set\u interface\u alt\u setting(libusb\u device\u handle*dev、,
int接口\u编号、int备用\u设置)

通常,描述符中的字段类似于指向内存位置的指针。如果映射错误,设备将无法工作。由于主机的驱动程序中有特定映射,设备必须遵守此映射

在第117页中,有顶级标准音频控制描述符和较低级别的特定于类的音频控制描述符

除了音频流描述符之外,还必须正确设置其他描述符。在第126页的示例中,必须设置标准音频流接口描述符、类特定音频流描述符、类型I格式描述符、标准端点描述符、类特定等时音频数据端点描述符

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

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

第58-64页中的所有音频流相关描述符

linux USB音频驱动程序中有一个控制字段:

/* 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  */


(第36页)

嗯,我没有使用libusb,所以这并没有真正的帮助。。。但我确实遵循了上面的评论,并在USB设备连接自身后设置了接口的alt设置。但问题似乎更像是现在发送给主机的东西。。。主机(如mac)是否应该随时接受usb音频数据?我知道主机将不会启用usb音频输出,直到主机发送一个设置接口请求,说明音频数据正在传输到设备。在usb协议中,主机启动任何通信。即使设备发送中断,它也必须等待主机轮询它。因此,如果有一个流,那么主机在此之前请求它,因此它应该接受它。也许用wireshark嗅一下usb,或者看看发生了什么,这证实了我在过去一天中的一些怀疑。是否有办法通过描述符将备用设置设置为活动?我正在阅读有关流描述符的文章->“bmControls字段包含一组位对,指示存在哪些控件及其功能。”“D1..0活动备用设置控件”,“D3..2有效备用设置控件”。我可以只设置这些吗?我用的是音频2.0级。你放的linux链接也是我看到的。但我不知道如何让主机启用/设置备用设置。。通常,主机驱动程序对此负责。您可以通过发送控制传输(到EP0)来设置备用设置。这就是libusb函数
libusb\u set\u interface\u alt\u setting
的作用。“接口的默认设置始终为备用设置零。备用设置可由标准控制传输集_接口专门选择。”