如何实现uvc同时出两路不同分辨率视频流?
1.我这块设备的usb控制器只有除了0端点,只有3个in,2个out
2.之前在Q群讨论过,做复合设备两个摄像头,vc共用,vs分开
我现在用usb gadget configfs 的方式,实现了两个摄像头,也生成了两个设备节点,这里vc共用我是在驱动里改两个vc使用同一个端点来实现
但是插到windows提示配置描述符请求失败
插到linux设备上会提示
请问下,这个问提怎么排查?还有我这里的vc共用实现是否有问题?
你可以考虑这样:
- 摄像头1
- IAD接口关联描述符1
- VC
- VS 输入端点
- 摄像头2
- IAD接口关联描述符2
- VC
- VS 另一个输入端点
以上其实只要2个输入端点可以实现2个独立的摄像头。
至于类特定请求这些,它是控制端点的,这个可以公用。
是不是这样理解,vc的控制端点默认都是端点0,因为中断端点是可选的,只要不需要中断端点就可以了?
摄像头1
- IAD接口关联描述符1
- VC 不用中断端点,使用默认端点0
- VS 输入端点
摄像头2
- IAD接口关联描述符2
- VC 不用中断端点,使用默认端点0
- VS 另一个输入端点
还有一个问题,我看网站说明vc下中断状态端点必须有的场景,这两个的使用场景不是太明白
自动更新的控制(由设备启动更改实现)
异步控制
我刚刚试,取消中断状态端点,用usb gadget configfs方式,设置成一个uvc设备是正常的,windows和linux都可以正常识别,但是设置成2个uvc的时候,都是枚举不成功,在windows上会显示配置请求失败
请问下,这个问题要怎么去查?
中断端点可以不要,即在VC中可以没有任何端点。
另外打开摄像头时的特定类请求如GET_CUR,SET_CUR这些操作,都是通过控制端点实现的,注意这里不是中断端点。
你上面的图可以看到,是获取配置描述符失败了。
你可以在Windows通过BUSHOUND抓包,来看一下为什么获取配置描述符失败。另外你这个配置描述符是那个设备的。我上面的说2个设备,是通过一个配置描述符实现的。其布局如下:
- 配置描述符
- 接口关联描述符
- VC
- VS
- 接口关联描述符
- VC
- VS
- 接口关联描述符
当在Windows下,会自动使用usb composite驱动拆成2个逻辑设备的。
我使用BUSHOUND抓包,但是没有抓到任何数据。并且,BUSHOUND很多时候都检测不到设备,但是windows设备管理器可以看到有未知设备提示。偶尔BUSHOUND可以勾选的时候,采集又没有数据
BUSHOUND抓包的使用应该没问题,试过抓配置成单个摄像头的,就可以抓到数据。
你说我截图的那个是哪个设备,是这样的,我配置2个摄像头设备好后插到windows上,只检测出一个未知设备,并没有看到拆成2个逻辑设备,并提示获取配置描述符失败。
BUSHOUND只能抓到成功执行了的设备,也就是数据已经通过总线上来了。
BUSHOUND的工作原理可见:http://www.usbzh.com/article/detail-1049.html
你说我截图的那个是哪个设备,是这样的,我配置2个摄像头设备好后插到windows上,只检测出一个未知设备,并没有看到拆成2个逻辑设备,并提示获取配置描述符失败。
这说明你的主设备还没有枚举成功,所以还没有到拆分逻辑设备的地方。
既然提示获取配置描述符失败,那你看主机在获取配置描述符的时候你有返回数据吗?
主机获取配置描述会一般有2次,第一次为前9字节,后面是全部的数据。详见:http://www.usbzh.com/article/detail-626.html
如果你有返回,那就要看你的配置描述符是否正确了,你需要检查配置描述符各字段的值。或者你贴出来看一下吧。
上周有点事,这个问题没有去排查是什么引起的
这周刚刚好有时间,把这个问题解决了
按照站长说的思路,去看了composite框架里的composite_setup 函数,用于处理标准请求,定位到是在处理 USB_REQ_GET_DESCRIPTOR 里的 USB_DT_CONFIG 获取配置描述出错了
原因是配置描述符的长度大于了 USB_COMP_EP0_BUFSIZ 的定义大小大小,超过了1024个字节。
这个宏USB_COMP_EP0_BUFSIZ是在用预分配给申请usb控制端点请求时,保存请求发送内容的buf大小。
后续我是把一些无关的帧格式描述符去掉后小于1024,就可以正常枚举了
感谢站长的回复
从描述符来看,是获取配置描述符失败。
所以应该是配置描述符获取之后,系统校验的问题。所以你要查一下你改了之后,配置描述符相关的其它信息如长度是否有同时更改。