说明:
-
Kernel版本:4.14
-
ARM64处理器,Contex-A53,双核
-
使用工具:Source Insight 3.5, Visio
1. 概述
-
V4L2(Video for Linux 2):Linux内核中关于视频设备驱动的框架,对上向应用层提供统一的接口,对下支持各类复杂硬件的灵活扩展;
-
V4L2框架,主要包括v4l2-core、meida framework、videobuf2等模块,这也是本文将要展开的内容,仅提纲挈领;
开始吧。
2. v4l2-core
2.1 应用视角
先从应用的角度来看如何使用v4l2吧:
假如要进行视频数据采集,大体的步骤如上图左侧所示:
-
打开设备文件/dev/videoX;
-
根据打开的设备,查询设备能力集;
-
设置视频数据的格式、参数等;
-
分配buffer,这个buffer可以是用户态分配的,也可以是从内核中获取的;
-
开始视频流采集工作;
-
将buffer enqueue到v4l2框架,底层负责将视频数据填充后,应用层再将buffer dequeue以便获取数据,然后再将buffer enqueue,如此循环往复;
上图右侧是v4l2-core的大体框架,右侧是对硬件的抽象,要想理解好它,可以先看一下较常见的硬件拓扑结构:
-
通常一个camera的模组如图所示,通常包括Lens、Sensor、CSI接口等,其中CSI接口用于视频数据的传输;
-
SoC的Mipi接口对接Camera,并通过I2C/SPI控制camera模组;
-
Camera模组中也可以包含ISP模块,用于对图像进行处理,有的SoC中也集成了ISP的IP,接收camera的raw数据后,进行图像处理;
2.2 数据结构
如果以上图的硬件为例,对摄像头的硬件该怎么来抽象呢?没错,就是以v4l2_device和v4l2_subdev来进行抽象,以v4l2_device来代表整个输入设备,以v4l2_subdev来代表子模块,比如CSI、Sensor等;
-
v4l2_device:对视频设备的整体进行抽象,可以看成是一个纽带,将各个子设备联系在一起,通常它会嵌入在其他结构体中以提供v4l2框架的功能,比如strcut isp_device;
-
v4l2_subdev:对子设备进行抽象,该结构体中包含的struct v4l2_subdev_ops是一个完备的操作函数集,用于对接各种不同的子设备,比如video、audio、sensor等,同时还有一个核心的函数集