2. Sensor驱动框架总览:Linux内核驱动模型、字符设备驱动、平台驱动、I2C驱动、V4L2框架简介

在瑞芯微RK平台上开发Sensor驱动,首先需要理解Linux内核中与Sensor相关的多层次驱动框架。本章将从宏观视角梳理这些框架的层级关系与核心职责,为后续深入I2C通信与V4L2子设备开发奠定基础。

2.1 Linux内核驱动模型概览

Linux内核驱动模型基于设备(device)、驱动(driver)、总线(bus)三大核心对象,通过sysfs在用户空间暴露设备拓扑。RK平台的Sensor驱动同样遵循这一模型:Sensor挂载在I2C总线上,驱动通过platform或I2C匹配机制与设备绑定。

核心概念:设备与驱动分离,通过总线匹配实现热插拔与电源管理。RK平台利用这一模型实现Sensor设备的动态探测与电源域控制。
提示:在RK平台上,Camera Sensor通常被抽象为I2C客户端设备,挂载在I2C总线上;而ISP(图像信号处理器)则作为平台设备挂载在平台总线上。两者通过V4L2框架协同工作。
Linux内核驱动模型三层架构 总线层(Bus) I2C Bus / Platform Bus / SPI Bus 设备层(Device) Sensor设备节点 / 平台设备节点 驱动层(Driver) Sensor驱动 / ISP驱动 / 平台驱动 设备与驱动通过总线匹配(match)绑定,RK平台通过设备树描述硬件拓扑 驱动探测(probe)时完成资源申请、初始化与注册

2.2 字符设备驱动

字符设备驱动是Linux驱动中最基础的类型,Sensor驱动在用户空间的访问接口通常通过字符设备暴露。V4L2框架的核心设备节点/dev/videoX、/dev/v4l-subdevX均属于字符设备。

特性 说明 RK Sensor场景
设备号 主设备号 + 次设备号 V4L2主设备号81,次设备号动态分配
file_operations open/read/write/ioctl/mmap等 Sensor驱动主要实现ioctl(VIDIOC_*)
设备节点 /dev/xxx /dev/video0, /dev/v4l-subdev0
注册函数 register_chrdev / cdev_add V4L2框架内部封装,驱动无需直接调用
注意:在RK平台上,Sensor驱动通常不直接注册字符设备,而是通过V4L2子设备(subdev)框架间接暴露。字符设备的管理由V4L2核心层或Video Device节点负责。

2.3 平台驱动(Platform Driver)

平台驱动用于管理那些不依赖传统总线(如PCI、USB)的片上设备。在RK平台上,ISP、MIPI DPHY、CSI Host等关键IP通常注册为平台设备,通过设备树匹配驱动。

  • 匹配方式:设备树中的compatible属性与驱动中的of_match_table匹配。
  • 资源获取:通过platform_get_resource获取寄存器基址、中断号、时钟等。
  • 电源管理:通过dev_pm_ops实现运行时电源管理,RK平台常用pm_runtime框架。
  • 典型场景:RK3588的ISP驱动、RK356x的CSI Host驱动均采用平台驱动模型。
关键点:Sensor驱动本身通常是I2C驱动,但与之配合的ISP、MIPI控制器是平台驱动。两者通过V4L2框架的Media Controller拓扑连接。
RK平台Sensor驱动协作关系 平台驱动 ISP / CSI Host / DPHY 设备树匹配,资源获取 I2C驱动 Camera Sensor驱动 I2C总线匹配,寄存器配置 V4L2框架 + Media Controller subdev注册 / pad链接 / 流管理 平台驱动与I2C驱动通过V4L2框架的subdev链接实现数据通路

2.4 I2C驱动

RK平台上的Camera Sensor绝大多数通过I2C接口与主控通信。I2C驱动负责Sensor的寄存器读写、初始化序列下发、控制参数设置等。

2.4.1 I2C驱动核心结构

结构体/函数 作用 RK Sensor示例
i2c_driver I2C驱动核心结构,包含probe/remove/id_table 定义Sensor驱动入口
i2c_client I2C设备对象,包含addr/irq/adapter probe时从设备树获取
i2c_transfer 底层I2C传输函数 封装为sensor_read/sensor_write
of_match_table 设备树匹配表 compatible = "ov5648","imx415"...

2.4.2 I2C驱动probe流程

  1. 设备树解析:读取reg(I2C地址)、clocks、reset-gpios等属性。
  2. 资源申请:分配sensor私有数据结构,初始化互斥锁、电源管理。
  3. 硬件初始化:通过I2C读写Sensor ID寄存器,验证设备存在。
  4. V4L2 subdev注册:调用v4l2_i2c_subdev_init或v4l2_async_register_subdev。
  5. 电源与时钟:使能Sensor供电、MCLK时钟、复位释放。
实践建议:在RK平台上,I2C驱动中应使用struct i2c_msg构造传输消息,避免直接调用i2c_smbus_*函数,以支持批量寄存器配置,提高初始化效率。
I2C Sensor驱动Probe流程 设备树解析 资源申请与初始化 硬件ID验证 V4L2 subdev注册 电源时钟使能

2.5 V4L2框架简介

V4L2(Video for Linux 2)是Linux内核中视频设备驱动的标准框架。在RK平台上,Camera Sensor驱动作为V4L2子设备(subdev)注册,与ISP、CSI等实体通过Media Controller拓扑连接。

2.5.1 V4L2核心组件

组件 说明 RK Sensor角色
v4l2_device 顶层V4L2设备实例 由ISP驱动或桥接驱动创建
v4l2_subdev 子设备抽象,Sensor/ISP/PHY均为此 Sensor驱动核心注册对象
media_entity 媒体实体,包含pad和link Sensor输出pad,连接ISP输入pad
v4l2_ctrl_handler 控制句柄,管理曝光/增益/白平衡等 Sensor控制参数接口
v4l2_async_subdev 异步subdev注册机制 支持Sensor热插拔与延迟探测

2.5.2 Sensor在V4L2框架中的位置

在RK平台上,典型的Camera数据通路为:

  • Sensor → MIPI DPHY → CSI Host → ISP → 内存(DMA)
  • 每个节点都是一个V4L2 subdev,通过media_link建立pad到pad的连接。
  • 用户空间通过media-ctl工具配置拓扑,通过v4l2-ctl设置格式与流控制。
关键职责:Sensor驱动在V4L2框架中需要实现s_stream(流开关)、enum_mbus_code(格式枚举)、s_fmt(格式设置)、g_frame_interval(帧率获取)等subdev回调。
RK平台V4L2 Sensor拓扑结构 Sensor subdev 输出pad: 0 格式: RAW10/RAW12 MIPI DPHY subdev 输入pad: 0 输出pad: 1 CSI Host subdev 输入pad: 0 输出pad: 1 ISP subdev 输入pad: 0 输出pad: 1 每个subdev通过media_link建立pad到pad的连接 用户空间使用media-ctl配置拓扑,v4l2-ctl控制流 → → →

2.6 各框架在RK Sensor驱动中的职责总结

框架/模型 在RK Sensor驱动中的职责 典型接口/结构
Linux驱动模型 设备与驱动分离,设备树匹配,电源管理 device_driver, of_match_table
字符设备驱动 用户空间访问接口,/dev/videoX节点 file_operations, cdev
平台驱动 ISP/CSI/DPHY等片上IP驱动 platform_driver, dev_pm_ops
I2C驱动 Sensor寄存器读写,初始化配置 i2c_driver, i2c_client
V4L2框架 Sensor subdev注册,格式/流控制,拓扑管理 v4l2_subdev, media_entity