1.V4L2简介
1.1 什么是V4L2
V4L,其全称是Video4Linux(即Video for Linux),是Linux内核中关于视频设备的驱动框架,涉及开关视频设备,以及从该类设备采集并处理相关的音、视频信息。V4L从Linux2.1版本的内核中开始出现。现在Linux内核中用的是V4L2,即Video4Linux2(即Video for Linux Two),其是修改V4L相关Bug后的一个升级版,始于Linux 2.5内核。
由于硬件的复杂性,V4L2 驱动程序往往非常复杂:大多数设备都有多个 IC,在 /dev 中导出多个设备节点,并创建非 V4L2 设备,例如 DVB、ALSA、FB、I2C 和输入(IR ) 设备。尤其是 V4L2 驱动程序必须设置支持 IC 来进行音频/视频复用/编码/解码,这一事实使其比大多数驱动程序更加复杂。通常这些IC通过一条或多条I2C总线连接到主桥驱动器,但也可以使用其他总线。此类设备称为“子设备”。长期以来,该框架仅限于用于创建 V4L 设备节点的 video_device 结构和用于处理视频缓冲区的 video_buf。这意味着所有驱动程序都必须自行设置设备实例并连接到子设备。其中一些操作要正确执行起来相当复杂,许多驱动程序从未正确执行过。还有很多通用代码由于缺乏框架而永远无法重构。
因此,这个V4L2框架设置了所有驱动程序所需的基本构建块,并且这个相同的框架应该使将公共代码重构为所有驱动程序共享的实用程序函数变得更加容易。
1.2 Video设备的V4L2框架
图1-1是基于Video设备的V4L2框架
图1-1 V4L2框架
Linux系统中视频设备主要包括以下四个部分:
1.字符设备驱动程序核心:V4L2本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间;用户空间可以通过Ioctl系统调用控制设备;在应用层,我们可以在 /dev 目录发现 videoxx 类似的设备节点。
2.V4L2驱动核心:主要是构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数;
3.平台V4L2设备驱动:在V4L2框架下,根据平台自身的特性实现与平台相关V4L2驱动部分,包括注册video_device和v4l2_dev。
4.具体的sensor驱动:主要上电、提供工作时钟、视频图像裁剪、流IO开启等,实现各种设备控制方法供上层调用并注册v4l2_subdev。
1.3 V4L2支持的设备类型
V4L2支持的设备十分广泛,但是其中只有很少一部分在本质上是真正的视频设备:
video capture interface:视频采集接口,从camera上获取视频数据,视频捕获是V4L2的基本应用;
video output interface:视频输出接口,允许应用程序驱动外设提供视频图像
video overlay interface:视频覆盖接口,是捕获接口的一个变体,其工作是便于捕获设备直接