Linux--V4L2摄像头驱动框架及UVC浅析

news2025/1/7 5:53:35

 一、前言

对于一个usb摄像头,它的内核驱动源码位于/drivers/media/usb/uvc/

核心层:V4L2_dev.c文件

硬件相关层: uvc_driver.c文件

本篇记录基于对6.8.8.8内核下vivid-core.c文件(虚拟视频驱动程序)的分析,梳理Linux系统中vedio视频设备的驱动框架。

二、源码分析

1、入口函数

module_init(vivid_init);

vivid_init
	//注册vivid设备和驱动
	platform_device_register(&vivid_pdev);
	platform_driver_register(&vivid_pdrv);

通过入口函数将平台设备和平台驱动结构体注册到内核中,关于具体的设备和驱动注册先关内容可以看Linux--平台设备、平台驱动的注册源码分析-CSDN博客这篇。

在代码中,vivid_pdrv 平台驱动没有 of_match_table 字段,因为该驱动程序不依赖设备树进行匹配和初始化。如果是真实的硬件驱动程序需要支持设备树匹配,则需要定义 of_match_table 字段,并提供一个设备树兼容字符串数组,也就是compatible属性值。

2、probe()函数

vivid_init()里分别注册了vivid_pdevvivid_pdrv,注册后,当他们匹配时,内核会自动则会调用该驱动程序probe()初始化该设备。在probe()里面主要进行初始化、注册等相关流程。

vivid_probe
   1) vivid_create_instance			/* 创建实例 */
    	dev = kzalloc(sizeof(*vivid_dev), GFP_KERNEL);/* 分配video_devicede */
    	v4l2_device_register		/* 初始化v4l2_device */
    	
    2)    static int vivid_create_devnodes(struct platform_device *pdev,
				 struct vivid_dev *dev, int inst,
				 unsigned int cec_tx_bus_cnt,
				 v4l2_std_id tvnorms_cap,
				 v4l2_std_id tvnorms_out,
				 unsigned in_type_counter[4],
				 unsigned out_type_counter[4])
{
      	/* 设置video_device */
    	1.vfd->fops = &vivid_fops;       /*也就是在probe里的这一步实现设备操作和驱动操作的绑定*/
		  vfd->ioctl_ops = &vivid_ioctl_ops;
		  vfd->release = video_device_release_empty;
		2.vfd->v4l2_dev = &dev->v4l2_dev;
		3.设置"ctrl属性"(用于APP的ioctl)
		   	v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_cap);
			v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_out);
			...
   
         /*注册vedio_device*/   /*分配主次设备号*/
    	video_register_device(video_device, type:VFL_TYPE_GRABBER, nr)
            __video_register_device
            	vdev->cdev = cdev_alloc();
				vdev->cdev->ops = &v4l2_fops;
				video_devices[vdev->minor] = vdev;//将video_device放入全局数组中
				ret = cdev_add(vdev->cdev, MKDEV(VIDEO_MAJOR, vdev->minor), 1);
				if (vdev->ctrl_handler == NULL)
				vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;

关键点:

1、分配video_device结构体内存          video_device_alloc()kzalloc()

2、设置video_device       .fops.ioctl_opsdev;、

也就是在probe里的这一步实现设备操作和驱动操作的绑定

3、注册video_device结构体      video_register_device()

3、操作函数(open、read、wirite等)

1、open

app:     open("/dev/video0",....)

---------------------------------------------------
drv:     v4l2_fops.v4l2_open
            vdev = video_devdata(filp);  // 根据次设备号从数组中得到video_device
            ret = vdev->fops->open(filp);
                        vivi_ioctl_ops.open
                           v4l2_fh_open

当应用层发生系统调用时,会先调用到v4l2_fops中的v4l2_open,v4l2_open会找到对应设备video_device的file opr中的open,而设备中的open是在驱动注册后调用probe函数与驱动函数定义的open绑定的,这样就实现了video设备用户空间open调用驱动open的过程。

2、ioctl

app:    read ....
		
-----------------------------------------------

drv:    v4l2_fops.v4l2_read
            struct video_device *vdev = video_devdata(filp);
            ret = vdev->fops->read(filp, buf, sz, off);

