高通平台Camera HAL层UVC协议集成 - 第3节
3.1 USB Video Class 标准概述
USB Video Class(UVC)是 USB 实现组织(USB-IF)定义的设备类标准,用于规范通过 USB 总线传输视频流数据的设备行为。UVC 标准的核心目标是让操作系统和应用程序能够通过统一的驱动程序接口访问不同厂商的摄像头设备,无需为每款摄像头单独安装驱动。
UVC 标准经历了多个版本迭代,每个版本在带宽、帧率、分辨率支持和协议扩展上都有显著提升:
| 版本 | 发布时间 | 最大带宽(USB 2.0) | 关键特性 |
|---|---|---|---|
| UVC 1.0 | 2003 | 480 Mbps | 基础视频流、静态图像捕获、基本控制 |
| UVC 1.1 | 2005 | 480 Mbps | 增加 H.264 编码支持、改进帧同步 |
| UVC 1.5 | 2012 | 5 Gbps(USB 3.0) | 4K 分辨率、MJPEG 优化、多流支持 |
3.2 UVC 描述符体系
UVC 描述符是设备向主机报告自身能力的数据结构,位于 USB 配置描述符(Configuration Descriptor)内部。主机通过解析这些描述符,获知摄像头的控制能力、流格式、帧尺寸、编码类型等信息。
UVC 描述符体系分为三个层级:
- Class-Specific 描述符:定义 UVC 设备特有的功能单元和终端。
- 标准 USB 描述符:设备描述符、配置描述符、接口描述符、端点描述符。
- 帧格式描述符:描述支持的视频格式(YUY2、MJPEG、H.264)和帧尺寸。
以下是一个典型的 UVC 描述符解析流程:
// 伪代码:UVC 描述符解析入口
void parse_uvc_descriptor(usb_device_handle *dev) {
// 1. 获取配置描述符
struct usb_config_descriptor *config = get_config_descriptor(dev);
// 2. 遍历接口描述符,查找 VideoControl Interface
for (int i = 0; i < config->bNumInterfaces; i++) {
struct usb_interface *iface = &config->interface[i];
if (iface->altsetting->bInterfaceClass == 0x0E && // Video Class
iface->altsetting->bInterfaceSubClass == 0x01) { // VideoControl Subclass
parse_video_control_descriptor(iface);
}
}
// 3. 遍历 VideoStreaming 接口描述符
for (int i = 0; i < config->bNumInterfaces; i++) {
struct usb_interface *iface = &config->interface[i];
if (iface->altsetting->bInterfaceClass == 0x0E &&
iface->altsetting->bInterfaceSubClass == 0x02) { // VideoStreaming Subclass
parse_video_streaming_descriptor(iface);
}
}
}
3.3 VideoControl Interface(VCI)
VideoControl Interface(VCI)是 UVC 设备中负责控制功能的接口,不传输视频数据。它通过控制端点(Endpoint 0)与主机通信,实现摄像头参数调节、设备状态查询等功能。
VCI 内部包含以下核心单元:
- Input Terminal(IT):视频输入源,如传感器、HDMI 输入。
- Output Terminal(OT):视频输出目标,如 USB 端点。
- Processing Unit(PU):图像处理单元,控制亮度、对比度、饱和度等。
- Extension Unit(XU):厂商自定义扩展单元,用于私有控制功能。
- Selector Unit(SU):多路选择器,切换不同输入源。
以下 SVG 图展示了 VCI 内部单元之间的拓扑关系:
3.4 VideoStreaming Interface(VSI)
VideoStreaming Interface(VSI)是 UVC 设备中负责视频数据传输的接口。它通过等时端点(Isochronous Endpoint)或批量端点(Bulk Endpoint)向主机发送视频帧数据。VSI 支持多个备选设置(Alternate Setting),每个设置对应不同的带宽占用和帧格式。
VSI 描述符中定义了以下关键信息:
| 描述符类型 | bDescriptorSubtype | 内容说明 |
|---|---|---|
| Input Header | 0x01 | VSI 头部信息,包含总长度、时钟频率等 |
| Format Descriptor | 0x02 | 视频格式类型(YUY2、MJPEG、H.264) |
| Frame Descriptor | 0x03 | 帧宽度、高度、帧间隔(帧率) |
| Color Matching | 0x0D | 色彩空间、传输特性、矩阵系数 |
以下 SVG 图展示了 VSI 在 USB 总线上的数据传输流程:
3.5 VCI 与 VSI 的协同工作
在实际 UVC 设备中,VCI 和 VSI 通过同一个 USB 配置描述符下的两个不同接口协同工作。VCI 负责控制通道,VSI 负责数据通道。主机通过 VCI 下发控制命令(如设置分辨率、调节曝光),VSI 则根据当前配置开始或停止视频流传输。
以下表格总结了 VCI 和 VSI 的核心差异:
| 对比维度 | VideoControl Interface | VideoStreaming Interface |
|---|---|---|
| 主要功能 | 摄像头参数控制 | 视频数据传输 |
| USB 端点类型 | 控制端点(Endpoint 0) | 等时/批量端点 |
| 数据传输方向 | 双向(控制请求+响应) | 单向(设备→主机) |
| 带宽占用 | 极低(仅控制命令) | 高(视频帧数据) |
| HAL 层处理 | 同步请求,阻塞等待响应 | 异步轮询,DMA 传输 |