UVC摄像头dwMaxPayloadTransferSize批量传输与USB端点描述符wMaxPacketSize的关系说明
2023-02-14
798
0
这个问题是老生常谈了,其实结合以前的文章我们应该能说明白,可详见:
- USB数据长度为0的DATA/IN事务 https://www.usbzh.com/article/detail-624.html
- USB2.0 事务 https://www.usbzh.com/article/detail-691.html
通过上面可以知道,如果需要传输的数据大于USB端点描述符中指定的大小时,会分多个事务进行传输,传输的总次数为:
(总字节数+端点可传输的最大字节数-1)/ 端点可传输的最大字节数。
例如我们需要传输51200个字节,但对于端点描述符中指定的端点可传输的最大字节数为:
前100次事务每次按最大512字节传输,最后再传输0字节,表示本次传输完成。(51200+512-1))/512 = 101
例如本人手中的摄像头,其VS数据端点描述符如下:
----------------- Endpoint Descriptor -----------------
bLength : 0x07 (7 bytes)
bDescriptorType : 0x05 (Endpoint Descriptor)
bEndpointAddress : 0x81 (Direction=IN EndpointID=1)
bmAttributes : 0x02 (TransferType=Bulk)
wMaxPacketSize : 0x0200 (max 512 bytes)
bInterval : 0x00 (never NAKs)
Data (HexDump) : 07 05 81 02 00 02 00
可以看到其数据端点为BULK传输,其wMaxPacketSize=512字节
通过BUSHOUND抓取的内容如下:
42.0 34 OUT 01 00 02 02 15 16 05 00 00 00 00 00 00 00 00 00 00 00 00 90 7e 00 0c c8 00 00 00 00 00 00 03 01
42.0 CTL 01 0b 00 00 01 00 00 00
42.1 51200 IN 0c 80 00 00 00 00 00 00 00 00 00 00 00 00 00 01 40 01 0c 01 ff ff 01 60 00 00 03 00 00 03 00 00
42.1 51200 IN 0c 80 00 00 00 00 00 00 00 00 00 00 80 53 bb 1f ca 99 bc 82 eb 02 d9 31 2e ec b9 95 17 d2 42 07
分析其包内容如下:
============UVC1.1============
0x01, 0x00, UINT16 bmHint;dwFrameInterval保持不变;
0x02, UINT8 bFormatIndex=2,
0x02, UINT8 bFrameIndex=2,
0x15, 0x16, 0x05, 0x00, UINT32 dwFrameInterval=333333,;33.3333,ms/帧
0x00, 0x00, UINT16 wKeyFrameRate=0,;缩格式中只有第1帧为关键帧;
0x00, 0x00, UINT16 wPFrameRate=0,;压缩格式P帧速率;
0x00, 0x00, UINT16 wCompQuality=0,,压缩质量1-10000;
0x00, 0x00, UINT16 wCompWindowSize;0,,平均比特率控制的窗口大小;
0x00, 0x00, UINT16 wDelay;0,,内部视频流接口延迟(毫秒);
0x00, 0x90, 0x7E, 0x00, UINT32 dwMaxVideoFrameSize;8294400,Bytes
0x0C, 0xC8, 0x00, 0x00, UINT32 dwMaxPayloadTransferSize;51212,Bytes
0x00, 0x00, 0x00, 0x00, UINT32 dwClockFrequency=0,;指定格式的设备时钟频率HZ
0x03, UINT8 bmFramingInfo=3,负载信息位图
0x01, UINT8 bPreferedVersion=1,bFormatIndex预设版本
0x00, UINT8 bMinVersion=0,bFormatIndex最小版本
0x00, UINT8 bMaxVersion=0,bFormatIndex最大版本
而dwMaxPayloadTransferSize为51212字节,表示一次数据传输为51212字节,不过这个固件的开发人员好像理解的有问题,最终采取的是51200字节,这可通过BUSHOUND抓包来看到。
实际这也是没有问题的,人家说的就是最大,所以这样也是没有毛病的,只是他没有用最大。
在一次传输512字节,经过100包之后,再补个0包,这样表示一次负载传输的完成。
当然,前面的每个包必须用端点最大传输字节数来传输。
这里我们可以对比BUSHOUND抓取的,详见:
总结:
- USBHOUND抓取的是一个URB,是一次传输。包括很多事务。
- USB总线分析仪传的是一个事务中数据传输的最大字节数。这最多就是一个事务。
所以什么是传输,什么是事务,好好理解一下。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936