RK3568平台(USB篇)UVC驱动分析

 一.UVC简介

摄像头分为两类:

1.CAMER接口的摄像头;

2.USB接口接口的摄像头;

这里主要介绍usb摄像头的设备驱动程序。

UVC全称为USB Video Class,即:USB视频类,是一种为USB视频捕获设备定义的协议标准。

如今的主流操作系统(如Windows XP SP2 and later, Linux 2.4.6 and later, MacOS 10.5 and later)都已提供 UVC 设备驱动,因此符合 UVC 规格的硬件设备在不需要安装任何的驱动程序下即可在主机中正常使用。使用 UVC 技术的包括摄像头、数码相机、类比影像转换器、电视棒及静态影像相机等设备。

Linux UVC driver(uvc) 驱动适用于符合USB视频类规范的摄像头设备,它包括V4L2内核设备驱动和用户空间工具补丁。只要符合这类标准,则不同厂商的USB camera设备,不需要特定的driver就能在Linux下使用。

V4L2:

简单的讲V4L2就是用来管理UVC设备的并且能够提供视频相关的一些API。那么这些API怎么使用或者能被谁使用呢。在Linux系统上有很多的开源软件能够支持V4L2。常见的有FFmpeg、opencv、Skype、Mplayer等等。

我们知道在linux下,一切设备皆是是文件,可以像访问普通文件一样对其进行读写。因此,我们不难猜出,V4L2提供的API实际上就是一系列read、write、open、ioctl等函数:

APP在应用层调用read、write、open等接口,调用库函数,触发swi软件异常,进入内核,最终会调用到驱动程序的open、read、write等等。

二.Windows系统

我们将usb设备插入到window操作系统,我们打开设备管理器:

 右键属性 -> 详细信息 –> 属性 选择硬件 Id 查看:

可以得到插的usb摄像头VID=0x0c45、PID=0x6340。

此外我这usb摄像头还自带麦克风,因此也可以在设备管理器中看到:

window下camera设备测试,使用电脑微信打开视频功能,查看usbcamera是否正常。

三.配置UVC

驱动配置:

Device Drivers -->--- Multimedia support [ ]  Filter media drivers  (取消选择)Media core support  ---><*> Video4Linux core (NEW) [*] Media Controller API (NEW)Media drivers  --->[*] Media USB Adapters(启用usb总线的媒体驱动程序,drivers/media/usb) <*> USB Video Class(UVC)(我们的摄像头支持UVC,选择这个驱动即可)[*] UVC input events device  supports(NEW)<> GSPCA based webcams --> (GSPCA 是一个法国程序员在业余时间制作的一个万能USB 摄像头驱动程序,在此可以选择对应类型USB摄像头的支持)<> SONIX Bayer USB Camer Driver (NEW)<> OV772x/OV965x/... 系列摄像头支持<> ....

usb插上camera后的打印:

[  347.559618] usb 1-1: new high-speed USB device number 2 using ehci-pci
[  347.926071] usb 1-1: New USB device found, idVendor=0c45, idProduct=6340
[  347.926074] usb 1-1: New USB device strings: Mfr=2, Product=1, SerialNumber=0
[  347.926076] usb 1-1: Product: USB 2.0 Camera
[  347.926077] usb 1-1: Manufacturer: Sonix Technology Co., Ltd.
[  347.981873] media: Linux media interface: v0.10
[  347.986155] Linux video capture interface: v2.00
[  348.130562] usb 1-1: 3:1: cannot get freq at ep 0x84
[  349.190706] usbcore: registered new interface driver snd-usb-audio
[  349.194058] uvcvideo: Found UVC 1.00 device USB 2.0 Camera (0c45:6340)
[  349.217865] input: USB 2.0 Camera: USB Camera as /devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/input/input6
[  349.218030] usbcore: registered new interface driver uvcvideo
[  349.218030] USB Video Class driver (1.1.1)
[  349.270678] usb 1-1: 3:1: cannot get freq at ep 0x84
[  349.374801] usb 1-1: 3:1: cannot get freq at ep 0x84
[  349.389464] retire_capture_urb: 12 callbacks suppressed

 从输出信息可以看到:

usb主机控制器ehci识别到了我们的usb设备,并且为usb设备分配了一个地址为2,同时可以看到我们这是一个高速usb设备,即我们的usb设备采用usb 2.0通信协议。

此外内核根据识别的usb设备信息,进行设备驱动匹配,匹配成功后,注册usb接口驱动snd-usb-audio(声卡驱动)、uvcvideo(usb摄像头驱动);

注册事件类输入设备节点/dev/input/event6,用于usb设备数据的上报;

此外,从输出信息中我们也可以得知usb设备的VID=0x0c45、PID=0x6340。

四.UVC驱动分析

UVC驱动路径:\kernel-5.10\drivers\media\usb\uvc

Kconfig   uvc_ctrl.c     uvc_driver.c  uvc_isight.c    uvc_queue.c   uvc_v4l2.c   uvcvideo.h
Makefile  uvc_debugfs.c  uvc_entity.c  uvc_metadata.c  uvc_status.c  uvc_video.c

