购买与学习资源
- 京东购买链接:Yocto项目实战教程:高效定制嵌入式Linux系统
- B站配套视频:嵌入式Jerry
一、V4L2是什么?
V4L2 (Video4Linux2),是Linux内核中的一个标准化的视频设备驱动框架,应用于控制各类视频设备,如USB摄像头,MIPI摄像头,TV收音机,HDMI输入/输出等。
它提供了一套经过定义的API,使用户态端应用程序可以通过 /dev/videoX
设备节点,以方式操作文件调用来读取或控制视频设备。
二、硬件组成部分:
V4L2系统一般包含以下核心硬件组件:
组件 | 合理类比 | 设备功能 | 位置 |
---|---|---|---|
Sensor | 相机镜头 | 采集光线,输出RAW数据 | 摄像头芯片 |
CSI | 解码器 | 解析MIPI数据流,转成pixel流 | SoC内部CSI控制器 |
ISP | 图像处理 | 清洗、降噪、调色 | SoC内部ISP单元 |
DRAM | 内存 | 存储结果图像 | DDR/CMEM |
Display | 显示器 | 通过DRM或Framebuffer显示图像 | HDMI/LCD |
三、V4L2 实现的核心软件结构
1. V4L2 内核平台结构
v4l2_device
|
--------------------------------
| | |
subdev(Sensor) subdev(CSI) subdev(ISP)
| |
... video_device (/dev/videoX)
每一个设备都会被抽象为 v4l2_subdev
,且通过 media_entity
表示形成 pipeline。
最终通过 video_device
创建 /dev/videoX
,提供给用户端。
2. V4L2 核心结构体总结
结构体名 | 作用关键词 | 简要说明 | 所在文件 |
---|---|---|---|
struct v4l2_device | 全局管理 | 管理全部V4L2 subdev | v4l2-device.c |
struct v4l2_subdev | 子模块抽象 | Sensor/CSI/ISP 都是subdev | v4l2-subdev.c |
struct video_device | 输出节点 | 创建/dev/videoX节点 | v4l2-dev.c |
struct v4l2_fh | 文件状态 | 管理打开文件时的临时状态 | v4l2-fh.c |
struct vb2_queue | 缓冲区 | 配合videobuf2系统管理图像缓冲 | vb2-core.c |
struct v4l2_file_operations | 输入输出 | 定义open/read/ioctl等操作 | v4l2-dev.c |
struct media_device | 结构基底 | 表示整个pipeline的核 | media-device.c |
四、初始化过程
- 初始化 media_device
- 注册 v4l2_device
- 初始化并注册 v4l2_subdev (sensor/CSI/ISP)
- 初始化 video_device,注册为 /dev/videoX
- 通过 media_entity 建立 pad-link,构成 pipeline
五、经典演化进程
1. Sensor driver
- 通过 I2C 驱动 probe()
- 初始化 v4l2_subdev
- 定义 subdev_ops,包括 set_fmt, get_fmt, s_stream
2. CSI driver
- 读取 device tree
- 初始化相应定时器,clk
- 设置 v4l2_subdev,表示为数据接受者
3. ISP driver
- 读取 device tree
- 注册成为 v4l2_subdev,配合 ISP 硬件合成处理流
4. Video node
- 通过 video_register_device 创建 /dev/video0
- 配合 vb2_queue 进行 buffer 管理
六、具体演练:Sensor 接 MIPI CSI 进 ISP
[Sensor (OV5640)] --MIPI流--> [CSI] --> [ISP] --> [video0]
- Sensor 输出 RAW10 数据
- CSI 解码并转成常规视频格式(UYVY/不同频率)
- ISP 进行处理:AE/AWB/Gamma
- ISP 给 video_device 写入 buffer,最后被用户端程序读取
七、内存和 DMA 连线
- 通常用 videobuf2 + DMABUF 实现 zero-copy
- buffer 分配时通过
vb2_queue
- DMA 在 CSI/ISP 连接 DRAM
八、常见问题解析
问题环节 | 常见问题 | 解决思路 |
---|---|---|
sensor probe | I2C probe 失败 | 硬件链路、注册合适 |
media link | 链接失败 | media_create_pad_link |
/dev/videoX | 未生成 | video_register_device |
图像乱码 | format 配置不对 | try_fmt, set_fmt 配置不对 |
九、结论
V4L2 实际上是一套 “media pipeline” 架构,通过 subdev 抽象 sensor / CSI / ISP等硬件组件,将它们连成一个数据处理流程,最后接入 /dev/videoX 给用户。
十、逻辑流程图
+--------+ +--------+ +------+ +-------------+
| Sensor | --> | CSI | --> | ISP | --> | /dev/video0 |
+--------+ +--------+ +------+ +-------------+
| | | |
| v4l2_subdev | v4l2_subdev | v4l2_subdev | video_device
| | | |
+-------------------------------------------+
|
struct v4l2_device
|
struct media_device
此图是最基本的 V4L2 连接结构,在 NXP i.MX8MP 系列平台上是实际存在的。
购买与学习资源
- 京东购买链接:Yocto项目实战教程:高效定制嵌入式Linux系统
- B站配套视频:嵌入式Jerry