1. Camera Sensor 驱动概述
Camera Sensor(图像传感器)是嵌入式视觉系统的核心器件,它将光信号转换为数字电信号,再通过 MIPI CSI‑2 或并行接口将图像数据传递给 SoC。驱动工程师的任务是让 SoC 能够正确初始化传感器、配置分辨率/帧率/增益,并持续接收图像数据流。
1.1 什么是 Camera Sensor
Camera Sensor 本质上是一个 CMOS 或 CCD 感光芯片,内部包含像素阵列、模拟前端(AFE)、模数转换器(ADC)以及控制寄存器。常见的型号有 OV5640、IMX219、AR0230 等。传感器通过 I2C 总线接收配置命令,通过 MIPI 或 DVP 总线输出图像数据。
| 参数 | 典型值 | 说明 |
|---|---|---|
| 分辨率 | 640×480 ~ 48M | 像素阵列大小 |
| 像素尺寸 | 1.12µm ~ 6µm | 单个像素物理尺寸 |
| 输出接口 | MIPI CSI‑2 / DVP | 数据传输通道 |
| 控制接口 | I2C / SPI | 寄存器读写通道 |
| 工作电压 | 1.2V / 1.8V / 2.8V | 多路供电 |
提示: 绝大多数嵌入式 Camera Sensor 使用 I2C 作为控制总线,速率通常为 100kHz ~ 400kHz。驱动开发的核心工作就是通过 I2C 读写传感器内部的寄存器序列。
1.2 驱动在系统中的位置
Camera Sensor 驱动位于 Linux 内核的 V4L2(Video for Linux Two)框架之下,属于多媒体子系统。整个软件栈从上到下分为四层:
- 用户空间:应用程序通过 V4L2 设备节点(/dev/videoX)打开、设置格式、请求缓冲区、启动流。
- V4L2 核心层:提供统一的视频设备模型、ioctl 处理、缓冲区管理。
- Sensor 子驱动:实现具体的传感器初始化、分辨率切换、曝光/增益控制、电源管理。
- 硬件层:I2C 控制器、MIPI D‑PHY、时钟/电源管理单元。
关键点: Sensor 子驱动是唯一需要工程师手写的部分。V4L2 核心和硬件层由内核提供,驱动只需实现
v4l2_subdev_ops 中的回调函数。
1.3 I2C 与设备树的作用
在 Camera Sensor 驱动中,I2C 和设备树承担了截然不同但又紧密配合的角色:
| 角色 | I2C | 设备树 (Device Tree) |
|---|---|---|
| 功能 | 寄存器读写通道 | 硬件拓扑描述 |
| 数据方向 | 双向(SoC ↔ Sensor) | 单向(固件 → 内核) |
| 驱动使用方式 | 调用 i2c_transfer / regmap | 解析 compatible、reg、clocks、reset-gpios |
| 典型内容 | 0x30 0x03 0x01 0x02(写寄存器) | compatible = "ovti,ov5640"; reg = <0x3c>; |
| 变更时机 | 运行时动态配置 | 编译时静态绑定 |
I2C 的作用
- 作为控制通道,SoC 通过 I2C 向传感器写入初始化序列、切换分辨率、调节曝光/增益。
- 驱动中通常使用
struct i2c_client表示传感器设备,通过i2c_smbus_write_byte_data等 API 操作寄存器。 - I2C 地址由设备树中的
reg属性指定,驱动在 probe 阶段获取。
设备树的作用
- 描述传感器挂接在哪个 I2C 总线、使用哪个时钟源、需要哪些电源轨、复位/电源使能 GPIO。
- 提供
port节点描述 MIPI 数据通道映射(lane 分配、虚拟通道)。 - 驱动通过
of_property_read_u32等 API 从设备树节点中读取平台参数,实现硬件无关化。
常见误区: 初学者容易把 I2C 地址写错(7 位 vs 8 位)。设备树中
reg = <0x3c> 是 7 位地址,而驱动中 i2c_client->addr 也是 7 位。如果传感器数据手册给出的是 8 位地址(如 0x78),需要右移 1 位再填入设备树。
1.4 本章小结
- Camera Sensor 是光‑电转换器件,通过 I2C 控制、MIPI 传图。
- 驱动位于 V4L2 框架的 subdev 层,需要实现
v4l2_subdev_ops。 - I2C 提供运行时寄存器读写能力,设备树提供静态硬件拓扑描述。
- 两者结合使驱动可以跨平台复用,只需更换设备树即可适配不同硬件。