内核驱动工程案例 摄像头v4l2驱动开发实战 - 第1节

1. V4L2概述

V4L2(Video for Linux 2)是 Linux 内核中用于视频设备驱动的标准框架,其发展历程与 Linux 多媒体生态的演进紧密相关。

关键时间线:
  • 1998 年 — V4L(Video for Linux)第一版随 Linux 2.1.x 内核引入,支持模拟电视采集卡和基本的视频捕获功能。
  • 2002 年 — V4L2 规范草案发布,由 Bill Dirks 主导设计,旨在解决 V4L 的架构缺陷。
  • 2003 年 — V4L2 正式合入 Linux 2.5.x 内核主线,成为推荐使用的视频驱动接口。
  • 2008 年 — V4L2 成为 Linux 内核中唯一的视频设备框架,V4L 被标记为废弃。
  • 2010 年至今 — V4L2 持续演进,支持 MIPI CSI、USB Video Class(UVC)、V4L2 Mem2Mem、Media Controller 等子框架。
V4L2 发展时间线 1998 V4L 诞生 Linux 2.1.x 2002 V4L2 草案 Bill Dirks 设计 2003 V4L2 合入主线 Linux 2.5.x 2008 V4L 废弃 V4L2 唯一框架 至今 持续演进 MIPI/UVC/MC

1.2 V4L2 在 Linux 多媒体栈中的位置

Linux 多媒体软件栈从上到下分为用户空间应用、库层、内核驱动层和硬件层。V4L2 位于内核驱动层,向上提供统一的字符设备接口,向下抽象各类摄像头硬件。

Linux 多媒体软件栈 — V4L2 位置 用户空间应用(GStreamer、FFmpeg、VLC、Camera App) 多媒体库(libv4l、libcamera、OpenCV) ioctl / mmap / read / poll V4L2 内核框架 Video4Linux2 核心 + V4L2 设备节点(/dev/videoX) 摄像头驱动(Sensor / ISP / USB / MIPI 驱动) 硬件设备(CMOS Sensor、USB Camera、CSI 接口)
关键理解:V4L2 是用户空间与摄像头硬件之间的标准桥梁。应用通过 open("/dev/video0") 获取设备句柄,使用 ioctl() 进行控制,通过 mmap() 或 read() 获取图像数据。驱动开发者只需实现 V4L2 定义的回调函数,即可让摄像头被任意 V4L2 兼容的应用使用。

1.3 V4L2 与 V4L 的区别

V4L2 是对 V4L 的彻底重写,两者在架构设计、接口规范、扩展性方面存在本质差异。下表总结了核心区别:

对比维度 V4L(Video for Linux) V4L2(Video for Linux 2)
设计年代 1998 年,Linux 2.1.x 2002 年,Linux 2.5.x
设备模型 单一设备文件,功能混杂 多设备节点(video、vbi、radio、metadata)
IO 方式 仅支持 read()/write() 支持 read/write、mmap、userptr、dmabuf
控制接口 ioctl 数量少,扩展困难 基于 VIDIOC_* 宏,标准化扩展机制
数据格式 固定格式,难以扩展 支持 v4l2_format、v4l2_pix_format,可枚举多种格式
缓冲管理 单缓冲,效率低 多缓冲队列(VIDIOC_REQBUFS、QBUF、DQBUFF)
流控制 无标准流控 VIDIOC_STREAMON/STREAMOFF 标准化
子设备支持 不支持 支持 V4L2 子设备(sensor、ISP、scaler)
当前状态 已废弃,Linux 2.6.38 后移除 活跃维护,Linux 主线标准框架
迁移注意:所有新开发的摄像头驱动必须基于 V4L2 框架。V4L 驱动在 Linux 2.6.38 之后已被完全移除。如果维护旧代码,请尽快迁移到 V4L2 接口。

1.4 V4L2 支持的设备类型

V4L2 框架不仅支持传统的摄像头,还覆盖了多种视频和多媒体设备。每种设备类型对应不同的 v4l2_capability 中的 capabilities 标志位。

V4L2 支持的设备类型 V4L2 核心框架 视频捕获设备 /dev/videoX 视频输出设备 /dev/videoX VBI 设备 /dev/vbiX 收音机设备 /dev/radioX 软件编码/解码 /dev/videoX 触摸设备 /dev/v4l-touchX

下表详细列出 V4L2 支持的设备类型及其典型用途:

设备类型 设备节点 capabilities 标志 典型硬件
视频捕获 /dev/videoX V4L2_CAP_VIDEO_CAPTURE USB 摄像头、MIPI CSI 摄像头、采集卡
视频输出 /dev/videoX V4L2_CAP_VIDEO_OUTPUT 显示输出、视频叠加卡
VBI /dev/vbiX V4L2_CAP_VBI_CAPTURE 电视调谐器、图文电视
收音机 /dev/radioX V4L2_CAP_RADIO FM/AM 收音机硬件
软件编码/解码 /dev/videoX V4L2_CAP_VIDEO_M2M 硬件编解码器、JPEG 加速器
触摸设备 /dev/v4l-touchX V4L2_CAP_TOUCH 触摸屏控制器
元数据 /dev/videoX V4L2_CAP_META_CAPTURE 传感器统计信息、HDR 元数据
课程聚焦:本课程将重点讲解 视频捕获设备 的驱动开发,这是嵌入式摄像头开发中最常见、最核心的场景。我们会从 V4L2 核心框架入手,逐步深入到 sensor 驱动、ISP 驱动、Media Controller 拓扑等高级主题。