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

本文深入探讨了UVC(USB Video Class)设备驱动的工作原理,包括主机端和设备端的区别。在Ubuntu系统中,UVC设备通常创建两个/video设备节点。主机端驱动主要负责接收摄像头数据,而设备端驱动则发送编码数据。通过VIDIOC_QUERYCAP调用,可以区分设备的输入输出能力。UVC驱动的初始化、缓冲区管理和数据传输过程在主机端和设备端是相反的。了解这一机制有助于更好地理解和使用UVC设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UVC相关分析可以参考:

关于UVC设备拥有两个/dev/video*节点的原因以及来历?_tugouxp的专栏-优快云博客在ubuntu18.04/ubuntu16.04系统上,插入UVC设备,你会发现V4L2框架替它创建了两个video设备节点,分别是 /dev/video0, /dev/video1:https://blog.youkuaiyun.com/tugouxp/article/details/119946023USB Video Class及其实现_tugouxp的专栏-优快云博客1 Video Class 基础概念Usb协议中,除了通用的软硬件电气接口规范等,还包含了各种各样的Class协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式和内容。这些Class协议的数量非常多,最常见的比如支持U盘功能的Mass Storage Class,以及通用的数据交换协议:CDC class。此外还包括Audio Class, Print Class等等。 理论上说,即使没有这些Class,通过专用驱动也能够实现各种各样的应用功能。但是,正如Mass S...https://blog.youkuaiyun.com/tugouxp/article/details/118997653

UVC工作原理:

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

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

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

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

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

注册了主机的端的IOCTL

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

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

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

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

所以看起来,作为设备端的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摄像头的capability信息可以参考博客:

美乐图科技IPC摄像头试玩儿_tugouxp的专栏-优快云博客IPC详细参数如下:闪烁控制:50HZ,60HZ拍照格式:Bmp,jpg.传感器格式:CMOS支持Netmeeting等各种视频会议软件180M/bmp告诉处理器接口类型:USB2.0内置:吸音降噪麦克风分辨率:1920x1080/1280x720USB描述符信息:Descriptor:caozilong@caozilong-Vostro-3268:~$ lsusb -d 0c45:64ab -vBus 001 Device 011: ID 0c45:64https://blog.youkuaiyun.com/tugouxp/article/details/118712150

配置:

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

使用流程:

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

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

总结:

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

199575 – V4L2 issues two video devices to each camerahttps://bugzilla.kernel.org/show_bug.cgi?id=199575.

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

关于接UVC摄像头主机通路的配置,可以参考:

https://blog.youkuaiyun.com/tugouxp/article/details/119884204https://blog.youkuaiyun.com/tugouxp/article/details/119884204UVC  gadget驱动的实现框架如下图所示:

结束!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值