3. Sensor硬件接口:I2C控制接口、MIPI数据通道、XSHUTDOWN复位引脚、MCLK主时钟引脚、电源供电时序
Camera Sensor 与主控 SoC(如 RK3588/RK3568)之间的物理连接是驱动初始化的基础。一个典型的 Sensor 硬件接口包含五大核心部分:I2C 控制接口、MIPI CSI 数据通道、XSHUTDOWN 复位引脚、MCLK 主时钟引脚以及电源供电网络。理解这些接口的电气特性与连接拓扑,是编写正确驱动代码的前提。
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 |
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。
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 损坏或无法初始化。
3.6 接口初始化流程总结
在 RK 平台驱动中,Sensor 硬件接口的初始化顺序必须严格遵循以下步骤:
- 电源使能:按 AVDD → DVDD → IOVDD 顺序依次使能 regulator,每步间隔 1ms。
- 时钟使能:使能 MCLK 时钟源,等待时钟稳定(约 1ms)。
- 复位释放:拉高 XSHUTDOWN,等待 Sensor 内部 PLL 锁定(5~20ms)。
- I2C 通信检测:通过 I2C 读取 Sensor 的 Chip ID 寄存器,验证通信链路正常。
- 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;
}