2.1. 引言

由于硬件的复杂性,V4L2 驱动程序往往非常复杂:大多数设备具有多个 IC,在 /dev 中导出多个设备节点,并且还创建非 V4L2 设备,例如 DVB、ALSA、FB、I2C 和输入 (IR) 设备。

特别是 V4L2 驱动程序必须设置支持 IC 来进行音频/视频多路复用/编码/解码,这一事实使其比大多数驱动程序都复杂。通常,这些 IC 通过一个或多个 I2C 总线连接到主桥接驱动程序,但也可以使用其他总线。此类设备称为“子设备”。

长期以来,该框架仅限于使用 video_device 结构来创建 V4L 设备节点,以及使用 video_buf 来处理视频缓冲区(请注意,本文档不讨论 video_buf 框架)。

这意味着所有驱动程序都必须自己完成设备实例的设置并连接到子设备。其中一些操作非常复杂,难以正确完成,而且许多驱动程序从未正确完成过。

由于缺乏框架,还有很多无法重构的公共代码。

因此,此框架设置了所有驱动程序都需要的基本构建块,并且该框架应使将公共代码重构为所有驱动程序共享的实用程序函数变得更加容易。

一个很好的参考例子是 samples/v4l/ 中的 v4l2-pci-skeleton.c 源代码。它是 PCI 采集卡的骨架驱动程序,演示了如何使用 V4L2 驱动程序框架。它可以作为真实 PCI 视频采集驱动程序的模板。

2.2. V4L 驱动程序的结构

所有驱动程序都具有以下结构

  1. 每个设备实例的结构,包含设备状态。

  2. 初始化和命令子设备(如果有)的方法。

  3. 创建 V4L2 设备节点(/dev/videoX、/dev/vbiX 和 /dev/radioX)并跟踪特定于设备节点的数据。

  4. 包含每个文件句柄数据的特定于文件句柄的结构;

  5. 视频缓冲区处理。

这是所有这些关系的大致示意图

device instances
  |
  +-sub-device instances
  |
  \-V4L2 device nodes
      |
      \-filehandle instances

2.3. V4L2 框架的结构

该框架与驱动程序结构非常相似:它具有用于设备实例数据的 v4l2_device 结构、用于引用子设备实例的 v4l2_subdev 结构、用于存储 V4L2 设备节点数据的 video_device 结构,以及用于跟踪文件句柄实例的 v4l2_fh 结构。

V4L2 框架还可以选择与媒体框架集成。如果驱动程序设置了struct v4l2_device mdev 字段,则子设备和视频节点将自动在媒体框架中显示为实体。