USB3.0 UVC摄像头数据断传问题的分析
今天本站USB中文网站内技术交流群有人提了一个问题,说是:电脑关机重开有时候后会偶尔不出图,抓包就是传一帧就不传了
通过与他的沟通,基本确定信息如下:
使用抓包工具如BUSHOUD和力科的总线分析仪,出问题时都是传了一包后主机端不再请求数据,需要要插拔设备(即设备上电复位)才可以。
还有就是当设备出现问题时:
这说明它的底层是有持续的数据的,但是主机不再读。
所以我当时第一怀疑是BULK传输的问题,可能是链路层的问题。不会因为链路训练失败降成USB2.0了吧。我也看不到限象,确实是在胡猜的。
另外根据它的问题,我提出了几个建议:
- 降低数据的传输大小,这样用以确认是否数据过大引起的边界问题
- 查看负载数据头
- 可续可以考虑先用USB2.0调试试试
不过这哥们的公司确实也厉害,不但买了一个力科的USB总线分析仪,还买了一个支持USB3.0的。让我是一顿佩服,直呼奢侈。
所以怪不得这哥们上来直接问我用没用过USB总线分析仪:
现在言归正转,直接胡乱猜测也不是办法,让它把抓包时的抓包内容我看一下:
打开抓包内容,好家伙,这和USB2.0的还是有很大变化的,我差点不会玩了。。。
后来打开它的最后几包数据可以看到:
VS_COMMIT_CONTROL请求
特定类请求是:
21 01 00 02 01 00 1A 00 //VS_COMMIT_CONTROL
数据内容为:
0: 00 00 01 0D 0B 8B 02 00
8: 00 00 00 00 00 00 00 00
16: 00 00 00 EC 5E 00 00 40
24: 00 00
可以看到,这个数据长度是26字节,使用的是UVC1.0规范。
失败了的SelectInterface请求
后面紧跟着的是一个控制请求,看不到数据,但根据经验,COMMIT请求之后,是需要SelectInterface的,无论是BULK传输还是同步传输。
打开UVC摄像头(特定类请求)数据分析: http://www.usbzh.com/article/detail-105.html
读数据失败
后面的两个事务都是IN事务,是读数据的,可见每次读的是16384个字节,只是第一包数据读后,再次读的时候,失败了:
问题分析
第一次都成功了,为什么第二次失败了,由于看不到第二次的数据信息,所以我打开了第一次读数据的内容,展开如下:
这时发现,这个数据的前4个字节为00,这明显是不正确的负载数据头啊。
负载数据头位于这4个字节之后,可以看到是12个字节的负载数据头。
关于负载数据头的分析可详见:http://www.usbzh.com/article/detail-7.html
这里基本上最大的嫌疑就是这4个00的问题了,4个00这样看来他的是32位数据总线,我怀疑他的逻辑在写数据时,由于时序的边界的问题导致FIFO多采了一组数据包导致。
所以我也问了一下他:
也证明了是32位总线
最后就是最后扯了一上别的,就没然后了。。。。
换了一个哦字。。。。
我是不是要多了,至始自终连个谢字都没有。。。。
我发誓,以后再也不在QQ中回答问题了。。。。
想要让我回答问题,得先分享本站链接,总不能白漂吧。就算没有说声谢字,也帮我分享了网站(虽然可能会立即删除掉分享链接),但我至少没觉地自己就是个工具人