V4L2框架

wuchangjian2021-11-05 17:44:26编程学习

前言

在分析v4l2之前最好具有的知识:
1.字符设备,因为v4l2是被枚举为字符设备。
2.内存分配和映射,比如相关数据结构的分配和buffer。
3.DMA,因为v4l2的数据传输用到了DMA。
4.I2C,因为很多传感器都是用的i2c接口。
5.文件系统的基本操作,比如open(),ioctl()
6.设备树,因为子设备的异步注册就是靠设备树的的信息来实现的。

框架

在这里插入图片描述
怎么看这个图?
视频设备会以字符设备cdev的形式呈现,v4l2_device是整个v4l2的核心以及管理者,video_device不是一个instance,而是一个融合数据结构,它包含有cdev和v4l2_device数据结构并将他们关联起来,video_register_device()函数来实现的。
ps:v4l2_device设备会进行串联吗?从数据结构上来看不会。

说明

v4l2总体可以分为2层:用户层和驱动层。它们各自有对应的操作函数,最终也是通过系统调用联系起来的。
应用层包含哪些操作呢?
v4l2_capture.c这是一个简单的应用层例子,包含了v4l2的一些基本操作。比如一般的操作步骤:

	struct v4l2_capability cap;
	if (-1 == xioctl (fd, VIDIOC_QUERYCAP, &cap)) {
		if (EINVAL == errno) {
			fprintf (stderr, "%s is no V4L2 device\n",	dev_name);
			exit (EXIT_FAILURE);
		} else {
			errno_exit ("VIDIOC_QUERYCAP");
		}
	}
	struct v4l2_input input;
	memset(&input, 0, sizeof(struct v4l2_input));
	input.index = 0;
	int rtn = ioctl(fd, VIDIOC_S_INPUT, &input);
	if (rtn < 0) {
		printf("VIDIOC_S_INPUT:rtn(%d)\n", rtn);
	}

需要说明的是,这些只是v4l2功能的中的一小部分,还有其它的很多操作。
而这些操作在驱动中都有对应的实现函数。

驱动层包含哪些操作呢?
举例ov5640.c的实现,这个是一个具体的实例,也是一个现实的具体应用。但作为一个linux工程师只实现部分代码还是不够的,我们需要更加深入的了解V4L2底层。那么就会涉及到/drivers/media目录各种代码。其中/drivers/media/i2c/ov5640.c就是我们前面提到的代码。/drivers/media/v4l2-core中的代码就是整个v4l2的核心实现代码。

tree
├── Kconfig
├── Makefile
├── tuner-core.c		//里面主要的函数都是通过struct v4l2_subdev *sd来分别进行控制的。
├── v4l2-async.c		//异步注册操作
├── v4l2-clk.c
├── v4l2-common.c
├── v4l2-compat-ioctl32.c
├── v4l2-ctrls.c		//控制相关的亮度等
├── v4l2-dev.c			//主要作用申请字符主设备号、注册class和提供video device注册注销等相关函数;
├── v4l2-device.c		//设备相关对应于驱动
├── v4l2-dv-timings.c
├── v4l2-event.c		//导出到用户空间的事件
├── v4l2-fh.c			//文件访问控制
├── v4l2-flash-led-class.c
├── v4l2-fwnode.c	//fw:fireware固件处理相关函数。
├── v4l2-ioctl.c		//子设备控制->层级调用
├── v4l2-mc.c
├── v4l2-mem2mem.c
├── v4l2-subdev.c		//子设备实例
├── v4l2-trace.c
├── videobuf2-core.c
├── videobuf2-dma-contig.c	//物理地址连续(虚拟地址不关心)
├── videobuf2-dma-sg.c		//虚拟地址以及物理地址上都非连续内存
├── videobuf2-dvb.c
├── videobuf2-memops.c
├── videobuf2-v4l2.c
├── videobuf2-vmalloc.c		//虚拟地址连续,物理地址分散

可以看到这部分还是有很多的内容。还需要补充的是v4l2需要实现和平台现关的代码,比如NXP的/drivers/media/platform/mxc 、
三星的/drivers/media/platform/exynos4-is等。比如hdmi、capture、output、overlay、mipi等功能的实现。总之,v4l2的底层驱动还是比较复杂的。子设备的异步注册、V4L2 Controls等都有自己的显示方式。

核心代码

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的框架。

官方文档参考:

https://www.kernel.org/doc/html/v4.15/media/uapi/v4l/v4l2.html
https://www.kernel.org/doc/html/v4.15/media/kapi/v4l2-core.html
ioctl相关操作:
https://www.kernel.org/doc/html/v4.14/media/uapi/v4l/user-func.html
capture:
https://www.kernel.org/doc/html/v4.14/media/uapi/v4l/capture.c.html
v4l2grab:
https://www.kernel.org/doc/html/v4.14/media/uapi/v4l/v4l2grab.c.html

相关文章

未来一周长沙一路晴“歌”,最高气温稳定在39℃

未来一周长沙一路晴“歌”,最高气温稳定在39℃

2022-08-13 14:07:47 今天~20日,晴天为主,最高气...

多经历,增加人生的厚重感

 近来是我网赚生涯中最忙的一个时间段之一,上一个最忙的时候就是2015年做...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。