RK平台Sensor驱动框架与MIPI CSI接口实战工程 - 第3节
3. Camera Sensor基础
Camera Sensor 是图像采集链路的起点,其核心任务是将光信号转换为数字电信号。理解 Sensor 内部工作流程是驱动开发的基础。
核心流程: 光子入射 → 光电转换 → 模拟信号处理 → ADC 量化 → 数字信号输出(RAW 数据)。
3.1.1 感光原理与像素结构
每个像素(Pixel)包含一个微透镜(Microlens)、滤色片(Color Filter)和光电二极管(Photodiode)。微透镜汇聚光线,滤色片只允许特定波长通过,光电二极管将光子转换为电子。
- 量子效率(QE): 入射光子转换为电子的比例,通常 50%~70%。
- 满阱容量(FWC): 单个像素能存储的最大电子数,决定动态范围。
- 转换增益(CG): 电子转换为电压的比率,影响灵敏度。
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 设计。
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 上电后,驱动需要按顺序配置一组寄存器才能正常工作。以下是一个典型初始化序列:
- 软件复位: 写入复位寄存器,使 Sensor 回到默认状态。
- 时钟配置: 设置 PLL 分频,生成内部主时钟。
- 分辨率设置: 配置有效像素宽度、高度、起始位置。
- 输出格式: 选择 RAW10、RAW12、YUV 等输出格式。
- 帧率控制: 设置 VTS(垂直总行数)和 HTS(水平总像素数)。
- 增益与曝光: 设置模拟增益、数字增益和曝光时间。
- 启动输出: 写入启动寄存器,开始输出 MIPI 数据。
实战建议: 在 RK 平台驱动中,建议将寄存器配置表定义为
struct regval_list 数组,通过循环批量写入。这样便于维护不同分辨率/帧率的配置表,也方便后续调试。
3.4 本章小结
本章涵盖了 Camera Sensor 的三大基础:
- 工作原理: 从光子到电子的转换过程,以及滚动/全局快门的区别。
- Bayer 与 RAW: 彩色滤波阵列结构、RAW 数据位深与动态范围的关系。
- 寄存器控制: I2C/SPI 通信方式、典型配置流程与代码示例。