首页 > 其他分享 >UVC设备端驱动的实现原理分析

UVC设备端驱动的实现原理分析

时间:2022-12-05 12:04:35浏览次数:63  
标签:USB 主机 原理 驱动 UVC V4L2 设备


UVC工作原理:

关于UVC的实现方式,UVC驱动分为设备端和主机端,根据 linux 内核的实现,貌似设备端的实现源码头部的版本信息描述为“USB Video Class Gadget driver”,而主机端的实现则是“USB Video Class driver”。并且主机端和设备都都和和v4l2框架挂接,根据下图可以看到这一点。

UVC设备端驱动的实现原理分析_linux

UVC设备端驱动的实现原理分析_uvc_02

UVC设备驱动初始化入口为uvcg_video_init

UVC设备端驱动的实现原理分析_V4L2_03

而主机端驱动初始化入口为,至于为什么这么确定他是主机端驱动,是因为linux/drivers/meida/usb/uvc/目录的编译是依赖CONFIG_USB_VIDEO_CLASS宏配置的,而这个宏配置是主机端驱动的配置项.

UVC设备端驱动的实现原理分析_V4L2_04

UVC设备端驱动的实现原理分析_设备节点_05

注册用于发送的/dev/video设备节点: 

UVC设备端驱动的实现原理分析_linux_06

UVC设备端驱动的实现原理分析_设备节点_07

而主机中也有一个一模一样的接口:

UVC设备端驱动的实现原理分析_设备节点_08

注册了主机的端的IOCTL

UVC设备端驱动的实现原理分析_linux_09

UVC设备端驱动的实现原理分析_ide_10

和主机端恰恰相反,这里的videoc_qbuf是向USB接口发送编码帧,而且dqbuf是获取空帧。

buffer_done也会被调用,它是在USB传输完成后,生成空帧的。

UVC设备端驱动的实现原理分析_uvc_11

UVC设备端驱动的实现原理分析_linux_12

在传输结束后,USB协议栈调用complete接口

UVC设备端驱动的实现原理分析_linux_13

 通过uvcg_queue_cancel接口,调用vb2_buffer_done,将空帧还给V4L2

UVC设备端驱动的实现原理分析_linux_14

所以看起来,作为设备端的UVCgadget驱动和作为主机端的UVC驱动buffer的语义相同,但数据流是相反的,dqbuf在主机端是有用像素数据,qbuf是空帧,buffer_done是帧数据,而在设备端,qbuf是有效编码数据,要通过usb发送出去的,而且dqbuf是空帧,buffer_done表示USB传输完了,这个buffer可以被重新填充了,是无效数据,所以恰好是相反的两个过程。

也就是说/dev/videoX节点,既可以做输入源,也可以做输出sink,用户层面可以将数据通过/dev/videoX发送出去,而buffer 的使用以及vb2_buffer_done在这两种情况下的作用恰好是对偶的。

关于UVC驱动分为主机端和设备端的另一个铁证是VIDIOC_QUERYCAP调用说明的,在使用V4L2设备之前,应用一般会调用VIDIOC_QUERYCAP去探测video设备的capability,返回的主要功能有两类,一类是

V4L2_CAP_STREAMING/V4L2_CAP_VIDEO_CAPTURE,代表UVC主机驱动端,抓取数据流的能力,比如接UVC摄像头的PC主机端UVC驱动。

当然还有另外一个,V4L2_CAP_VIDEO_OUTPUT,这个代表的是video output device, 设备节点可以输出视频帧,对应的是UVC设备端驱动,比如UVC摄像头端驱动。

UVC设备端驱动的实现原理分析_V4L2_15

关于其它UVC摄像头的capability信息可以参考博客

配置:

如若支持UVC设备端的功能,需要打开以下配置项:

UVC设备端驱动的实现原理分析_ide_16

使用流程:

对于UVC设备端的应用来说,系统中同时存在着两类UVC设备,一类是CAPTURE类型的,负责连接摄像头抓取图像,另一边则是OUTPUT类型的V4L2设备,它是将压缩格式的图像通过USB发送出去。中间通过用户层软件连接,用户软件的作用则主要是进行编码操作。

