3. Sensor硬件接口:I2C控制接口、MIPI数据通道、XSHUTDOWN复位引脚、MCLK主时钟引脚、电源供电时序

Camera Sensor 与主控 SoC(如 RK3588/RK3568)之间的物理连接是驱动初始化的基础。一个典型的 Sensor 硬件接口包含五大核心部分:I2C 控制接口、MIPI CSI 数据通道、XSHUTDOWN 复位引脚、MCLK 主时钟引脚以及电源供电网络。理解这些接口的电气特性与连接拓扑,是编写正确驱动代码的前提。

Camera Sensor 硬件接口连接拓扑 RK3588 / RK3568 SoC 主控 I2C Master CSI Host Camera Sensor IMX415 / OV5640 I2C Slave MIPI Tx I2C (SCL/SDA) 寄存器读写控制 MIPI CSI (4-lane) 图像数据流 MCLK (24MHz) XSHUTDOWN 主时钟输入 复位控制 电源 (AVDD/IOVDD/DVDD) 供电网络 所有接口必须按照 Sensor Datasheet 时序要求严格初始化

3.1 I2C 控制接口

I2C 是 Sensor 与 SoC 之间最核心的控制通道,用于读写寄存器、配置分辨率、曝光时间、增益等参数。RK 平台通常将 Sensor 挂载在 I2C 总线上,每个 Sensor 拥有唯一的 7 位从设备地址。

参数 典型值 说明
从设备地址 0x30 / 0x6C 7 位地址,左移 1 位后为 8 位读写地址
时钟频率 100 kHz / 400 kHz 标准模式与快速模式,RK 驱动默认 100 kHz
数据格式 16-bit 寄存器地址 + 8/16-bit 数据 大部分 Sensor 采用 16 位地址寻址
上拉电阻 4.7 kΩ SCL/SDA 线必须外接上拉至 IOVDD
驱动开发要点:在 RK 平台设备树中,I2C 节点下挂载 Sensor 时,必须正确配置 reg 属性为 Sensor 的 7 位 I2C 地址。例如 IMX415 的地址为 0x30,则设备树中写 reg = <0x30>。

3.2 MIPI CSI 数据通道

MIPI CSI-2 是 Sensor 向 SoC 传输图像数据的高速串行接口。RK3588 的 CSI Host 支持最多 4-lane 数据通道,每个 lane 的理论速率可达 1.5 Gbps。Sensor 端作为 MIPI Tx,SoC 端作为 MIPI Rx。

MIPI CSI-2 4-Lane 数据通道结构 Sensor MIPI Tx D-PHY 发送端 Lane 0 (Data+) Lane 1 (Data+) Lane 2 (Data+) Lane 3 (Data+) RK CSI Host D-PHY 接收端 每个 Lane 由一对差分信号线 (D+/D-) 组成,需等长布线
硬件设计注意:MIPI 差分对必须做 100Ω 阻抗匹配,且每组 Lane 的 P/N 线长度差应控制在 5mm 以内,否则会导致信号眼图闭合,产生 CRC 错误。

3.3 XSHUTDOWN 复位引脚

XSHUTDOWN(有时标注为 XCLR 或 RESET)是 Sensor 的硬件复位引脚,低电平有效。驱动初始化时,必须通过 GPIO 控制该引脚产生一个复位脉冲,使 Sensor 内部逻辑回到已知状态。

  • 复位时序要求:拉低 XSHUTDOWN 至少保持 1ms,然后释放为高电平,等待 Sensor 内部 PLL 锁定(通常 5~20ms)。
  • 设备树配置:在 RK 平台中,XSHUTDOWN 对应的 GPIO 通过 reset-gpios 属性描述。
  • 驱动代码实现:使用 gpiod_set_value_cansleep() 控制电平状态。
// 设备树示例:XSHUTDOWN 连接到 GPIO4_PB5
&i2c6 {
    status = "okay";
    imx415: camera@30 {
        compatible = "sony,imx415";
        reg = <0x30>;
        reset-gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_LOW>;
        // ...
    };
};

