系列文章:
Linux V4L2驱动框架分析之(一):架构介绍
Linux V4L2驱动框架分析之(二):平台v4l2设备驱动
Linux V4L2驱动框架分析之(三):v4l2设备的缓存管理
Linux V4L2驱动框架分析之(四):sensor驱动
V4L2是video for Linux 2的缩写,是一套Linux内核视频设备的驱动框架,为上层的访问底层的视频设备提供了统一的接口。
V4L2支持多种类型设备:视频输入输出设备、VBI设备和radio设备等,分别会在/dev目录下产生videoX、radioX和vbiX设备节点等。我们常见的视频输入设备主要是摄像头,也是本文主要分析对象。
V4L2的框架
V4L2的框架如下图所示:
主要包括以下四个部分:
(1) 字符设备驱动程序核心:V4L2本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间;
(2) V4L2驱动核心:主要是构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数;
(3) 平台V4L2设备驱动:在V4L2框架下,根据平台自身的特性实现与平台相关的V4L2驱动部分,包括注册video_device和v4l2_dev;
(4) 具体的sensor驱动:主要上电、提供工作时钟、视频图像裁剪、流IO开启等,实现各种设备控制方法供上层调用并注册v4l2_subdev。
硬件架构:
常见的摄像头接口有USB、CSI、网口等,用于控制sensor的接口有I2C、SPI等。
V4L2的几个主要的结构体:
v4l2_device:这个是整个输入设备的总结构体,可以认为它是整个V4L2框架的入口,充当驱动的管理者以及入口监护人。用于视频输入设备整体的管理,有多少输入设备就有多少个v4l2_device抽象(比如一个USB摄像头整体就可以看作是一个V4L2 device)。
v4l2_subdev:依附在v4l2_device之下,并表示一个v4l2设备的子设备,一个v4l2_devide下可以有多个v4l2_subdev,如上图的硬件架构图,sensor当作一个v4l2_subdev。
vb2_queue:v4l2设备的缓存管理。
video_device:为用户空间提供设备节点,提供系统调用的相关操作(open、ioctl…)。
平台V4L2设备驱动
平台相关的V4L2驱动部分,主要是注册video_device和v4l2_dev,同时用struct v4l2_subdev来抽象外接硬件。v4l2_device里有一个v4l2_subdev链表,子设备会链在该链表上。用户空间的ioctl先传递至平台驱动代码,然后通过v4l2_subdev_call调用v4l2_subdev提供的相关接口操作外接硬件。
具体的sensor驱动
主要上电、提供工作时钟、视频图像裁剪、流IO开启等,实现各种设备控制方法供上层调用并注册v4l2_subdev。