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)
驱动开发提示: 当前主流嵌入式平台(Qualcomm、MediaTek、Rockchip、NXP i.MX)均采用 CSI-2 + D-PHY 组合。C-PHY 多见于高端旗舰手机,驱动配置方式与 D-PHY 有显著差异。

1.2 CSI-2 协议栈分层

CSI-2 协议栈采用分层架构,从底层物理连接到上层应用接口共分为四层。每一层封装特定的功能,层与层之间通过标准接口交互。

CSI-2 协议栈分层架构 应用层(Application Layer) 像素格式转换 · 数据流控制 · 帧/行同步信号 协议层(Protocol Layer) 长/短包格式 · ECC 校验 · CRC 校验 · 虚拟通道 链路层(Lane Management Layer) 通道分配 · 数据分发 · 低功耗模式控制 物理层(Physical Layer — D-PHY / C-PHY) 时钟通道 · 数据通道 · 高速/低功耗模式 · 电气特性 驱动 配置 接口 包 解析 通道 映射 时序 配置

各层在摄像头驱动中的职责如下:

  • 应用层: 驱动中负责配置像素格式(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) 进行通信。

物理层与协议层交互关系 协议层(Protocol Layer) 包组装/解析 ECC/CRC 生成与校验 虚拟通道路由 物理层(D-PHY) 时钟通道(DDR) 数据通道(HS/LP) 电气信号驱动与接收 PPI PHY-Protocol Interface 数据流方向(摄像头 → 处理器) 传感器像素数据 → 协议层打包(长包/短包) → PPI 传递 → 物理层串行化 → D-PHY 差分信号传输 处理器端:D-PHY 接收 → PPI 传递 → 协议层解包 → 应用层获取图像帧

PPI 接口定义了以下关键信号组:

信号组 方向 描述
phy_clk PHY → Protocol 从物理层恢复的字节时钟,协议层以此时钟采样数据
phy_data[0..n] PHY → Protocol 反序列化后的字节数据,每个通道独立
phy_hs_sync PHY → Protocol 高速传输同步指示信号
phy_lp_* 双向 低功耗模式控制与状态信号
phy_tx_* Protocol → PHY 发送方向的控制与数据信号(用于传感器配置回传)
驱动配置要点: 在摄像头驱动初始化阶段,必须确保物理层(D-PHY PLL)锁定稳定后,协议层才开始接收数据。通常 SoC 的 MIPI 控制器提供状态寄存器(如 PHY_STATUS),驱动需要轮询或等待中断确认 PHY 已就绪。

1.4 摄像头驱动中的 MIPI 角色

在摄像头驱动软件栈中,MIPI 链路配置涉及多个软件层次。以下是从 Linux V4L2 框架角度梳理的典型角色划分:

摄像头驱动 MIPI 角色架构(Linux V4L2) 用户空间(User Space) V4L2 框架 / Video Device Sensor 子设备驱动(CSI-2 协议处理) MIPI CSI 主机控制器驱动(通道管理) D-PHY 控制器驱动(PHY 配置)

各角色的具体职责与典型代码示例:

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;
}
常见陷阱: Sensor 驱动与主机控制器驱动的 MIPI 参数必须完全一致(通道数、虚拟通道 ID、像素格式)。如果 Sensor 输出 4 Lane RAW10,但主机控制器配置为 2 Lane,将导致数据错位或 CRC 错误。建议在驱动 probe 阶段通过设备树(Device Tree)或 ACPI 统一描述这些参数。

1.5 本章小结

MIPI CSI-2 是摄像头驱动开发的核心接口标准。理解其分层架构(应用层 → 协议层 → 链路层 → 物理层)有助于在驱动开发中快速定位问题:

  • 图像花屏/偏色 → 检查应用层像素格式与协议层包解析
  • 帧率不足/丢帧 → 检查链路层通道分配与物理层时钟频率
  • 无图像/黑屏 → 检查物理层 PLL 锁定状态与电气连接