核心层v4l2_ctrl_handler会找到video_device的fops 。过程如下(在上文中通过v4l2_ctrl_handler_setup设置了某些属性的ioctl处理函数)

 __video_do_ioctl
	struct video_device *vfd = video_devdata(file);
		v4l2_is_known_ioctl(cmd)
        info = &v4l2_ioctls[_IOC_NR(cmd)]; 		/* v4l2_ioctls数组存有全部IOCTL_INFO,含有													ioctl函数指针 */
        ret = info->func(ops, file, fh, arg);	/* 调用对应的ioctl函数 */

三、UVC(USB Video Class)

UVC全称为USB Video Class,即:USB视频类,是一种为USB视频捕获设备定义的协议标准。是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,已成为USB org标准之一。

最新的UVC版本为UVC 1.5,由USB Implementers Forum定义包括基本协议及负载格式。             

USB摄像头示例如下:

对于框架具体细节可以看这篇UVC 1.5 Class Specification 简解_uvc1.5-CSDN博客

UVC驱动的重点在于:
   描述符的分析
   属性的控制: 通过VideoControl Interface来设置
   格式的选择:通过VideoStreaming Interface来设置
   数据的获得:通过VideoStreaming Interface的URB来获得

参考文章:

​​​​​​【Linux驱动】Linux--虚拟摄像头vivid驱动分析(基于5.4内核)-CSDN博客

【转载】linux摄像头驱动_linux 摄像头驱动-CSDN博客                 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1905545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能项目论文复现

文章目录 (一)技术学习任务Ⅰ、机器学习之聚类1、基本介绍概念2、聚类分析基本介绍3、K均值聚类4、K近邻分类模型(KNN)5、均值漂移聚类6、代码实现7、上述三种算法总结 Ⅱ、机器学习其他常用技术1、决策树基本知识2、异常检测概念3、主成分分析4、决策树…

【SpringCloud应用框架】Nacos服务配置中心

第四章 Spring Cloud Alibaba Nacos之服务配置中心 文章目录 一、基础配置二、新建子项目1.pom文件2.YML配置3.启动类4.业务类5.Nacos配置规则 三、Nacos平台创建配置操作四、自动配置更新五、测试 一、基础配置 Nacos不仅仅可以作为注册中心来使用,同时它支持作为…

算法:[动态规划] 斐波那契数列模型

目录 题目一:第 N 个泰波那契数 题目二:三步问题 题目三:最小花费爬楼梯 题目四:解码方法 题目一:第 N 个泰波那契数 泰波那契序列 Tn 定义如下: T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 …

CAN总线(下)

位时序 为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分, 分为同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1&#xff0…

【Threejs进阶教程-优化篇】4.Vue/React与threejs如何解决冲突和卡顿(续)

Vue/React与threejs如何解决冲突和卡顿-续 使用说明核心思路环境搭建(vuethree)vue运行机制分析业务分离使用threejs做背景 3D模块封装使用ES6的Class来让逻辑性更强Threejs尽量按需引入创建一个类扩展写法本次代码执行顺序 扩展内容添加orbitControls和辅助线解决事件覆盖 与V…

程序员学长 | 快速学会一个算法,xLSTM

