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)框架之下,属于多媒体子系统。整个软件栈从上到下分为四层:

  1. 用户空间:应用程序通过 V4L2 设备节点(/dev/videoX)打开、设置格式、请求缓冲区、启动流。
  2. V4L2 核心层:提供统一的视频设备模型、ioctl 处理、缓冲区管理。
  3. Sensor 子驱动:实现具体的传感器初始化、分辨率切换、曝光/增益控制、电源管理。
  4. 硬件层:I2C 控制器、MIPI D‑PHY、时钟/电源管理单元。
Camera Sensor 驱动在 Linux 系统中的位置 用户空间:应用程序 (GStreamer / OpenCV / Camera App) 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 与设备树在 Sensor 驱动中的协作 设备树 (Device Tree) compatible = "ovti,ov5640" reg = <0x3c> clocks / reset-gpios / port 解析 Sensor 驱动 probe() → 获取资源 s_power() → 电源控制 s_stream() → 启动流 读写 I2C 总线 SDA / SCL 地址 0x3c 寄存器读写 设备树提供静态硬件拓扑信息,驱动据此初始化 I2C 客户端并执行寄存器配置 两者结合实现“硬件描述与驱动逻辑分离” I2C 写寄存器时序(示例) S 0x78 (7‑bit addr + W) ACK 0x30 (reg high) ACK 0x03 (reg low) ACK P
常见误区: 初学者容易把 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 提供运行时寄存器读写能力,设备树提供静态硬件拓扑描述。
  • 两者结合使驱动可以跨平台复用,只需更换设备树即可适配不同硬件。