1、概述.
Video4Linux2是Linux内核中关于
视频设备的内核驱动框架
,为上层的访问底层的视频设备提供了统一的接口。
凡是内核中的子系统都有抽象底层硬件的差异,为上层提供统一的接口和提取出公共代码避免代码冗余等好处。
就像公司的老板一般都不会直接找底层的员工谈话,而是找部门经理了解情况,一个是因为底层屌丝人数多,意见各有不同,措辞也不准,部门经理会把情况汇总后再向上汇报;二个是老板时间宝贵。
V4L2支持三类设备
:
视频输入输出设备、VBI 设备和radio设备(
其实还支持更多类型的设备,暂不讨论),分别会在
/dev目录下产生 videoX、radioX和vbiX设备节点
。
我们常见的视频输入设备
主要是摄像头
,也是本文主要分析对象。下图V4L2在Linux系统中的结构图:
Linux系统中
视频输入设备主要包括以下四个部分
:
字符设备驱动程序核心: V4L2本身就是
一个字符设备
,具有字符设备所有的特性,暴露接口给用户空间;
V4L2驱动核心: 主要是构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数;
平台V4L2设备驱动: 在V4L2框架下,根据平台自身的特性实现与平台相关的V4L2驱动部分,
包括注册video_device和v4l2_dev
。
具体的sensor驱动: 主要
上电、提供工作时钟、视频图像裁剪、流IO开启
等,实现各种设备控制方法供上层调用并
注册v4l2_subdev
。
V4L2的核心源码位于
drivers/media/v4l2-core
,源码以实现的功能
可以划分为四类
:
核心模块实现: 由 v4l2-dev.c 实现,主要作用
申请字符主设备号、注册class和提供video device
注册 注销等相关函数;
V4L2框架
: 由 v4l2-device.c、v4l2-subdev.c、v4l2-fh.c、v4l2-ctrls.c 等文件实现,构建V4L2框架;
Videobuf管理: 由 videobuf2-core.c、videobuf2-dma-contig.c、videobuf2-dma-sg.c、videobuf2-memops.c、videobuf2-vmalloc.c、v4l2-mem2mem.c
等文件实现,完成
videobuffer的分配、管理和注销
。
Ioctl框架: 由 v4l2-ioctl.c 文件实现,构建 V4L2ioctl 的框架。
2、V4L2框架
结构体 v4l2_device、video_device、v4l2_subdev 和 v4l2_fh 是搭建框架的主要元素。下图是V4L2框架的结构图:
从上图V4L2框架是一个标准的树形结构,v4l2_device 充当了父设备,
通过链表把所有注册到其下的子设备管理起来,这些设备可以是GRABBER、VBI或RADIO。
V4l2_subdev 是子设备,v4l2_subdev 结构体
包含了对设备操作的 ops和ctrls,这部分代码和硬件相关,
需要驱动工程师根据硬件实现,
像摄像头设备需要实现控制上下电、读取ID、饱和度、对比度和视频数据流打开关闭的接口函数。
Video_device
用于创建子设备节点,把操作设备的接口暴露给用户空间。 V4l2_fh 是每个子设备的文件句柄,在打开设备节点文件时设置,
方便上层索引到 v4l2_ctrl_handler,v4l2_ctrl_handler 管理设备的 ctrls,这些ctrls (摄像头设备)包括调节饱和度、对比度和白平衡等。
V4L2框架分析学习一
http://www.techbulo.com/1193.html