4. Camera Sensor 硬件接口:MIPI CSI、I2C、电源与时钟
在驱动工程师眼中,Camera Sensor 是一个通过 MIPI CSI 传输图像数据、通过 I2C 接收控制命令、依赖多路电源和复位时钟才能工作的复合外设。本章从硬件接口出发,梳理驱动必须掌握的物理连接与电气特性。
学习提示: 驱动代码中的 GPIO 编号、I2C 地址、MIPI Lane 数、时钟频率等参数,全部来源于本章描述的硬件接口定义。理解硬件连接是正确编写设备树节点的前提。
4.1 接口全景图
下图展示了一个典型 Camera Sensor 与 SoC 之间的硬件连接关系,包含数据、控制、电源和时钟四类信号。
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 实现。
4.5 复位与时钟
4.5.1 复位引脚 (XSHUTDOWN / RESET)
Camera Sensor 通常提供一个硬件复位引脚,低电平有效。驱动在初始化时必须完成以下复位流程:
- 将复位引脚拉低并保持至少 1 ms(进入复位状态)。
- 将复位引脚拉高并等待至少 10 ms(退出复位,Sensor 开始初始化内部电路)。
- 等待 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 |