V4L2框架

2023-05-16

前言

在分析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分配和映射

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

V4L2框架 的相关文章

  • V4L2打开video设备注意(读写权限)

    V4L2编程中在open 34 dev video 34 时应注意 xff1a 摄像头采集到的数据是最开始是存储在内核空间我们申请的缓冲区中的 xff0c 具体设置如下 xff1a req count 61 5 req type 61 V4
  • Linux下V4L2调用摄像头设备程序崩溃

    问题描述 使用V4L2驱动调用摄像头 xff0c 只能打开一次摄像头 xff0c 第二次打开时程序崩溃 原因 在获取相机数据流时我们一般会使用mmap 来将linux内核空间映射到用户空间 xff0c 在关闭相机时应当调用munmap 解除
  • V4L2 ,VIDIOC_DQBUF,Invalid argument

    使用V4L2库打开摄像头 xff0c 获取摄像头数据 xff0c ioctl fd VIDIOC DQBUF amp buf 错误 VIDIOC DQBUF Invalid argument 错误代码 xff1a bool quit 61
  • Android 利用V4L2 调用camera

    为何要使用V4L2进行开发 出于安全原因 xff0c 使用Android 原生的Camera接口 xff0c 必须要使用可见的surface显示摄像头的preview图像 xff0c 即必须要让用户看到你的应用正在使用摄像头 另外Andro
  • V4L2视频驱动框架简述(转载)

    摘自 xff1a https blog csdn net LinuxArmbiggod article details 80310445 V4L2视频驱动框架简述 奶牛养殖场小马 2018 05 14 15 40 1013469 收藏 76
  • 【Linux驱动】Linux--V4L2视频驱动框架

    Linux V4L2视频驱动框架 Linux V4L2驱动框架一 V4L2 框架二 V4L2驱动主要数据结构三 V4L2提供的外部接口四 V4L2驱动框架模板五 虚拟摄像头驱动 参考资料 Linux V4L2驱动框架 一 V4L2 框架 v
  • USB摄像头驱动配置及V4L2编程

    1 摄像头驱动开发 1 1 摄像头软件系统架构 摄像头系统架构分为四层 xff1a 摄像头 支持V4L2的摄像头驱动 V4L2核心 应用程序 V4L2核心是Linux系统自带的组件 xff0c 它可以屏蔽摄像头驱动层的差异 xff0c 不管
  • Linux下摄像头应用编程

    Linux下摄像头应用编程 V4L2是Video for linux2的简称 为linux中关于视频设备的内核驱动 在Linux中 视频设备是设备文件 可以像访问普通文件一样对其进行读写 摄像头在 dev video 下 如果只有一个视频设
  • v4l2在帧缓冲区预览摄像头

    在应用层通过v4l2 api将采集的摄像头数据yuv转为rgb后写到帧缓冲区达到预览摄像头的目的 程序运行后切换到tty下就可以看到 我的屏幕是bgra格式的 这点要注意 不同屏幕格式不同 不同r g b的偏移通过修改 0x00 lt lt
  • 如何写入/传输到 V4L2loopback 模块创建的虚拟网络摄像头?

    我编写了一个应用程序 它从网络摄像头读取数据并在 Linux 上使用 OpenCV 处理帧 现在我想将应用程序的输出通过管道传输到由 V4L2loopback 模块创建的虚拟网络摄像头 以便其他应用程序能够读取它 我使用 C 编写了该应用程
  • 如何在 Linux UVC 驱动程序中启用 UVC_QUIRK_FIX_BANDWIDTH 怪癖?

    我目前正在尝试运行 2webcams在 Wandboard 板上 它们必须共享 USB 集线器 问题是 当前的驱动程序实现 仅限 YUV 使 USB 集线器饱和 最终我只能连接一台相机 然而 UVC 驱动程序的实现有一个怪癖kind情况等
  • V4l2 上的 OpenCV 输出

    我想知道是否可以使用 opencv 在 v4l2 设备上写入 我会拍一张照片 利用 opencv 的功能进行一些小的更改 然后将其发送到 v4l2 设备上 我在网上搜索了一下 但是有很多关于如何从V4L2设备读取的示例 但我没有找到关于在v
  • 无法使用 Python/opencv 关闭/打开 CameraCapture:设备或资源繁忙

    当我尝试使用 Python 重新打开 opencv Camera Capture 时 我得到 libv4l2 error setting pixformat Device or resource busy HIGHGUI ERROR lib
  • 列出可用的捕获格式

    作为 V4L 的新手 我决定开始使用 video4linux2 库 以便用 C 语言从我的相机捕获帧 我正在将 uvcvideo 模块与 Ricoh Co 相机一起使用 我遵循了一些指南和教程 并设法获得了一个正在运行的程序 我的问题主要是
  • v4l2_buffer->timestamp值从哪里开始计数?

    我正在尝试使用 v4l2 buffer 的时间戳值 类型 timeval 来同步从UVC网络摄像头到外部事件 但是时间戳与系统时间或正常运行时间等不同 printf image captured at ld ld n buffer gt t
  • python中的用户指针

    我正在尝试显示使用 v4l 捕获的网络摄像头的预览 下面是代码的大概样子 from ctypes import from v4l2 import from Image import fromstring from Tkinter impor
  • 使用 v4l2loopback 和 EDSDK Liveview 进行佳能 DSLR 视频环回?

    我想使用 DSLR 相机作为视频输入 例如在 Linux 和 Android 下进行 Skype Google talk 是否可以使用 v4l2loopback 和 Canon EDSDK 创建视频环回 如何将实时取景缓冲区从摄像机传输到视
  • v4l2 fcntl.ioctl VIDIOC_S_PARM 用于设置相机捕获的 fps 和分辨率

    我正在尝试设置网络摄像头的 fps 和分辨率 并通过 v4l2 Python 进行捕获 v4l2 Python 文档仅限于 gt gt gt import v4l2 gt gt gt import fcntl gt gt gt vd ope
  • OpenCV 从相机捕获 YUYV,无需 RGB 转换

    我尝试使用 openCV c 从 LI USB30 V024 立体相机捕获左右图像 而不自动将其转换为 RGB 相机输出 YUYV 格式的图像 我尝试使用 videoCapture set CV CAP PROP CONVERT RGB f
  • 使用 ffmpeg 或 OpenCV 处理原始图像

    看完之后维基百科页面 http en wikipedia org wiki Raw image format原始图像格式 是任何图像的数字负片 为了查看或打印 相机图像传感器的输出具有 进行处理 即转换为照片渲染 场景 然后以标准光栅图形格

