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

 一、前言

对于一个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_probe1) 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_devicevdev->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_openvdev = video_devdata(filp);  // 根据次设备号从数组中得到video_deviceret = vdev->fops->open(filp);vivi_ioctl_ops.openv4l2_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_readstruct 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_ioctlstruct 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.mzph.cn/diannao/42667.shtml

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

相关文章

推荐系统中Prior Belief的概念(附代码)

在推荐系统中,先验信念(prior belief)是指在没有观察到实际数据之前,我们对某些参数或变量的初始假设或预期。这种先验信念可以帮助模型在数据稀疏或噪声较多的情况下做出更好的预测。 先验信念(Prior Belief&#xf…

独立站运营招聘:寻找璀璨之星,开启运营之旅

尊敬的各位同仁,我乃大家熟知的独立站长,对于运营独立站点始终保持着满腔热情。今日,我欲与诸位共同探讨一热门议题—独立站运营招聘。此次招聘不再仅为职位争夺,更为寻找璀璨之星的探险之旅。 独立站的灵魂:什么是独…

Mysql中视图的使用以及常见运算符的使用示例和优先级

场景 基础知识回顾:mysql中视图的基础使用以及常见运算符的使用示例。 注: 博客:霸道流氓气质-CSDN博客 实现 Mysql中视图的使用 视图的创建 CREATE VIEW stu_view AS SELECT * FROM bus_student; 视图查询 SELECT * FROM stu_view;…

澳大利亚媒体发稿:怎样用图表提高易读性?-华媒舍

媒体发稿的可读性变得尤为重要。读者们不会再有时间与耐心去阅读文章繁琐的文本,他们更喜欢简洁明了的信息展现形式,在其中图表是一种极为高效的专用工具。下面我们就详细介绍怎么使用图表提高澳大利亚新闻媒体发稿的可读性,以适应读者的需要…

java 栅栏(CyclicBarrier)

Java中的栅栏(CyclicBarrier)是一种用于协调多个线程并发工作的同步辅助类。与CountDownLatch不同,CyclicBarrier允许一组线程相互等待,直到所有线程都到达一个共同的屏障点(barrier)后,才继续执…

CSS 【详解】样式选择器(含ID、类、标签、通配、属性、伪类、伪元素、Content属性、子代、后代、兄弟、相邻兄弟、交集、并集等选择器)

CSS 样式选择器&#xff0c;用于选中页面中的 html 元素&#xff0c;以便添加 CSS 样式。 按渲染性能由高到低 依次是&#xff1a; ID 选择器 #id 通过元素的 id 属性选中元素&#xff0c;区分大小写 <p id"p1" >第一段</p>#p1{color: red; }但不推荐使…

【LinuxC语言】手撕Http之处理POST请求

文章目录 前言声明POST的组成读取POST信息读取消息体长度读取消息体解析消息体How to use?总结前言 在互联网的世界中,HTTP协议无疑是最重要的协议之一。它是Web的基础,支持着我们日常生活中的大部分在线活动。尽管有许多现成的库可以处理HTTP请求,但了解其底层工作原理是…

全面解析:儿童编程等级考试及其区别

目录 1. 前言2. 儿童编程等级考试的重要性3. 儿童编程等级考试的特点4. 儿童编程等级考试4.1 非专业级软件能力认证(CSP-J/S)4.2 GESP编程能力等级认证4.3 青少年编程能力等级测试(CPA)4.4 全国青少年软件编程等级考试4.5 全国青少年编程能力等级考试(PAAT)1. 前言 近年来…

【学习笔记】Mybatis-Plus(四):MP中内置的插件

内置插件 目前MP已经存在的内部插件包括如下&#xff1a; 插件类名作用PaginationInnerInterceptor分页插件。可以代替以前的PageHelperOptimisticLockerInnerInterceptor乐观锁插件。用于幂等性操作&#xff0c;采用版本更新记录DynamicTableNameInnerInterceptor动态表名Te…

【Rust】Cargo介绍

一、Cargo简介 Cargo 是Rust语言的包管理工具&#xff0c;它帮助我们管理我们项目的依赖。做js开发的同学应该了解nodejs的包管理工具npm&#xff0c;Cargo和npm做的事情是一样的。C和C的同学可能对这个就比较陌生了&#xff0c;C/C语言没有统一的依赖管理工具&#xff0c;各个…

Spring中常见知识点及使用

Spring Framework 是 Java 生态系统中最流行的开源框架之一&#xff0c;它提供了一系列强大的功能&#xff0c;用于构建企业级应用。以下是一些常见的 Spring 知识点及其使用方法&#xff1a; 1. 依赖注入&#xff08;Dependency Injection&#xff09; 依赖注入是 Spring 的…

【SpringCloud应用框架】Nacos集群架构说明

第六章 Spring Cloud Alibaba Nacos之集群架构说明 文章目录 前言一、Nacos支持三种部署模式二、集群部署说明三、预备环境 前言 到目前为止&#xff0c;已经完成了对Nacos的一些基本使用和配置&#xff0c;接下来还需要了解一个非常重要的点&#xff0c;就是Nacos的集群相关的…

【芯片制造】【问题整理】明场检测和暗场检测

背景&#xff1a; 什么是明场检测和暗场检测 主要功能&#xff1a; 1、在明场检测中&#xff0c;光源直接照射到样品表面&#xff0c;透射光或反射光被收集并成像。样品上的颗粒、划痕、凹坑会改变光的反射和透射&#xff0c;形成对比&#xff0c;能够快速扫描大面积样品。 2、…

SAP - 初识

人过三十不学艺&#xff1b;活到老学到老。。。。。。 怎么说都有理&#xff0c;说不如做 低头做事&#xff0c;抬头看天 先做&#xff0c;至少了解下是个什么&#xff1f; 1. SAP是什么 https://www.sap.cn/ -- 思爱普中国 https://www.sap.cn/about/wha…

金斗云 HKMP智慧商业软件 任意用户创建漏洞复现

0x01 产品简介 金斗云智慧商业软件是一款功能强大、易于使用的智慧管理系统,通过智能化的管理工具,帮助企业实现高效经营、优化流程、降低成本,并提升客户体验。无论是珠宝门店、4S店还是其他零售、服务行业,金斗云都能提供量身定制的解决方案,助力企业实现数字化转型和智…

无人机遥控器指令加密方法

遥控信息的安全问题是无人机遥控系统设计和任务实施过程中最重要的问题之一。然而日益发展的电子侦察和电子对抗技术&#xff0c;使第三方可以截获已方所发送的遥控指令&#xff0c;分析和窃取遥控信息的内容&#xff0c;从而伪造遥控信息&#xff0c;对己方无人机构成严重威胁…

12.x86游戏实战-汇编指令and or not

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;11.x86游戏实战-汇编指令add sub inc dec and指令是与的意思 or指令是或的意思 …

MUX VLAN实现二层流量的弹性管控

一、模拟场景&#xff0c;企业有一台服务器&#xff0c;部门A&#xff0c;部门B&#xff0c;访客 二、要求&#xff1a;三者都可以访问服务器&#xff0c;部门A和B可以进行部门内部通信&#xff0c;A和B不可以通信&#xff0c;访客只能访问服务器 三、拓扑如下图 四、配置流程…

计算机网络编程和并发的知识

OSI七层协议 OSI&#xff08;Open Systems Interconnection&#xff09;模型是一个七层的网络通信模型&#xff0c;用于标准化不同层级的网络通信。从下到上分别是&#xff1a; 物理层&#xff08;Physical Layer&#xff09;&#xff1a;负责在物理媒介上传输原始的比特流。…

springcloud 面试经常被问问题

Spring Cloud 是一个基于 Spring Boot 的微服务架构解决方案&#xff0c;包含了许多用于构建和管理微服务的工具和框架。在面试中&#xff0c;与 Spring Cloud 相关的问题通常会涉及其核心概念、组件、常用模式和解决方案。以下是一些在 Spring Cloud 面试中经常被问到的问题及…