uvc_driver.c文件是UVC驱动模块的入口文件,我们定位到模块的入口和出口函数:

static int __init uvc_init(void)
{int ret;uvc_debugfs_init();ret = usb_register(&uvc_driver.driver);if (ret < 0) {uvc_debugfs_cleanup();return ret;}printk(KERN_INFO DRIVER_DESC " (" DRIVER_VERSION ")\n");return 0;
}static void __exit uvc_cleanup(void)
{usb_deregister(&uvc_driver.driver);uvc_debugfs_cleanup();
}module_init(uvc_init);
module_exit(uvc_cleanup);

由于UVC属于usb设备,所以在uvc_init函数,通过usb_register进行了usb接口驱动uvc_driver.driver的注册。

struct uvc_driver uvc_driver = {.driver = {.name		= "uvcvideo",.probe		= uvc_probe,.disconnect	= uvc_disconnect,.suspend	= uvc_suspend,.resume		= uvc_resume,.reset_resume	= uvc_reset_resume,.id_table	= uvc_ids,.supports_autosuspend = 1,},
};

当在系统中insmod装载该驱动程序时,会在入口函数直接注册usb_drvier结构体,通过比较usb设备提供的信息,和id_table比较,若匹配,则表明驱动支持该usb。uvc_ids里面可以填充某个厂家特定的设备,也可以填充通用的设备,如下所示:

static const struct usb_device_id uvc_ids[] = {/* LogiLink Wireless Webcam */{ .match_flags          = USB_DEVICE_ID_MATCH_DEVICE| USB_DEVICE_ID_MATCH_INT_INFO,.idVendor             = 0x0416,.idProduct            = 0xa91a,.bInterfaceClass      = USB_CLASS_VIDEO,.bInterfaceSubClass   = 1,.bInterfaceProtocol   = 0,.driver_info          = (kernel_ulong_t)&uvc_quirk_probe_minmax },/* Genius eFace 2025 */{ .match_flags          = USB_DEVICE_ID_MATCH_DEVICE| USB_DEVICE_ID_MATCH_INT_INFO,.idVendor             = 0x0458,.idProduct            = 0x706e,.bInterfaceClass      = USB_CLASS_VIDEO,.bInterfaceSubClass   = 1,.bInterfaceProtocol   = 0,.driver_info          = (kernel_ulong_t)&uvc_quirk_probe_minmax },/* Microsoft Lifecam NX-6000 */{ .match_flags          = USB_DEVICE_ID_MATCH_DEVICE| USB_DEVICE_ID_MATCH_INT_INFO,.idVendor             = 0x045e,.idProduct            = 0x00f8,.bInterfaceClass      = USB_CLASS_VIDEO,.bInterfaceSubClass   = 1,.bInterfaceProtocol   = 0,.driver_info          = (kernel_ulong_t)&uvc_quirk_probe_minmax },{}
}

这里只是列举一部分uvc_ids。

假设我们接入一个usb摄像头,而这个usb摄像头的信息在uvc_ids中,驱动usb_driver.probe函数将会被调用。

待更新。。。。。。。

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

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

相关文章

详解ApplicationRunner和CommandLineRunner

一、前言 springBoot框架项目&#xff0c;有时候有预加载数据需求——提前加载到缓存中或类的属性中&#xff0c;并且希望执行操作的时间是在容器启动末尾时间执行操作。比如笔者工作中遇到了一个预加载redis中的缓存数据&#xff0c;加载为java对象。针对这种场景&#xff0c…

调试解析直播弹幕消息protobuf内容,一步一步教你debug查看PushFrame和Response解码在哪里

我们知道直播间的弹幕消息是通过websocket传输的&#xff0c;而且传输的并不是明文数据&#xff0c;而是protobuf消息&#xff0c;至于为什么使用这个protobuf消息&#xff0c;因为它是二进制传输&#xff0c;更快更稳&#xff0c;相对于直播这种实时性比较高的要求&#xff0c…

spring-boot-starter-data-redis是否支持reactive响应式编程

开源项目SDK&#xff1a;https://github.com/mingyang66/spring-parent 个人文档&#xff1a;https://mingyang66.github.io/raccoon-docs/#/ spring-boot-starter-data-redis&#xff1a; 使用传统的基于阻塞的I/O编程模型&#xff0c;这意味着当你调用Redis操作时&#xff0…

【24考研·交通】我的考研经历

文章目录 一、考前准备二、政治备考三、英语一备考四、数学一备考五、运筹学备考六、复试/调剂七、结语 距离24考研上考场过去快半年了&#xff0c;距离我拟录取也两个月多了&#xff0c;现在回想起来&#xff0c;最大的感受是&#xff1a;好像做了一场大梦。 其实这篇文章在考…

PLL输出频率之间为什么会相互影响

这个问题触及了PLL&#xff08;锁相环&#xff09;设计的核心挑战之一。让我们逐步分析这个问题&#xff1a; PLL的基本结构&#xff1a; PLL通常包含一个压控振荡器&#xff08;VCO&#xff09;、分频器、鉴相器和环路滤波器。VCO产生一个高频时钟&#xff0c;然后通过不同的分…

