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驱动程序的结构¶
所有驱动程序都具有以下结构
每个设备实例的结构,包含设备状态。
初始化和命令子设备(如果有)的方法。
创建V4L2设备节点(/dev/videoX、/dev/vbiX和/dev/radioX)并跟踪设备节点特定数据。
包含每个文件句柄数据的特定于文件句柄的结构;
视频缓冲区处理。
这是一个大致的示意图,说明了它们之间的关系
device instances
|
+-sub-device instances
|
\-V4L2 device nodes
|
\-filehandle instances
2.3. V4L2框架的结构¶
该框架与驱动程序结构非常相似:它具有用于设备实例数据的v4l2_device结构,用于引用子设备实例的v4l2_subdev结构,video_device结构存储V4L2设备节点数据,而v4l2_fh结构跟踪文件句柄实例。
V4L2框架还可以选择与媒体框架集成。 如果驱动程序设置了 struct v4l2_device
mdev字段,子设备和视频节点将自动出现在媒体框架中作为实体。