在分析v4l2之前最好具有的知识:
v4l2是被枚举为字符设备。buffer。DMA,因为v4l2的数据传输用到了DMA。I2C,因为很多传感器都是用的i2c接口。open(),ioctl()V4L2 是专门为 linux 设备设计的一套视频框架,其主体框架在 linux 内核,可以理解为是整个 linux 系统上面的视频源捕获驱动框架。其广泛应用在嵌入式设备以及移动端、个人电脑设备上面,市面上的编码产品类如:SDV、手机、IPC、行车记录仪都会用到这个框架来进行视频采集。
V4L2驱动属于字符设备驱动,且属于相对复杂的字符设备驱动,对于一个字符设备,我们的编写步骤一般为:
构造一个file_operation结构体,编写系统调用函数open,read,ioctl等
驱动入口函数:在入口函数注册主次设备号,cdev,class,device等
驱动卸载函数

从图中可以看出V4L2驱动框架也分为核心层与硬件相关层。
V4L2核心层:核心层主要负责注册字符设备,由内核提供open,read,write等接口给用户空间,为视频操作提供统一接口函数。V4L2驱动:根据每一个硬件平台的不同特性实现,包括向V4L2核心层注册Video_device以及V4L2_device,在V4L2_device中管理一个v4l2_subdev链表,用户空间发生系统调用时,首先调用V4L2核心层函数,再通过调用平台V4L2驱动再通过v4l2_subdev_call调v4l2_subdev中提供的相关操作。v4l2_subdev。v4l2驱动框架主要的对象有video_device、v4l2_device、v4l2_subdev、videobuf
video_device:一个字符设备,为用户空间提供设备节点:dev/videoX,提供驱动与应用交互的系统调用函数。v4l2_device:表示一个v4l2设备的实例,由其可以引出一个子设备结构体v4l2_subdev,其中有多少个输入设备就有多少video_device结构体,比如一个高清摄像头,作为一个整体,看作是一个v4l2_device,其包含ISP,MIPI等对应输入子设备v4l2_subdev,它们都属于这一个v4l2_device之下。v4l2_subdev:目前 v4l2驱动 随着需求以及硬件的变化越来越复杂,v4l2驱动需要支持音频,视频,解码,编码等ic,使得大部分 v4l2设备都包含了多个子设备IC,例如 解编码器,传感器,摄像头控制器等等,所以在/dev目录下不仅仅要建立v4l2的节点,还需要建立各个IC的设备节点,如fb,i2c,input,alsa等设备节点,通常这些IC通过i2c总线与主板连接,以上设备统称为 sub-devices 子设备,代表实实在在的camera等传感器设备,通常指挂在i2c总线。驱动需要与子设备进行通信,这些子设备一般情况下就是音频处理,编解码器等,camera常见的子设备有传感器和摄像头控制器,为了方便代码管理,内核 v4l2 提供了一个统一的接口给这些子设备,即 v4l2_subdev 结构体。