一、什么是V4L2?

VideoforLinuxtwo(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API插口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频等的采集。在远程大会、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。

linux v4l2驱动框架_linux驱动开发框架_框架驱动下

在Linux下,所有外设都被看成一种特殊的文件,成为“设备文件”,可以象访问普通文件一样对其进行读写。通常来说,采用V4L2驱动的摄像头设备文件是/dev/video0。V4L2支持两种方法来采集图象:显存映射方法(mmap)和直接读取方法(read)。V4L2在include/linux/videodev2.h文件中定义了一些重要的数据结构,在采集图象的过程中,就是通过对这种数据的操作来获得最终的图象数据。Linux系统V4L2的能力可在Linux内核编译阶段配置,默认情况下都有此开发插口。

二、V4L2框架简介

几乎所有的设备都有多个IC模块,它们可能是实体的(比如USB摄像头上面包含ISP、sensor等)、也可能是具象的(如USB设备上面的具象拓扑结构),它们在/dev目录下边生成了多个设备节点linux命令vi,但是这种IC模块还创建了一些非v4l2设备:DVB、ALSA、FB、I2C和输入设备。正是因为硬件的复杂性linux v4l2驱动框架,v4l2的驱动也显得十分复杂。

框架驱动下_linux v4l2驱动框架_linux驱动开发框架

非常是v4l2驱动要支持IC模块来进行音/视频的混和/编解码操作linux系统编程,这就愈加促使v4l2驱动显得异常复杂。一般情况下,有些IC模块通过一个或则多个I2C总线联接到主桥驱动里面,同时其它的总线依然可用,这种IC就称为‘sub-devices’,例如摄像头设备上面的sensor传感就是使用I2C来进行命令沟通,同时使用MIPI或则LVDS等插口进行图象数据传输。

在很长一段时间内,该框架(指老旧的V4L2框架)仅限于通过video_device结构体创建v4l设备节点和video_buf来处理视频数据。这意味着所有的驱动都必须对设备实例进行设置并将其映射到子设备上。有些时侯这种操作步骤非常复杂,很难正确完成,但是有些驱动程序从来没有正确的根据这种操作步骤编撰。因为缺乏一个框架,有好多通用代码就没有办法被重塑,进而造成这部份代码被重复编撰,效率比较低下。

为此,本框架具象建立了所有驱动都须要的代码并封装为一个个的模块,简化了设备驱动通用代码的构建。v4l2-pci-skeleton.c是个十分好的参考解释器,它是一个PCI采集卡的驱动框架。该解释器演示了怎样使用v4l2驱动框架,但是该解释器可以作为一个PCI视频采集卡的驱动模板使用。在最开始的时侯也可以参照这个代码编撰方法进行联系,其实最适宜的代码还是drivers/media/video/omap3isp文件夹上面的代码,这个代码基本上可以作为一个完整的输入设备实例代码(由于它包含了ISP、CSI、video等设备,而且有着一个完整的数据流pipeline,几乎用到了V4L2框架的方方面面linux v4l2驱动框架,参考价值极大)来进行参考编撰自己的设备驱动代码。

框架驱动下_linux驱动开发框架_linux v4l2驱动框架

三、V4L2框架新蓝图:1、蓝图阐释:

这是一张特别大的图,而且我只选定了其中的一个,这张图对V4L2上面的子模块进行简化(简化到只有子模块的名子,没有内部实现的介绍),大图如下:

图片

V4L2设备拓扑

linux驱动开发框架_linux v4l2驱动框架_框架驱动下

这张图如何看呢?它有以下几个关键诱因:

2、层级阐释:

图片

相关参考:

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复