UVC设备端驱动的实现原理分析_V4L2_17

对一个模块建立宏观印象最好的一个方式是看应用如何使用它,来看一个UVC设备端的具体应用实现:

UVC设备端驱动的实现原理分析_设备节点_18

总结:

在运行Linux-4.15之后内核的主机上,插入一个 usb 摄像头,会出现两个 /dev/video*,这不是 bug,而是V4L2的特性,更多的讨论见此文章:

199575 – V4L2 issues two video devices to each camera

UVC设备端驱动的实现原理分析_设备节点_19

https://bugzilla.kernel.org/show_bug.cgi?id=199575.

阅读UVC实现框架代码的时候,可以主机端和设备端驱动对照着看,这样更能加深理解整个通路。

UVC  gadget驱动的实现框架如下图所示:

UVC设备端驱动的实现原理分析_ide_20

结束!

标签:USB,主机,原理,驱动,UVC,V4L2,设备
From: https://blog.51cto.com/u_15899439/5911838

相关文章

  • 源码解析:Dubbo3 的 Spring 适配原理与初始化流程
    Dubbo国内影响力最大的开源框架之一,非常适合构建大规模微服务集群的,提供开发框架、高性能通信、丰富服务治理等能力。同时Dubbo无缝支持Spring、SpringBoot模式的开......
  • 计算机组成原理(day0)
    1.计算机的硬件组成1.1冯诺依曼机内存的产生:结构框图:特点:1.2现代计算机结构1.3小节2.基本硬件2.1主存储器基本模型类比模型(读取数据)2.1.1储存体地址->MAR(通过MAR访问需要的......
  • 关闭U盘提示“此驱动器存在问题请扫描并修复”
    这个通知来自设置-》通知和操作里的自动播放关闭它即可。 如果你的电脑看不到这,或是出现*某些设置已隐藏或由你的组织管理 管理员命令提示符下键入以下命令:这......
  • 线程池原理
    (92条消息)一文读懂线程池的实现原理_老周聊架构的博客-CSDN博客_线程池原理 博客下载学习社区GitCode云服务猿如意  搜索会员中心 <img......
  • VK1625是一种64*8点 LCD液晶段码屏显示驱动控制电路(IC/芯片),可兼容替代市面1625,具省电
    产品品牌:永嘉微电/VINKA产品型号:VK1625封装形式:LQFP100/QFP100/DICE概述:VK1625是一个点阵式存储映射的LCD驱动器,可支持最大512点(64EGx8COM)的LCD屏。单片机可通过3/4线串......
  • MasaFramework -- 领域驱动设计
    概念什么是领域驱动设计领域驱动的主要思想是,利用确定的业务模型来指导业务与应用的设计和实现。主张开发人员与业务人员持续地沟通和模型的持续迭代,从而保证业务模型......
  • 【RocketMQ】主从同步实现原理
    主从同步的实现逻辑主要在HAService中,在DefaultMessageStore的构造函数中,对HAService进行了实例化,并在start方法中,启动了HAService:publicclassDefaultMessageStoreimpl......
  • HCIA学习笔记四十七:HDLC&PPP原理及配置
    一、串行链路的数据传输方式二、HDLC2.1、HDLC协议应用• High-levelDataLinkControl,高级数据链路控制,简称HDLC,是一种面向比特的链路层协议。 2.2、HDLC基本配......
  • 深入浅出学习透析Nginx服务器的基本原理和配置指南「初级实践篇 」
    什么是Nginx?Nginx(EngineX)是一个轻量级的Web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器、高性能的HTTP服务器,它以高稳定性、丰富的功能集、示例配置文件......
  • raid0、raid1、raid5、raid10、raid01原理
    什么是RAID独立硬盘冗余阵列(RAID,RedundantArrayofIndependentDisks)简称磁盘阵列。利用虚拟化存储技术把多个硬盘组合起来,称为一个或多个硬盘阵列组,目的是为提升性能或......