2. 摄像头传感器基础:传感器接口类型、像素时钟与行场同步信号、数据格式

摄像头传感器是图像采集链路的起点,它将光信号转换为数字电信号。理解传感器的物理接口、同步时序以及数据输出格式,是后续设计 DMA 传输与缓存管理的基础。本章将围绕这三个核心维度展开,为驱动开发提供必要的硬件知识。

2.1 传感器接口类型:MIPI CSI 与 DVP

摄像头传感器与主控 SoC 之间的数据传输接口,目前主流分为两大类:MIPI CSI(Mobile Industry Processor Interface, Camera Serial Interface)和 DVP(Digital Video Port)。两者的电气特性、引脚数量、传输速率和适用场景差异显著。

特性 MIPI CSI (D-PHY) DVP (并行接口)
信号类型 差分串行 (LVDS-like) 单端并行 (CMOS/TTL)
典型引脚数 4~10 (1~4 Lane + CLK) 20~30 (DATA[8:12] + HSYNC + VSYNC + PCLK)
最大速率 单 Lane 可达 2.5 Gbps (D-PHY v1.2) 通常 ≤ 150 MHz PCLK (约 150 MB/s)
抗干扰能力 强 (差分信号) 弱 (易受串扰)
适用场景 高分辨率、高帧率 (≥ 1080p@60fps) 低分辨率、低成本、短距离 (≤ 30cm)
协议复杂度 高 (需 PHY 层 + 协议层) 低 (直接采样像素数据)
驱动开发提示:MIPI CSI 接口在嵌入式 Linux 中通常由 drivers/media/platform 下的 V4L2 子设备驱动管理,需要配置 D-PHY 的电压摆幅、偏置电流和均衡参数。DVP 接口则更简单,主要关注 GPIO 的复用功能和 PCLK 的极性。

2.1.1 MIPI CSI 架构与 Lane 配置

MIPI CSI 采用分层架构:PHY 层(D-PHY)负责电气特性与串行化,协议层(CSI-2)负责数据包格式与错误检测。一个典型的 CSI-2 发送端包含 1 条时钟 Lane 和 1~4 条数据 Lane。

MIPI CSI-2 发送端(传感器侧)架构 像素阵列 + ADC ISP / 格式打包 RAW / YUV / JPEG CSI-2 协议层 包封装 / ECC / CRC D-PHY 层 串行化 / 差分驱动 Lane 输出 CLK + Data[0..n] Lane 数量决定带宽:4 Lane 配置下,单 Lane 1 Gbps 时总带宽可达 4 Gbps(含开销)
关键配置参数:在设备树中,MIPI CSI 接口通常需要指定 data-lanes(如 <1 2> 表示使用 Lane 1 和 Lane 2)、clock-noncontinuous(非连续时钟模式)以及 link-frequencies(链路速率)。错误配置会导致 PHY 无法锁定或数据错位。

2.1.2 DVP 接口与同步信号

DVP 接口使用并行数据总线(通常 8/10/12 位)配合 3 个同步信号:PCLK(像素时钟)、HSYNC(行同步)、VSYNC(场同步)。驱动需要根据传感器数据手册配置这些信号的极性和时序关系。

DVP 接口典型时序(一行数据) PCLK HSYNC DATA[7:0] 无效(消隐) 有效像素数据(一行) HSYNC 高电平期间,PCLK 每个上升沿采样一个像素;VSYNC 高电平表示一帧开始
常见陷阱:DVP 接口的 PCLK 频率不能超过 SoC 的 GPIO 输入频率上限。例如,某些 ARM 平台的 GPIO 最大输入频率为 150 MHz,若传感器输出 200 MHz PCLK,则必须使用 MIPI 接口或降低分辨率/帧率。

2.2 像素时钟与行场同步信号

像素时钟(PCLK)是传感器数据输出的基准时钟,每个 PCLK 周期传输一个像素(或一个像素分量)。行同步(HSYNC)和场同步(VSYNC)信号定义了像素数据的有效区域。驱动必须正确解析这些时序,才能从数据流中提取出完整的图像帧。

2.2.1 时序参数计算

