USB摄像头描述符实战讲解

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:

  1. 第一个IAD (视频功能包)

    Interface Association:
    	bFirstInterface       0  (从接口0开始)
    	bInterfaceCount       2  (总共包含2个接口)
    	bFunctionClass       14 Video
    

    这个IAD声明:“从接口0开始的连续2个接口(也就是接口0和接口1),共同组成一个视频功能”。

  2. 第二个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):

  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)中断端点。它用来干嘛呢?比如你在摄像头上按了一个物理快门按钮,或者摄像头状态发生了变化(比如过热),它就会通过这个端点,主动、快速地把这个信息报告给电脑。

  2. 接口 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
    • 端点::所有用于传输视频的 Alternate Setting 都指向了同一个端点地址:

      Endpoint Descriptor:
      	bEndpointAddress     0x81  EP 1 IN
      	Transfer Type         Isochronous
      

      它使用 1号输入(IN)同步端点。同步传输是专门为视频、音频这种需要持续、稳定带宽的流数据设计的,能保证画面的流畅。

  3. 音频功能 (接口 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): 内置了一个可控音量和静音的麦克风,支持多种标准的采样率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值