1. MIPI CSI-2 概述
MIPI CSI-2(Camera Serial Interface 2)是移动与嵌入式系统中摄像头与应用处理器之间最主流的高速串行接口标准。本章从 MIPI 联盟背景出发,逐层剖析 CSI-2 协议栈,厘清物理层与协议层的协作关系,并明确摄像头驱动开发者在 MIPI 链路中的具体职责。
1.1 MIPI 联盟简介
MIPI(Mobile Industry Processor Interface)联盟成立于 2003 年,由 ARM、Intel、Nokia、STMicroelectronics、TI 等公司发起,旨在制定移动设备内部组件之间的开放接口标准。截至 2025 年,MIPI 联盟拥有超过 350 家成员公司,覆盖半导体、手机、汽车、物联网、AI 摄像头等领域。
MIPI 标准体系覆盖了摄像头、显示、射频、调试、存储等多个子系统,其中与摄像头驱动最密切的标准包括:
| 标准名称 | 全称 | 主要用途 |
|---|---|---|
| CSI-2 | Camera Serial Interface 2 | 摄像头图像数据传输 |
| DSI-2 | Display Serial Interface 2 | 显示面板数据传输 |
| D-PHY | Physical Layer for CSI/DSI | 物理层电气规范与时钟/数据通道 |
| C-PHY | Physical Layer Alternative | 更高带宽的物理层替代方案 |
| I3C | Improved Inter-Integrated Circuit | 摄像头控制总线(替代传统 I²C) |
1.2 CSI-2 协议栈分层
CSI-2 协议栈采用分层架构,从底层物理连接到上层应用接口共分为四层。每一层封装特定的功能,层与层之间通过标准接口交互。
各层在摄像头驱动中的职责如下:
- 应用层: 驱动中负责配置像素格式(RAW8/10/12、YUV422、RGB888)、帧尺寸、帧率控制,以及处理帧起始(FS)和帧结束(FE)同步信号。
- 协议层: 驱动需要解析长包(Long Packet,包含像素数据)和短包(Short Packet,包含帧/行同步信息),并处理 ECC(纠错码)和 CRC(循环冗余校验)。
- 链路层: 驱动负责配置通道数量(1/2/4 Lane)、虚拟通道 ID(Virtual Channel,VC),以及低功耗模式(ULPS)的进入与退出。
- 物理层: 驱动通过 SoC 的 D-PHY 控制器寄存器配置时钟频率、摆幅、预加重、偏置电流等电气参数。
1.3 物理层与协议层关系
物理层(D-PHY / C-PHY)负责在硬件线路上传输原始比特流,协议层则负责将比特流组织成有意义的包结构。两者通过 PHY-Protocol Interface(PPI) 进行通信。
PPI 接口定义了以下关键信号组:
| 信号组 | 方向 | 描述 |
|---|---|---|
phy_clk |
PHY → Protocol | 从物理层恢复的字节时钟,协议层以此时钟采样数据 |
phy_data[0..n] |
PHY → Protocol | 反序列化后的字节数据,每个通道独立 |
phy_hs_sync |
PHY → Protocol | 高速传输同步指示信号 |
phy_lp_* |
双向 | 低功耗模式控制与状态信号 |
phy_tx_* |
Protocol → PHY | 发送方向的控制与数据信号(用于传感器配置回传) |
PHY_STATUS),驱动需要轮询或等待中断确认 PHY 已就绪。
1.4 摄像头驱动中的 MIPI 角色
在摄像头驱动软件栈中,MIPI 链路配置涉及多个软件层次。以下是从 Linux V4L2 框架角度梳理的典型角色划分:
各角色的具体职责与典型代码示例:
1.4.1 Sensor 子设备驱动
负责通过 I²C/I³C 配置摄像头传感器内部的 CSI-2 发送端,包括:
- 设置输出像素格式(如
MEDIA_BUS_FMT_SBGGR10_1X10) - 配置通道数量与虚拟通道 ID
- 设置帧尺寸与帧率(影响 MIPI 时钟频率)
- 控制传感器流开启/关闭(Stream ON/OFF)
/* Sensor 驱动中典型的 MIPI 配置序列 */
static int sensor_start_stream(struct v4l2_subdev *sd)
{
struct sensor *s = to_sensor(sd);
/* 1. 设置 MIPI 通道数 */
sensor_write(s, REG_MIPI_LANE_NUM, 4);
/* 2. 设置虚拟通道 ID */
sensor_write(s, REG_MIPI_VC_ID, 0);
/* 3. 设置输出格式 RAW10 */
sensor_write(s, REG_OUTPUT_FORMAT, FORMAT_RAW10);
/* 4. 设置帧尺寸(1920x1080) */
sensor_write(s, REG_FRAME_WIDTH, 1920);
sensor_write(s, REG_FRAME_HEIGHT, 1080);
/* 5. 启动 MIPI 传输 */
sensor_write(s, REG_STREAM, STREAM_ON);
return 0;
}
1.4.2 MIPI CSI 主机控制器驱动
负责 SoC 端接收 MIPI 数据流的控制,包括:
- 配置接收端通道映射(D-PHY Lane Mapping)
- 设置虚拟通道过滤规则
- 管理接收缓冲区与 DMA 传输
- 处理帧同步中断与错误中断
1.4.3 D-PHY 控制器驱动
负责物理层参数配置,这是时钟同步的关键:
- 配置 PLL 倍频系数,生成目标比特率时钟
- 设置 HS-TX 摆幅(Swing)与预加重(Pre-emphasis)
- 配置 LP(低功耗)模式下的驱动电流
- 校准 D-PHY 内部延时(Deskew)
/* D-PHY 驱动中时钟配置示例 */
static int dphy_set_clk_rate(struct dphy_device *dphy, unsigned long rate)
{
u32 pll_mult;
/* 计算 PLL 倍频:目标比特率 / 参考时钟 */
pll_mult = rate / dphy->ref_clk_rate;
/* 写入 PLL 控制寄存器 */
writel(pll_mult, dphy->base + DPHY_PLL_MULT);
/* 等待 PLL 锁定 */
while (!(readl(dphy->base + DPHY_STATUS) & DPHY_PLL_LOCK))
udelay(10);
return 0;
}
1.5 本章小结
MIPI CSI-2 是摄像头驱动开发的核心接口标准。理解其分层架构(应用层 → 协议层 → 链路层 → 物理层)有助于在驱动开发中快速定位问题:
- 图像花屏/偏色 → 检查应用层像素格式与协议层包解析
- 帧率不足/丢帧 → 检查链路层通道分配与物理层时钟频率
- 无图像/黑屏 → 检查物理层 PLL 锁定状态与电气连接