4. Camera Sensor 硬件接口:MIPI CSI、I2C、电源与时钟

在驱动工程师眼中,Camera Sensor 是一个通过 MIPI CSI 传输图像数据、通过 I2C 接收控制命令、依赖多路电源和复位时钟才能工作的复合外设。本章从硬件接口出发,梳理驱动必须掌握的物理连接与电气特性。

学习提示: 驱动代码中的 GPIO 编号、I2C 地址、MIPI Lane 数、时钟频率等参数,全部来源于本章描述的硬件接口定义。理解硬件连接是正确编写设备树节点的前提。

4.1 接口全景图

下图展示了一个典型 Camera Sensor 与 SoC 之间的硬件连接关系,包含数据、控制、电源和时钟四类信号。

Camera Sensor 硬件接口全景图 SoC (主控端) CSI 主机 I2C 控制器 Camera Sensor MIPI CSI I2C 从设备 MIPI CSI (1~4 Lane) 差分时钟 + 差分数据 I2C (SCL + SDA) 寄存器读写 / 控制命令 电源 (AVDD / DVDD / IOVDD) 多路独立供电 复位 (XSHUTDOWN) + 主时钟 (MCLK) 硬件初始化时序 图例: MIPI 数据 I2C 控制 电源 复位/时钟

4.2 MIPI CSI 接口

MIPI CSI (Camera Serial Interface) 是移动和嵌入式领域最主流的摄像头图像数据传输标准。驱动开发者需要关注以下关键参数:

参数 典型值 驱动关注点
Lane 数量 1 / 2 / 4 Lane 设备树中指定 data-lanes 属性
每 Lane 速率 400 Mbps ~ 2.5 Gbps 影响时钟频率计算与 SoC CSI 控制器配置
差分阻抗 100 Ω ± 10% PCB 布线要求,驱动无需处理
数据格式 RAW8 / RAW10 / RAW12 / YUV422 驱动需在初始化序列中设置格式寄存器
关键概念: MIPI CSI 物理层使用差分信号对(D-PHY),每个 Lane 包含一对差分线(DP/DN)。时钟 Lane 独立于数据 Lane,数据 Lane 可以动态切换方向(用于双向通信),但 Camera Sensor 通常只作为发送端。

4.3 I2C 控制接口

I2C 是 Camera Sensor 的控制总线,用于 SoC 向 Sensor 写入寄存器配置、读取状态信息。驱动开发者必须确认以下硬件参数:

  • I2C 设备地址: 7 位或 10 位地址,通常由 Sensor 的 ADDR 引脚电平决定。例如 OV5640 的默认地址为 0x3C(写)/ 0x3D(读)。
  • I2C 时钟频率: 标准模式 100 kHz,快速模式 400 kHz,高速模式可达 1 MHz。驱动中通过设备树 clock-frequency 属性配置。
  • 寄存器地址宽度: 8 位或 16 位。例如 IMX219 使用 16 位寄存器地址,驱动在 I2C 传输时需要先发送高 8 位地址。
  • 数据位宽: 通常为 8 位,部分 Sensor 支持 16 位数据寄存器。
// 设备树中 I2C 相关属性示例
&i2c2 {
    status = "okay";
    clock-frequency = <400000>;  // 400 kHz 快速模式

    camera_sensor: camera@3c {
        compatible = "ovti,ov5640";
        reg = <0x3c>;            // 7 位 I2C 地址
        // ... 其他属性
    };
};
常见陷阱: I2C 地址在数据手册中通常以 8 位形式给出(如 0x78),但设备树 reg 属性要求填写 7 位地址(0x3C)。两者关系为:8 位地址 = 7 位地址 << 1。务必确认数据手册的表述方式。

4.4 电源管理引脚

Camera Sensor 通常需要多路独立电源,驱动必须按照正确的上电时序控制这些电源。常见的电源域包括:

电源名称 典型电压 供电对象 驱动控制方式
AVDD 2.8 V 模拟电路(像素阵列、ADC) regulator 或 GPIO 使能
DVDD 1.2 V / 1.8 V 数字核心逻辑 regulator 或 GPIO 使能
IOVDD 1.8 V / 2.8 V I2C、MIPI 等 I/O 接口 regulator 或 GPIO 使能

上电时序通常要求:AVDD → DVDD → IOVDD,或按照数据手册指定的顺序。驱动中通过 regulator_set_voltage 和 regulator_enable 实现。

Camera Sensor 上电时序图 时间 AVDD (2.8V) t0 DVDD (1.2V) t1 IOVDD (1.8V) t2 上电顺序:AVDD → DVDD → IOVDD,各电源间隔 ≥ 0.1 ms

4.5 复位与时钟

4.5.1 复位引脚 (XSHUTDOWN / RESET)

Camera Sensor 通常提供一个硬件复位引脚,低电平有效。驱动在初始化时必须完成以下复位流程:

  1. 将复位引脚拉低并保持至少 1 ms(进入复位状态)。
  2. 将复位引脚拉高并等待至少 10 ms(退出复位,Sensor 开始初始化内部电路)。
  3. 等待 Sensor 内部初始化完成(通常通过读取状态寄存器或等待固定延时)。
// 复位时序的 GPIO 操作示例
gpiod_set_value(sensor->reset_gpio, 0);  // 拉低复位
mdelay(2);                                // 保持 2 ms
gpiod_set_value(sensor->reset_gpio, 1);  // 拉高释放
msleep(20);                               // 等待 Sensor 稳定

4.5.2 主时钟 (MCLK / XVCLK)

Sensor 需要外部提供主时钟信号,频率通常为 6 MHz ~ 27 MHz。驱动开发者需要关注:

  • 时钟频率: 由 Sensor 数据手册指定,例如 OV5640 使用 24 MHz,IMX219 使用 24 MHz。
  • 时钟源: 可由 SoC 的 GPIO 复用为时钟输出,或使用外部晶振。
  • 时钟精度: 通常要求 ±1% 以内,否则影响 PLL 锁定和帧率稳定性。
// 设备树中时钟配置示例
camera_sensor: camera@3c {
    compatible = "ovti,ov5640";
    reg = <0x3c>;
    clocks = <&clks IMX6UL_CLK_CSI>;
    clock-names = "xvclk";
    assigned-clocks = <&clks IMX6UL_CLK_CSI>;
    assigned-clock-rates = <24000000>;  // 24 MHz
};
调试技巧: 如果 Sensor 初始化失败,首先用示波器测量 MCLK 引脚是否有正确的时钟波形,以及 XSHUTDOWN 引脚的复位时序是否满足数据手册要求。硬件信号异常是驱动调试中最常见的问题根源。

4.6 接口总结对照表

接口类型 信号名称 驱动核心任务 设备树属性
MIPI CSI CLK_P/N, DATA0_P/N ~ DATA3_P/N 配置 Lane 映射与数据格式 data-lanes, bus-type
I2C 控制 SCL, SDA 寄存器读写,初始化序列 reg, clock-frequency
电源管理 AVDD, DVDD, IOVDD 上电时序控制 AVDD-supply, DVDD-supply, IOVDD-supply
复位 XSHUTDOWN / RESET 复位时序控制 reset-gpios
时钟 MCLK / XVCLK 时钟频率配置与使能 clocks, assigned-clock-rates