对于给定的分辨率和帧率,可以计算出所需的 PCLK 频率。以下是一个 1080p@30fps 的典型计算示例:

// 参数定义
#define H_ACTIVE    1920    // 有效像素每行
#define V_ACTIVE    1080    // 有效行数每帧
#define H_BLANKING  280     // 行消隐(HFP + HBP + HSYNC)
#define V_BLANKING  45      // 场消隐(VFP + VBP + VSYNC)
#define FRAME_RATE  30      // 目标帧率

// 计算总像素每行
uint32_t total_pixels_per_line = H_ACTIVE + H_BLANKING;  // 2200

// 计算总行数每帧
uint32_t total_lines_per_frame = V_ACTIVE + V_BLANKING;  // 1125

// 计算 PCLK 频率
uint32_t pclk_hz = total_pixels_per_line * total_lines_per_frame * FRAME_RATE;
// pclk_hz = 2200 * 1125 * 30 = 74,250,000 Hz ≈ 74.25 MHz
驱动实现要点:在 Linux V4L2 驱动中,struct v4l2_pix_format 的 width 和 height 只表示有效像素区域。消隐区数据通常被传感器或接收端丢弃,不进入 DMA 缓存。但消隐区长度会影响帧间隔和带宽计算。

2.2.2 同步信号极性配置

不同传感器对 HSYNC/VSYNC 的极性定义可能不同。驱动需要通过设备树或寄存器配置来匹配。常见的极性选项包括:

  • HSYNC 极性:高电平有效(active high)或低电平有效(active low)。
  • VSYNC 极性:高电平有效或低电平有效。
  • PCLK 边沿:上升沿采样或下降沿采样。
  • VSYNC 触发方式:同步(与 HSYNC 对齐)或异步(独立触发)。
传感器型号 PCLK 边沿 HSYNC 极性 VSYNC 极性
OV5640 上升沿 高有效 高有效
IMX219 下降沿 低有效 低有效
AR0230 上升沿 高有效 低有效

2.3 数据格式:RAW、YUV、JPEG

传感器输出的数据格式直接影响 DMA 传输的位宽、缓存大小以及后续处理流程。常见的输出格式分为三类:RAW(原始拜耳数据)、YUV(亮度和色度分离)和 JPEG(压缩图像数据)。

2.3.1 RAW 格式

RAW 格式是传感器 ADC 直接输出的拜耳阵列数据,每个像素只包含一种颜色分量(R、G 或 B)。常见的位深有 8-bit、10-bit、12-bit 和 14-bit。RAW 数据占用带宽最小,但需要 ISP 进行去马赛克(demosaic)处理才能得到彩色图像。

RAW 拜耳阵列(BGGR 模式) B G G R 每个像素仅包含一种颜色 常见模式:BGGR / RGGB / GRBG 位深:8/10/12/14 bit 带宽 = 分辨率 × 位深 × 帧率 RAW10 格式在 DMA 中通常按 4 像素打包为 5 字节存储

2.3.2 YUV 格式

YUV 格式将亮度(Y)与色度(U/V)分离,便于压缩和传输。常见的子采样格式包括 YUYV(4:2:2)、UYVY、NV12(4:2:0)等。YUV 格式的数据量通常大于 RAW,但可以直接用于显示或编码。

格式 子采样 每像素位数 典型应用
YUYV 4:2:2 16 USB 摄像头、V4L2 默认
NV12 4:2:0 12 视频编码(H.264/H.265)
YV12 4:2:0 12 旧版编码器、软件处理
UYVY 4:2:2 16 部分 DSP 直接支持

2.3.3 JPEG 格式

部分高端传感器(如 OV5640、AR1335)内置 JPEG 编码器,可以直接输出压缩后的 JPEG 数据流。JPEG 格式的数据量是动态变化的,取决于图像内容。驱动需要处理变长数据包,并解析 JPEG 的 SOI(Start of Image)和 EOI(End of Image)标记。

DMA 设计挑战:JPEG 输出时,每帧数据大小不固定。DMA 缓存必须设置为最大可能帧大小(通常为 RAW 大小的 1/5~1/10),并通过中断或帧结束标记来确认传输完成。不能使用固定大小的 DMA 描述符链。

2.4 本章小结