USB描述符:设备的“自我介绍”
我们用“设备求职”的例子来理解。Linux下使用 lsusb -v -d b349:b182 命令输出,就是你的摄像头向电脑提交的完整“简历”。
这份简历主要分为这几个层次,结合数据来看:
- 设备描述符 (Device Descriptor) - 核心身份证
- 配置描述符 (Configuration Descriptor) - 工作模式说明书
- 接口关联描述符 (Interface Association Descriptor) - 功能打包说明
- 接口描述符 (Interface Descriptor) - 功能清单
- 端点描述符 (Endpoint Descriptor) - 数据传输通道说明
设备描述符 (Device Descriptor) - “我是谁?”
这是简历的最顶部,包含了最核心的身份信息。
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 239 Miscellaneous Device
bDeviceSubClass 2
bDeviceProtocol 1 Interface Association
bMaxPacketSize0 64
idVendor 0xb349
idProduct 0xb182
bcdDevice 12.08
iManufacturer 1 DHZJ-221208-K
iProduct 2 USB Camera
iSerial 0
bNumConfigurations 1
- bcdUSB: 2.00: 清晰地告诉电脑,它是一个 USB 2.0 设备。
- idVendor: 0xb349 和 idProduct: 0xb182: 这是设备的唯一“身份证号”。电脑会用这两个ID去系统里查找匹配的驱动程序。虽然我们不知道 0xb349 是哪个大厂,但电脑知道。
- iManufacturer: 1 和 iProduct: 2: 这两个数字不是直接显示的名字,而是“字符串描述符”的索引。它们告诉电脑:“想知道我的制造商名字,请去读取1号字符串;想知道产品名,请去读取2号字符串。” lsusb 工具很智能,已经帮你读出来了,分别是 “DHZJ-221208-K” 和 “USB Camera”
- bNumConfigurations: 1: 说明这个摄像头只有 1 种工作配置。
小结: 从设备描述符我们得知,这是一个USB 2.0设备,厂商ID为0xb349,产品ID为0xb182,名字叫“USB Camera”,并且只有一种工作模式。
配置描述符 (Configuration Descriptor) - “我有哪些工作模式?”
这里描述了那唯一的一种工作模式的具体情况。
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0310 (784 bytes)
bNumInterfaces 4
bConfigurationValue 1
bmAttributes 0x80 (Bus Powered)
MaxPower 500mA
- bNumInterfaces: 4: 这是个关键信息!它说明在这个配置下,设备总共提供了 4 个接口。说明它是个功能更丰富的复合设备。
- MaxPower: 500mA: 它向电脑申请的最大供电电流是 500mA,这是USB 2.0端口的标准上限。电脑会评估一下自己的供电能力,没问题才会让它工作。
- wTotalLength: 0x0310: 告诉电脑,从这个配置描述符开始,往下总共有 784 字节的数据,包含了所有接口、端点等描述符。电脑会一次性读取这么多数据,来获取完整的配置信息。
小结: 在这个唯一的配置下,摄像头需要500mA的电流,并提供了4个功能接口。
接口关联描述符 (Interface Association Descriptor - IAD)
摄像头描述符里出现了这个东西。当一个设备有多个接口来共同完成一个功能时(比如一个视频控制接口和一个视频流接口共同实现“视频功能”),IAD就会把它们“打包”在一起,告诉操作系统:“嘿,这几个接口是一伙的,请用同一个驱动来管理我们”。
设备有两个IAD:
-
第一个IAD (视频功能包)
Interface Association: bFirstInterface 0 (从接口0开始) bInterfaceCount 2 (总共包含2个接口) bFunctionClass 14 Video这个IAD声明:“从接口0开始的连续2个接口(也就是接口0和接口1),共同组成一个视频功能”。
-
第二个IAD (音频功能包)
Interface Association: bFirstInterface 2 (从接口2开始) bInterfaceCount 2 (总共包含2个接口) bFunctionClass 1 Audio这个IAD声明:“从接口2开始的连续2个接口(也就是接口2和接口3),共同组成一个音频功能”。
小结: 通过IAD,提前知道了这个摄像头其实是个“音视频一体机”。接口0和1负责视频,接口2和3负责音频。这下 bNumInterfaces: 4 就说得通了。
接口与端点描述符 (Interface & Endpoint Descriptors)
现在我们深入到每个“功能部门”去看细节。
视频功能 (接口 0 & 1):
-
接口 0: 视频控制接口 (Video Control)
Interface Descriptor: bInterfaceNumber 0 bInterfaceClass 14 Video bInterfaceSubClass 1 Video Control bNumEndpoints 1这里明确了接口0是视频控制接口。它有一个端点 (bNumEndpoints: 1)。
-
内部细节:
- INPUT_TERMINAL: 类型是 0x0201 Camera Sensor,代表视频信号来自摄像头传感器。
- PROCESSING_UNIT: 这里列出了一长串它支持的控制项,比如 Brightness (亮度), Contrast (对比度), Saturation (饱和度), White Balance (白平衡)等等。这就是你能在软件里调节的那些参数。
- OUTPUT_TERMINAL: 代表处理后的数据流向USB总线。
-
端点:
Endpoint Descriptor: bEndpointAddress 0x87 EP 7 IN Transfer Type Interrupt wMaxPacketSize 0x0010 (16 bytes)
这个接口使用 7号输入(IN)中断端点。它用来干嘛呢?比如你在摄像头上按了一个物理快门按钮,或者摄像头状态发生了变化(比如过热),它就会通过这个端点,主动、快速地把这个信息报告给电脑。
-
-
接口 1: 视频流接口 (Video Streaming)
Interface Descriptor: bInterfaceNumber 1 bInterfaceSubClass 2 Video Streaming接口1是视频流接口,专门传图像数据。这里最有趣的是它有很多个交替设置 (Alternate Setting),从 0 到 11。
-
bAlternateSetting: 0: bNumEndpoints: 0。这是默认设置,它不占用任何带宽。
-
bAlternateSetting: 1 到 11: 每个设置都有1个端点,并且端点的 wMaxPacketSize (最大包大小) 从 192 字节一直增加到 3x 1020 字节。
- 这是为什么呢? 因为传输不同分辨率/帧率的视频所需要的带宽是不同的。当你的应用程序(比如OBS)要开启1080p 30fps的视频流时,驱动程序会计算出所需要的带宽,然后选择一个 wMaxPacketSize 合适的 Alternate Setting 并激活它。这就好比根据货物量的多少,选择开小货车还是大卡车来运货。
-
视频“菜单”:
- bNumFormats: 2:说明支持两种视频格式。
-
格式1: FORMAT_UNCOMPRESSED (YUY2):guidFormat: {32595559-…} 这个长长的字符串是 YUYV (通常在Windows下被识别为YUY2) 格式的唯一标识.它下面列出了3种帧描述符(Frame Descriptor):
- 1600x1200 @ 5fps (1 / (2000000 * 10^-7) = 5)
- 1280x720 @ 7.5fps (1 / (1333333 * 10^-7) ≈ 7.5)
- 640x480 @ 30fps (1 / (333333 * 10^-7) ≈ 30)
-
格式2: FORMAT_MJPEG: 这是一种压缩格式,每一帧都是一张JPEG图片。它下面也列出了3种分辨率:
- 1600x1200 @ 30fps
- 1280x720 @ 30fps
- 640x480 @ 30fps
-
- bNumFormats: 2:说明支持两种视频格式。
-
端点::所有用于传输视频的 Alternate Setting 都指向了同一个端点地址:
Endpoint Descriptor: bEndpointAddress 0x81 EP 1 IN Transfer Type Isochronous它使用 1号输入(IN)同步端点。同步传输是专门为视频、音频这种需要持续、稳定带宽的流数据设计的,能保证画面的流畅。
-
-
音频功能 (接口 2 & 3)
- 接口 2: 音频控制接口 (Audio Control)
+ INPUT_TERMINAL: 类型是 0x0201 Microphone,指明了音频来源是麦克风。
+ FEATURE_UNIT: 支持 Mute Control (静音) 和 Volume Control (音量控制)。 - 接口 3: 音频流接口 (Audio Streaming):它也使用了 Alternate Setting 来支持不同的音频采样率。
+ wFormatTag: 0x0001 PCM:说明音频格式是标准的PCM无压缩格式。
+ 支持的采样率 (tSamFreq) 包括 8000Hz, 16000Hz, 44100Hz, 48000Hz。
+ 端点使用的是 6号输入(IN)同步端点 (bEndpointAddress: 0x86)。
总结
通过对摄像头这份真实“简历”的剖析,我们得到了一个非常清晰的画像:
这不仅仅是一个“USB Camera”,而是一个功能强大的复合音视频设备。它通过4个接口和2个IAD,清晰地向操作系统展示了它的两大核心功能:
视频功能 (接口0+1): 提供了一系列可调节的图像参数,并且支持YUY2和MJPEG两种格式,每种格式下都有多种分辨率和帧率的“菜单”供应用程序选择。
音频功能 (接口2+3): 内置了一个可控音量和静音的麦克风,支持多种标准的采样率。
1万+

被折叠的 条评论
为什么被折叠?



