V4L2框架

前言

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

框架

在这里插入图片描述
怎么看这个图?
这个图包含了2个部分:输入和输出,可以先只看输入设备。视频设备会以字符设备cdev的形式呈现,v4l2_device是整个v4l2的核心以及管理者,video_device不是一个instance,而是一个融合数据结构,它包含有cdev和v4l2_device数据结构并将他们关联起来,video_register_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文件实现,构建V4L2的ioctl控制框架。

官方文档参考:

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

相关内容阅读

链接: V4L2框架
链接: V4L2之设备注册
链接: V4L2之mmap()函数
链接: V4L2之events
链接: V4L2之buffer分配和映射

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值