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