如何实现uvc同时出两路不同分辨率视频流?

Zeui 2022-06-22 18:10:54 编辑

1.我这块设备的usb控制器只有除了0端点,只有3个in,2个out
2.之前在Q群讨论过,做复合设备两个摄像头,vc共用,vs分开

我现在用usb gadget configfs 的方式,实现了两个摄像头,也生成了两个设备节点,这里vc共用我是在驱动里改两个vc使用同一个端点来实现

但是插到windows提示配置描述符请求失败
插到linux设备上会提示

请问下,这个问提怎么排查?还有我这里的vc共用实现是否有问题?

USB中文网 2022-06-22 19:16:19 编辑

你可以考虑这样:

  • 摄像头1
    • IAD接口关联描述符1
    • VC
    • VS 输入端点
  • 摄像头2
    • IAD接口关联描述符2
    • VC
    • VS 另一个输入端点

以上其实只要2个输入端点可以实现2个独立的摄像头。
至于类特定请求这些,它是控制端点的,这个可以公用。

Zeui 2022-06-22 19:40:20 编辑

是不是这样理解,vc的控制端点默认都是端点0,因为中断端点是可选的,只要不需要中断端点就可以了?
摄像头1

  • IAD接口关联描述符1
  1. VC 不用中断端点,使用默认端点0
  2. VS 输入端点
    摄像头2
  • IAD接口关联描述符2
  1. VC 不用中断端点,使用默认端点0
  2. VS 另一个输入端点

还有一个问题,我看网站说明vc下中断状态端点必须有的场景,这两个的使用场景不是太明白
自动更新的控制(由设备启动更改实现)
异步控制

Zeui 2022-06-22 20:07:44 编辑

我刚刚试,取消中断状态端点,用usb gadget configfs方式,设置成一个uvc设备是正常的,windows和linux都可以正常识别,但是设置成2个uvc的时候,都是枚举不成功,在windows上会显示配置请求失败

请问下,这个问题要怎么去查?

USB中文网 2022-06-22 20:22:06 编辑

中断端点可以不要,即在VC中可以没有任何端点。
另外打开摄像头时的特定类请求如GET_CUR,SET_CUR这些操作,都是通过控制端点实现的,注意这里不是中断端点。

你上面的图可以看到,是获取配置描述符失败了。
你可以在Windows通过BUSHOUND抓包,来看一下为什么获取配置描述符失败。另外你这个配置描述符是那个设备的。我上面的说2个设备,是通过一个配置描述符实现的。其布局如下:

  • 配置描述符
    • 接口关联描述符
      • VC
      • VS
    • 接口关联描述符
      • VC
      • VS

当在Windows下,会自动使用usb composite驱动拆成2个逻辑设备的。

Zeui 2022-06-23 11:41:07 编辑

我使用BUSHOUND抓包,但是没有抓到任何数据。并且,BUSHOUND很多时候都检测不到设备,但是windows设备管理器可以看到有未知设备提示。偶尔BUSHOUND可以勾选的时候,采集又没有数据

BUSHOUND抓包的使用应该没问题,试过抓配置成单个摄像头的,就可以抓到数据。

你说我截图的那个是哪个设备,是这样的,我配置2个摄像头设备好后插到windows上,只检测出一个未知设备,并没有看到拆成2个逻辑设备,并提示获取配置描述符失败。

USB中文网 2022-06-23 12:43:03 编辑

BUSHOUND只能抓到成功执行了的设备,也就是数据已经通过总线上来了。
BUSHOUND的工作原理可见:http://www.usbzh.com/article/detail-1049.html

你说我截图的那个是哪个设备,是这样的,我配置2个摄像头设备好后插到windows上,只检测出一个未知设备,并没有看到拆成2个逻辑设备,并提示获取配置描述符失败。

这说明你的主设备还没有枚举成功,所以还没有到拆分逻辑设备的地方。
既然提示获取配置描述符失败,那你看主机在获取配置描述符的时候你有返回数据吗?
主机获取配置描述会一般有2次,第一次为前9字节,后面是全部的数据。详见:http://www.usbzh.com/article/detail-626.html

如果你有返回,那就要看你的配置描述符是否正确了,你需要检查配置描述符各字段的值。或者你贴出来看一下吧。

Zeui 2022-06-28 14:03:53 编辑

上周有点事,这个问题没有去排查是什么引起的
这周刚刚好有时间,把这个问题解决了

按照站长说的思路,去看了composite框架里的composite_setup 函数,用于处理标准请求,定位到是在处理 USB_REQ_GET_DESCRIPTOR 里的 USB_DT_CONFIG 获取配置描述出错了
原因是配置描述符的长度大于了 USB_COMP_EP0_BUFSIZ 的定义大小大小,超过了1024个字节。
这个宏USB_COMP_EP0_BUFSIZ是在用预分配给申请usb控制端点请求时,保存请求发送内容的buf大小。

后续我是把一些无关的帧格式描述符去掉后小于1024,就可以正常枚举了

感谢站长的回复

包子 2023-01-10 20:48:29 编辑

请问:我这边一个项目也是硬件资源有限,想去掉uvc的中断状态端点,节省资源,看到这个帖子

请问usb gadget configfs 是如何配置的?

USB中文网 2023-01-13 09:29:43 编辑

从描述符来看,是获取配置描述符失败。
所以应该是配置描述符获取之后,系统校验的问题。所以你要查一下你改了之后,配置描述符相关的其它信息如长度是否有同时更改。