Java异常处理详解【高级篇】

Java异常处理详解【高级篇】 Java异常处理详解【高级篇】1. 自定义异常类2. 异常处理最佳实践3. 异常链与异常传播4. 异常处理与并发编程5. 资源管理与异常6. 异常处理框架Java异常处理详解【高级篇】 异常处理在Java编程中扮演着至关重要的角色,特别是在大型应用程序或系统开…

SQL-DDL操作

数据库操作 登录MySQL PS D:\WorkSpace\MachineLearning\DL_learning> mysql -u root -p Enter password: ****** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 8.0.37 MySQL Community Server - GPLCopy…

61、Flink 的 Histogram 累加器代码示例

1、概述 Histogram 是 key-value 累加器。 2、代码示例 import org.apache.flink.api.common.JobExecutionResult; import org.apache.flink.api.common.accumulators.Histogram; import org.apache.flink.configuration.Configuration; import org.apache.flink.streaming.…

Profibus协议转profinet协议网关模块连接电机保护器与PLC通讯

一、背景 工业通讯中常见的协议有&#xff1a;Modbus协议&#xff0c;ModbusTCP协议&#xff0c;Profinet协议&#xff0c;Profibus协议&#xff0c;Profibus DP协议&#xff0c;EtherCAT协议&#xff0c;EtherNET协议等在现代工业控制系统中具有重要的角色。而Profibus协议转…

Horror病毒原理和解析【附靶场+网安学习视频】

Windows XP Horror Edition&#xff1a;这是一种伪装成Windows XP更新的应用程序&#xff0c;实际上会安装恶意软件。一旦运行&#xff0c;它会显示一个假更新&#xff0c;完成后屏幕会显示各种恐怖效果和文字。这个程序会更改桌面背景、图标和系统设置&#xff0c;甚至尝试重写…

不能创建第三个变量,实现两个数的交换

目录 常规实现两个数的交换&#xff08;如&#xff1a;交换变量a和变量b&#xff09; 方法一&#xff1a;加减法 方法二&#xff1a;异或操作符 常规实现两个数的交换&#xff08;如&#xff1a;交换变量a和变量b&#xff09; 创建一个临时变量tmp&#xff0c;先将其中一个…

matlab 计算导数

边界提取 一、算法原理1、主要函数2、参考文献二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、主要函数 Y = diff(X)计算沿大小不等于 1 的第一个数组维度的 X X…

STM32——使用TIM输出比较产生PWM波形控制舵机转角

一、输出比较简介&#xff1a; 只有高级定时器和通用寄存器才有输入捕获/输出比较电路&#xff0c;他们有四个CCR&#xff08;捕获/比较寄存器&#xff09;&#xff0c;共用一个CNT&#xff08;计数器&#xff09;&#xff0c;而输出比较功能是用来输出PWM波形的。 红圈部分…

python内网上传下载工具

python内网上传下载工具 利用python的nicegui写了一个内网下载工具&#xff0c;支持上传和下载。 这样的工具很多&#xff0c;但是利用这个模块可以用很少的代码做一个比较好看的页面。 上传的文件会存在当前目录下生成一个upload文件夹中&#xff1b;下载则是读取upload文件夹…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷9(公有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

Stable Diffusion【真人模型】:人像光影摄影极限写实真实感大模型

大家好&#xff0c;我是极客菌 今天和大家分享一个基于SD1.5的真人大模型&#xff1a;人像光影摄影极限写实真实感大模型。 该模型具有以下特点&#xff1a; 真实肤感&#xff08;在面部肌理和皮肤肌理上均有加强学习&#xff0c;拒绝ai出图假的问题&#xff09; 永不脱妆&a…

5年工作经验面试经验以及面试题分享

第一家面试题 评价 全是八股文 面试题 MySQL索引类型 索引结构 联合索引可以设置索引类型 不同索引性能差异巨大 基础索引有哪些 B Tree索引和Hash索引 Redis基本数据结构 List是原子的吗 原子性和可见性区别是什么 MySQL的存储过程和视图 MySQL性能优化有哪些 MySQL的存储…

数据结构7---图

一、定义 对于图的定义&#xff0c;我们需要明确几个注意的地方:一线性表中我们把数据元素叫元素&#xff0c;树中叫结点&#xff0c;在途中数据元素我们则称之为顶点(Vertex)。 对于图的定义&#xff0c;我们需要明确几个注意的地方: 线性表中我们把数据元素叫元素&#xf…

使用shell脚本编写监控系统资源(CPU,内存,磁盘)使用情况

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月20日16点30分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— 1.本章目标 2.编写脚本 1.获取内…

Java异常处理详解【入门篇】

Java异常处理详解【入门篇】 Java异常处理详解1. 异常的概念2. 异常的分类2.1 检查异常&#xff08;Checked Exception&#xff09;2.2 非检查异常&#xff08;Unchecked Exception&#xff09;2.3 错误&#xff08;Error&#xff09; 3. 异常处理机制3.1 try-catch3.2 finally…