3. 摄像头硬件接口
MIPI CSI-2(Camera Serial Interface 2)是移动与嵌入式领域最主流的摄像头图像数据传输协议。它定义了从图像传感器到应用处理器(AP)或 ISP 之间的高速串行数据链路。理解 CSI-2 协议栈、D-PHY 物理层特性以及数据包结构,是驱动开发人员正确配置摄像头并实现稳定 DMA 采集的前提。
3.1 MIPI CSI-2 协议栈分层
CSI-2 协议采用分层架构,从上到下依次为:应用层、协议层(像素/字节到包转换)、链路层(LLP,Low-Level Protocol)和物理层(D-PHY / C-PHY)。驱动开发最常接触的是协议层与物理层。
驱动视角: 驱动需要配置 D-PHY 的时钟频率、通道数(Lane数)、虚拟通道(VC)映射以及数据包的超时与错误处理。物理层参数直接影响 DMA 传输的带宽与帧率。
3.2 D-PHY 物理层详解
D-PHY 是 CSI-2 最常用的物理层标准,采用差分信号传输,包含一个时钟 Lane 和 1~4 个数据 Lane。每个 Lane 由一对差分线(Dp/Dn)组成。
3.2.1 关键电气特性
| 参数 | 高速模式 (HS) | 低功耗模式 (LP) |
|---|---|---|
| 信号幅度 | 200 mV(差分) | 1.2 V(单端) |
| 传输速率 | 80 Mbps ~ 4.5 Gbps / Lane | ~10 Mbps |
| 功耗 | 高 | 极低 |
| 用途 | 图像数据突发传输 | 控制命令、总线周转(BTA) |
3.2.2 数据 Lane 与时钟 Lane 关系
时钟 Lane 提供 DDR(Double Data Rate)时钟,数据 Lane 在时钟的上升沿和下降沿各采样一次。驱动配置时需确保时钟频率与数据速率匹配:
// 典型配置示例:4 Lane, 每 Lane 1 Gbps
// 时钟频率 = 数据速率 / 2 = 500 MHz
// 总带宽 = 1 Gbps * 4 = 4 Gbps
// 有效像素带宽需扣除协议开销(约 10%~15%)
驱动配置要点: 在设备树或平台数据中,必须正确设置
data-lanes 属性(如 <1 2 3 4>)和 clock-noncontinuous 标志。时钟连续模式用于高速连续传输,非连续模式用于省电。
3.3 数据包格式
CSI-2 数据以包(Packet)为单位传输,分为长包(Long Packet)和短包(Short Packet)。长包用于传输像素数据,短包用于传输帧同步、行同步等控制信息。
3.3.1 长包结构
3.3.2 包头部(PHI)字段解析
| 字段 | 位数 | 说明 |
|---|---|---|
| VC (Virtual Channel) | 2 | 虚拟通道标识,支持最多 4 个独立数据流 |
| DT (Data Type) | 6 | 数据类型,如 RAW10 (0x2B)、YUV422 8bit (0x1E) |
| WC (Word Count) | 16 | 数据负载的字节数(长包)或保留(短包) |
| ECC | 8 | 错误校正码,可纠正 1 bit 错误,检测 2 bit 错误 |
3.3.3 短包结构
短包没有数据负载和 CRC,仅包含 PHI(VC+DT+WC)和 ECC。DT 字段用于区分帧起始(FS,Frame Start)、帧结束(FE,Frame End)、行起始(LS,Line Start)等事件。
// 常见短包 DT 值
#define CSI2_DT_FRAME_START 0x00 // 帧起始
#define CSI2_DT_FRAME_END 0x01 // 帧结束
#define CSI2_DT_LINE_START 0x02 // 行起始
#define CSI2_DT_LINE_END 0x03 // 行结束
驱动调试常见问题: 如果 DMA 采集到的图像出现错位、颜色混乱或帧不完整,首先检查 PHI 中的 DT 是否与传感器配置一致。例如,传感器输出 RAW10 但驱动配置为 RAW8,会导致每个像素的位宽错位。
3.4 虚拟通道(Virtual Channel)
虚拟通道允许在同一个 CSI-2 物理链路上传输最多 4 个独立的图像数据流。每个数据包头部中的 VC 字段(2 bit)标识该包属于哪个通道。驱动通过 VC 号将不同数据流路由到不同的 DMA 通道或内存缓冲区。
3.4.1 虚拟通道应用场景
- 多摄像头复用: 多个传感器共享同一 CSI-2 接口,每个传感器分配一个 VC。
- 多数据流输出: 单个传感器同时输出 RAW 和 YUV 数据流,分别使用不同 VC。
- 元数据通道: 使用 VC 传输传感器统计信息或嵌入式数据。
3.4.2 驱动中的 VC 配置
// 设备树示例:双摄像头共享 CSI-2
&csi2 {
status = "okay";
ports {
port@0 {
reg = <0>;
endpoint {
remote-endpoint = <&sensor_a_ep>;
data-lanes = <1 2>;
};
};
port@1 {
reg = <1>;
endpoint {
remote-endpoint = <&sensor_b_ep>;
data-lanes = <3 4>;
};
};
};
};
// 传感器 A 输出 VC=0,传感器 B 输出 VC=1
// 驱动在接收时根据 VC 字段分发数据
3.5 本章小结
- MIPI CSI-2 采用分层协议栈,驱动开发重点关注协议层(包格式)和物理层(D-PHY 参数)。
- D-PHY 使用差分信号,支持高速(HS)和低功耗(LP)两种模式,驱动需配置 Lane 数、时钟频率和连续/非连续模式。
- 数据包分为长包(含 PHI、Payload、CRC)和短包(仅 PHI+ECC),PHI 中的 VC、DT、WC 字段是驱动解析的关键。
- 虚拟通道(VC)支持多数据流复用,驱动通过 VC 号将数据路由到正确的 DMA 通道或缓冲区。