瑞芯微RK摄像头Sensor驱动开发与MIPI接入 - 第3节

3.1 Camera Sensor 核心工作原理

Camera Sensor 是图像采集链路的起点,其核心任务是将光信号转换为数字电信号。理解 Sensor 内部工作流程是驱动开发的基础。

核心流程: 光子入射 → 光电转换 → 模拟信号处理 → ADC 量化 → 数字信号输出(RAW 数据)。

3.1.1 感光原理与像素结构

每个像素(Pixel)包含一个微透镜(Microlens)、滤色片(Color Filter)和光电二极管(Photodiode)。微透镜汇聚光线,滤色片只允许特定波长通过,光电二极管将光子转换为电子。

  • 量子效率(QE): 入射光子转换为电子的比例,通常 50%~70%。
  • 满阱容量(FWC): 单个像素能存储的最大电子数,决定动态范围。
  • 转换增益(CG): 电子转换为电压的比率,影响灵敏度。
单个 CMOS 像素结构剖面图 微透镜 (Microlens) 滤色片 (R/G/B) 光电二极管 硅基底 (Substrate) 入射光

3.1.2 曝光与读出时序

Sensor 通过 滚动快门(Rolling Shutter) 或 全局快门(Global Shutter) 控制曝光。滚动快门逐行曝光,适合高分辨率;全局快门同时曝光所有像素,适合高速运动场景。

特性 滚动快门 (Rolling Shutter) 全局快门 (Global Shutter)
曝光方式 逐行扫描曝光 所有像素同时曝光
帧率 较高(受限于行读出速度) 较低(需要额外存储单元)
果冻效应 明显(高速运动时) 无
典型应用 手机、安防、普通相机 工业检测、高速摄影
驱动开发提示: 在 RK 平台上配置 Sensor 时,需要根据 Sensor 数据手册设置曝光行数(Lines Per Frame)和行消隐(H-Blanking),这些参数直接影响帧率和图像稳定性。

3.2 Bayer 格式与 RAW 数据

大多数单 Sensor 相机使用 Bayer 滤色阵列 来获取彩色信息。每个像素只记录一种颜色分量,原始输出即为 RAW 数据。

3.2.1 Bayer 模式详解

最常见的 Bayer 模式是 RGGB(2×2 单元:1个R、2个G、1个B)。人眼对绿色最敏感,因此绿色像素数量是红蓝的两倍。

  • RGGB: 标准模式,适用于大多数场景。
  • BGGR: 与 RGGB 顺序相反,部分 Sensor 采用。
  • GRBG / GBRG: 绿色在左上角,用于特定 Sensor 设计。
Bayer 阵列 (RGGB) 与 RAW 数据 R G G B R 像素 G 像素 G 像素 B 像素 → RAW 数据

3.2.2 RAW 数据格式与位深

RAW 数据是未经 ISP 处理的原始像素值,通常以 10-bit、12-bit 或 14-bit 格式输出。位深越高,动态范围越大,但数据量也越大。

位深 每像素数据量 动态范围 典型应用
8-bit 1 字节 48 dB 低端摄像头、预览
10-bit 1.25 字节 60 dB 手机主摄、安防
12-bit 1.5 字节 72 dB 专业相机、工业
14-bit 1.75 字节 84 dB 天文、医疗
注意事项: 在 RK 平台 MIPI CSI 接口中,RAW 数据通常以 DPHY 或 CPHY 协议传输。驱动开发时需要正确配置 MIPI 数据通道数 和 每通道速率,否则会导致数据错位或丢帧。

3.3 Sensor 寄存器控制(I2C / SPI)

Sensor 的行为完全由内部寄存器控制。驱动通过 I2C 或 SPI 总线读写寄存器,实现初始化、曝光调整、增益设置、帧率配置等操作。

3.3.1 I2C 控制方式

I2C 是 Sensor 最常用的控制接口,使用两根线(SCL + SDA)进行通信。每个 Sensor 有唯一的 7-bit 或 10-bit 从设备地址。

  • 写操作: 发送设备地址 + 寄存器地址 + 数据。
  • 读操作: 发送设备地址 + 寄存器地址,然后重新发送设备地址(读方向)读取数据。
  • 批量读写: 支持连续地址的突发传输,提高效率。
// I2C 写寄存器示例(RK 平台使用 i2c_transfer)
static int sensor_write_reg(struct i2c_client *client, u16 reg, u8 val)
{
    struct i2c_msg msg;
    u8 buf[3];

    buf[0] = (reg >> 8) & 0xFF;  // 寄存器高字节
    buf[1] = reg & 0xFF;         // 寄存器低字节
    buf[2] = val;                // 写入值

    msg.addr = client->addr;
    msg.flags = 0;               // 写标志
    msg.len = 3;
    msg.buf = buf;

    return i2c_transfer(client->adapter, &msg, 1);
}

3.3.2 SPI 控制方式

SPI 使用四线(SCLK、MOSI、MISO、CS)全双工通信,速度远高于 I2C,适合需要快速配置的 Sensor。

特性 I2C SPI
线数 2 线 (SCL + SDA) 4 线 (SCLK + MOSI + MISO + CS)
速度 标准 100kHz / 400kHz / 1MHz 可达 10MHz ~ 50MHz
寻址方式 设备地址 + 寄存器地址 片选 + 寄存器地址
多设备支持 总线多设备,地址冲突风险 独立片选,无冲突
典型 Sensor OV5640、IMX219、GC2053 部分工业/高速 Sensor
// SPI 写寄存器示例(RK 平台使用 spi_write)
static int sensor_spi_write(struct spi_device *spi, u16 reg, u8 val)
{
    u8 tx_buf[3];

    tx_buf[0] = (reg >> 8) & 0xFF;  // 寄存器高字节
    tx_buf[1] = reg & 0xFF;         // 寄存器低字节
    tx_buf[2] = val;                // 写入值

    return spi_write(spi, tx_buf, 3);
}

3.3.3 典型寄存器配置流程

Sensor 上电后,驱动需要按顺序配置一组寄存器才能正常工作。以下是一个典型初始化序列:

  1. 软件复位: 写入复位寄存器,使 Sensor 回到默认状态。
  2. 时钟配置: 设置 PLL 分频,生成内部主时钟。
  3. 分辨率设置: 配置有效像素宽度、高度、起始位置。
  4. 输出格式: 选择 RAW10、RAW12、YUV 等输出格式。
  5. 帧率控制: 设置 VTS(垂直总行数)和 HTS(水平总像素数)。
  6. 增益与曝光: 设置模拟增益、数字增益和曝光时间。
  7. 启动输出: 写入启动寄存器,开始输出 MIPI 数据。
Sensor 寄存器配置流程 1. 软件复位 2. 时钟 PLL 配置 3. 分辨率设置 4. 输出格式选择 5. 帧率 (VTS/HTS) 6. 启动 MIPI 输出
实战建议: 在 RK 平台驱动中,建议将寄存器配置表定义为 struct regval_list 数组,通过循环批量写入。这样便于维护不同分辨率/帧率的配置表,也方便后续调试。

3.4 本章小结

本章涵盖了 Camera Sensor 的三大基础:

  • 工作原理: 从光子到电子的转换过程,以及滚动/全局快门的区别。
  • Bayer 与 RAW: 彩色滤波阵列结构、RAW 数据位深与动态范围的关系。
  • 寄存器控制: I2C/SPI 通信方式、典型配置流程与代码示例。