本文来源公众号“程序员学长”,仅用于学术分享,侵权删,干货满满。 原文链接:快速学会一个算法,xLSTM 今天给大家分享一个超强的算法模型,xLSTM。 xLSTM(Extended Long Short-Term Memory&…

AI大模型的智能心脏:向量数据库的崛起

在人工智能的飞速发展中,一个关键技术正悄然成为AI大模型的智能心脏——向量数据库。它不仅是数据存储和管理的革命性工具,更是AI技术突破的核心。随着AI大模型在各个领域的广泛应用,向量数据库的重要性日益凸显。 01 技术突破:向…

水箱高低水位浮球液位开关工作原理

工作原理 水箱高低水位浮球液位开关是一种利用浮球随液位升降来实现液位控制的设备。其基本原理是浮球在液体的浮力作用下上下浮动,通过磁性作用驱动与之相连的磁簧开关的开合,从而实现液位的高低控制和报警。当液位升高时,浮球上浮&#xf…

Jmeter实现接口自动化

自动化测试理论知识 什么是自动化测试? 让程序或工具代替人为执行测试用例什么样的项目适合做自动化? 1、项目周期长 --多长算长?(自己公司运营项目) 2、需求稳定(更多具体功能/模块) 3、需要…

LabVIEW机器视觉系统中的图像畸变、校准和矫正

在机器视觉应用中,图像畸变、校准和矫正是确保图像准确性的关键步骤。LabVIEW作为一种强大的图像处理和分析工具,提供了一系列功能来处理这些问题。以下是对图像畸变、校准和矫正的详细介绍。 图像畸变 图像畸变 是指由于摄像镜头的光学特性或拍摄角度问…

昇思25天学习打卡营第3天|MindSpore张量

# 打卡 目录 # 打卡 类 涉及知识点 1. 创建张量的4种方式 运行例子 2. 张量属性和索引 运行例子 3. 张量运算 运行例子 4. Tensor 与 Numpy 转换 5. 稀疏张量:CSR和COO CSRTensor 运行例子 COOTensor 运行例子 RowTensor 类 import mindspore from…

CMD命令详细介绍 | 超详细版本!

文章目录 启动cmd命令用户启动使用管理员的账号启动 文件夹命令网络命令其他常用命令介绍常用快捷方式程序员相关命令 本文参考了博客园一篇帖子,ULR:cmd常用命令介绍(可收藏) - Mrwhite86 - 博客园 (cnblogs.com) CMD是Windows操作系统自带的命令行解释…

【Linux】打包命令——tar

打包和压缩 虽然打包和压缩都涉及将多个文件组合成单个实体,但它们之间存在重要差异。 打包和压缩的区别: 打包是将多个文件或目录组合在一起,但不对其进行压缩。这意味着打包后的文件大小可能与原始文件相同或更大。此外,打包…

【工具分享】Gophish

文章目录 Gophish安装方式功能简介 Gophish Gophish 是一个开源的网络钓鱼框架,它被设计用于模拟真实世界的钓鱼攻击,以帮助企业和渗透测试人员测试和评估他们的网络钓鱼风险。Gophish 旨在使行业级的网络钓鱼培训对每个人都是可获取的,它易…

文件存储的方法一

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了"如何实现本地存储"相关的内容,本章回中将介绍如何实现文件存储.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值…

鲨疯了,免费的Viva又能画图,又能做视频,又能......

theme: smartblue 点赞 关注 收藏 学会了 本文简介 众所周知,Midjourney擅长画画,Runway擅长做视频(Sora也说它可以做)。 Viva:我不是针对你,我只想说在座的各位都是乐色~ 注意,它叫Viva,不是…

Java引用的4种类型:强、软、弱、虚

在Java中,引用的概念不仅限于强引用,还包括软引用、弱引用和虚引用(也称为幻影引用)。这些引用类型主要用于不同的内存管理策略,尤其是在垃圾收集过程中。以下是对这四种引用类型的详细解释: 1. 强引用&am…

GD32实战篇-双向数控BUCK-BOOST-BUCK降压理论基础

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 向上代码兼容GD32F450ZGT6中使用 后续项目主要在下面该专栏中发布: https://blog.csdn.net/qq_62316532/category_12608431.html?spm1001.2014.3001.5482 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转…

论文解析——FTRANS: Energy-Efficient Acceleration of Transformers using FPGA

作者及发刊详情 Li B , Pandey S , Fang H ,et al.FTRANS: energy-efficient acceleration of transformers using FPGA[J].ACM, 2020.DOI:10.1145/3370748.3406567. 摘要 正文 主要工作贡献 与CPU和GPU在执行Transformer和RoBERTa相比,提出的FTRANS框架获得了…

计算云服务2

第二章 裸金属服务器 什么是裸金属服务器(BMS) 裸金属服务器(Bare Metal Server,BMS)是一款兼具虚拟机弹性和物理机性能的计算类服务为用户以及相关企业提供专属的云上物理服务器,为核心数据库、关键应用系统、高性能计算、大数据等业务提供卓越的计算…