// 驱动中复位操作
static int sensor_reset(struct device *dev) {
    struct gpio_desc *reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
    gpiod_set_value_cansleep(reset_gpio, 0);  // 拉低复位
    msleep(5);                                 // 保持 5ms
    gpiod_set_value_cansleep(reset_gpio, 1);  // 释放复位
    msleep(20);                                // 等待 PLL 稳定
    return 0;
}

3.4 MCLK 主时钟引脚

Sensor 需要外部提供主时钟(MCLK)才能正常工作。RK 平台通常使用 SoC 内部的 CLKOUT 或 24MHz 晶振 作为时钟源。MCLK 的频率精度直接影响 Sensor 内部 PLL 的锁定范围和输出帧率。

时钟源 典型频率 适用场景
SoC CLKOUT 24 MHz 大部分 Sensor 通用,RK 驱动默认配置
外部有源晶振 24 MHz / 27 MHz 对时钟抖动要求高的场景(如高帧率)
Sensor 内部 OSC N/A 部分 Sensor 支持内部振荡器,无需外部时钟
驱动配置:在设备树中通过 clocks 属性引用时钟源,驱动中调用 clk_prepare_enable() 使能时钟。RK 平台通常使用 clk_get_rate() 确认实际时钟频率是否与 Sensor 要求匹配。

3.5 电源供电时序

Camera Sensor 通常需要三组独立电源:模拟电源 (AVDD)、数字核心电源 (DVDD) 和 IO 接口电源 (IOVDD)。上电顺序必须严格遵循 Sensor Datasheet 的要求,否则可能导致 Sensor 损坏或无法初始化。

典型 Sensor 上电时序图 (IMX415 为例) t0 t1 t2 t3 AVDD (2.8V) — 模拟电源 DVDD (1.2V) — 数字核心电源 IOVDD (1.8V) — IO 接口电源 XSHUTDOWN (复位释放) AVDD 先上电 DVDD 随后 IOVDD 最后 复位释放需在所有电源稳定后
电源时序避坑:部分 Sensor(如 OV5640)要求 AVDD 必须先于 DVDD 上电,否则内部 ESD 保护二极管会导通,导致电流倒灌烧毁 Sensor。务必查阅 Datasheet 的 "Power-Up Sequence" 章节。

3.6 接口初始化流程总结

在 RK 平台驱动中,Sensor 硬件接口的初始化顺序必须严格遵循以下步骤:

  1. 电源使能:按 AVDD → DVDD → IOVDD 顺序依次使能 regulator,每步间隔 1ms。
  2. 时钟使能:使能 MCLK 时钟源,等待时钟稳定(约 1ms)。
  3. 复位释放:拉高 XSHUTDOWN,等待 Sensor 内部 PLL 锁定(5~20ms)。
  4. I2C 通信检测:通过 I2C 读取 Sensor 的 Chip ID 寄存器,验证通信链路正常。
  5. MIPI 初始化:配置 Sensor 输出格式、Lane 数、速率,启动 MIPI Tx。
// 驱动中硬件接口初始化流程伪代码
static int sensor_hw_init(struct sensor_dev *sensor) {
    // 1. 电源上电
    regulator_enable(sensor->avdd);   // AVDD 2.8V
    mdelay(1);
    regulator_enable(sensor->dvdd);   // DVDD 1.2V
    mdelay(1);
    regulator_enable(sensor->iovdd);  // IOVDD 1.8V
    mdelay(1);

    // 2. 时钟使能
    clk_prepare_enable(sensor->mclk); // 24MHz
    mdelay(1);

    // 3. 复位释放
    gpiod_set_value_cansleep(sensor->reset, 1);
    msleep(20);

    // 4. 检测 Chip ID
    if (sensor_read_reg(sensor, REG_CHIP_ID) != EXPECTED_ID) {
        dev_err(sensor->dev, "Chip ID mismatch\n");
        return -ENODEV;
    }

    // 5. 配置 MIPI 输出
    sensor_write_reg(sensor, REG_MIPI_CTRL, 0x01);
    return 0;
}
调试建议:如果 Sensor 初始化失败,优先使用示波器测量 XSHUTDOWN 引脚是否有复位脉冲、MCLK 引脚是否有 24MHz 时钟输出、以及各电源轨的电压值是否在规格范围内。硬件信号正常后,再排查 I2C 通信问题。