随机推荐

  • linux 流量查看工具 iftop 配置

    linux 流量查看工具 iftop 配置 iftop是LINUX下查看网络流量的软件 iftop 官方网站 http www ex parrot com pdw iftop 1 iftop如何安裝 xff1a 首先查看自己的系统是否安裝
  • 技术系统进化法则是_技术系统进化论,模式七、系统由宏观向微观进化

    阿奇舒勒TRIZ理论三个核心思想 xff1a 1 无论是一个简单产品还是复杂的技术系统 xff0c 其核心技术的发展都是遵循着客观的规律发展演变的 xff0c 即具有客观的进化规律和模式 xff1b 2 各种技术难题和矛盾的不断解决是推动这
  • 吉他谱

    其实我是个诗人 01 得不到你 02 多想在平庸的生活拥抱你 03 往后余生 04 成都 转载于 https www cnblogs com zhangmingyan p 11603872 html
  • Openssl配置CA证书及https访问

    一 创建根秘钥对 1 创建目录 cd mkdir root ca cd root ca mkdir certs crl newcerts private chmod 700 private touch index txt echo 1000
  • Thread.currentThread().setContextClassLoader为什么不生效与java.lang.NoClassDefFoundError之Java类加载的Parent fir...

    众所周知 xff0c Java的类加载机制采用了双亲委派模型 xff0c 导致在进行类加载的时候会有多个加载器 xff0c 这种复杂的机制 xff0c 有时候会导致 Exception in thread main java lang No
  • C#编写的通过汉字得到拼音和五笔码

    public static class SpellAndWbConfig region 变量声明 XML文件读取实例 lt summary gt XML文件读取实例 lt summary gt private static XmlReade
  • 设置HTML5的video播放速度

    var speed 61 1 5 设置速度 var vdo 61 document getElementById 34 视频的id 34 获取id vdo playbackRate 61 speed 改变速度 合并一句 document g
  • uni-app 做路由拦截器

    插件市场 xff08 https ext dcloud net cn plugin id 61 159 xff09 吐槽 好多小伙伴跑来问我有没有Uni app视频教程 xff0c 收费的也行 各位uni app 你根本不需要买市面上几百块
  • 华为S5700交换机初始化和配置SSH和TELNET远程登录方法

    华为S5700交换机初始化和配置TELNET远程登录方法 xff1a 1 交换机开启Telnet服务 lt Huawei gt system view 进入系统视图 Huawei telnet server xff1f 查看有enable还
  • 方差的无偏估计如何计算?

    我们常常被问到 34 方差的无偏估计如何计算 xff1f 和有偏估计的区别是什么 xff1f 34 xff0c 心想 34 哎呀 xff0c 又忘了 34 本篇回归问题本质 xff0c 带你理解这些名词背后解决的实际问题 xff08 通过总
  • C++ for无限循环~

    无限循环 如果条件永远不为假 xff0c 则循环将变成无限循环 for 循环在传统意义上可用于实现无限循环 由于构成循环的三个表达式中任何一个都不是必需的 xff0c 您可以将某些条件表达式留空来构成一个无限循环 include lt io
  • VINS-Fuison调试笔记

    最近一直在断断续续的调试vins fuison xff0c odometry总是各种飘 xff0c 令人头大 记录一下调试过程 xff0c 供以后学习参考 首先选用一组可靠的视觉惯导传感器 xff0c 如Realsense D435i xf
  • 《C和指针》阅读笔记

    第9章 字符串 字符和字节 9 1 字符串基础 字符串就是一串 零个或多个字符 xff0c 并且以一个位模式为全0的NUL字节结尾 因此 xff0c 字符串所包含的字符内部不能出现NUL字节 NUL字节是字符串的终止符 xff0c 但它本身
  • 【蓝牙数据采集模块】-02-Sensor Controller 编写CC2650STK外设驱动

    上次说到把所有的传感器模块在Sensor Controller中实现读写 xff0c 并封装驱动 先来看一下CC2650STK的原理图 用红色方框标记的DIO 0 DIO 7 DIO 23 DIO 30是可以通过Sensor Control
  • ->:间接引用运算符

    gt 是一个整体 xff0c 它是用于指向结构体 C 43 43 中的class等含有子数据的指针用来取子数据 换种说法 xff0c 如果我们在C语言中定义了一个结构体 xff0c 然后申明一个指针指向这个结构体 xff0c 那么我们要用指
  • linux音频服务器,Linux声音系统

    TAG linux alsa oss pulseaudio esd aRts DATE 2013 08 13 Linux声音系统有些混乱 xff0c 它有三套音频驱动 OSS Open Sound System 商业版的OSS xff0c
  • android 网络调试工具,安卓网络调试助手

    安卓网络调试助手apk是一款内容比体积精彩得多的网络设置软件 安卓网络调试助手支持多种端口和协议 xff0c 而且安卓网络调试助手apk虽然功能很专业但是操作起来也不是很难 xff0c 很容易学会 xff01 软件介绍 安卓网络调试助手ap
  • 计算机非全日制硕士 选校,非全日制硕士研究生,到底值不值得报考?看完这篇就懂了!...

    网友一 xff1a 如果不是已经工作的 xff0c 不推荐报考 因为非全日制的待遇不如全日制 xff0c 同时公务员等体制很多要求全日制学历 同时学费也比全日制贵好几倍 加上本身作为新生事物 xff0c 就业市场的认可与否还很难讲 如果你已
  • android进入后台被杀死,Android后台杀死系列之一:FragmentActivity及PhoneWindow后台杀死处理机制...

    新Activity启动及旧Activity保存流程 App在后台久置后 xff0c 再次从桌面或最近的任务列表唤醒时经常会发生崩溃 xff0c 这往往是App在后台被系统杀死 xff0c 再次恢复的时候遇到了问题 xff0c 而在使用Fra
  • V4L2框架

    前言 在分析v4l2之前最好具有的知识 xff1a 1 字符设备 因为v4l2是被枚举为字符设备 2 内存分配和映射 比如相关数据结构的分配和buffer 3 DMA xff0c 因为v4l2的数据传输用到了DMA 4 I2C xff0c