UVC摄像头dwMaxPayloadTransferSize批量传输与USB端点描述符wMaxPacketSize的关系说明
			 2023-02-14
			  本文链接为:http://www.usbzh.com/article/detail-1136.html ,欢迎转载,转载请附上本文链接。
	
			
			
			
			
		
			这个问题是老生常谈了,其实结合以前的文章我们应该能说明白,可详见:
- 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    
		 UVC摄像头技术笔记
			UVC摄像头技术笔记
			




