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…

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波形的。 红圈部分…

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

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

数据结构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…

微服务 | Springboot整合GateWay+Nacos实现动态路由

1、简介 路由转发 执行过滤器链。 ​ 网关&#xff0c;旨在为微服务架构提供一种简单有效的统一的API路由管理方式。同时&#xff0c;基于Filter链的方式提供了网关的基本功能&#xff0c;比如&#xff1a;鉴权、流量控制、熔断、路径重写、黑白名单、日志监控等。 基本功能…

在python docker中安装ESL库

概述 功能需求&#xff0c;把python脚本移植到docker中。 因为python脚本中有使用freeswitch的ESL接口&#xff0c;所以需要安装python-ESL依赖库。 本文记录在python:3.10.14-slim的docker镜像上编译安装python-ESL依赖库的流程。 环境 docker engine: Version 24.0.6 d…

【ES】--Elasticsearch的翻页详解

目录 一、前言二、from+size浅分页1、from+size导致深度分页问题三、scroll深分页1、scroll原理2、scroll可以返回总计数量四、search_after深分页1、search_after避免深度分页问题一、前言 ES的分页常见的主要有三种方式:from+size浅分页、scroll深分页、search_after分页。…

基于Java微信小程序同城家政服务系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

【Sublime】Sublime Text 中运行终端

Sublime Text 本身并不是一个终端仿真器&#xff0c;可以使用插件来在 Sublime Text 中集成终端功能。最常用的插件之一是“Terminal”。 使用“Terminal”插件在 Sublime Text 中启动终端 以下是安装和使用该插件的步骤&#xff1a; 安装 Package Control&#xff1a; 如果你…

面试突击:HashMap 源码详解

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 数据结构 JDK1.8 之前 JDK1.8 之前 HashMap 采用 数组和链表 结合的数据结构。如下图&#xff1a; HashMap 将 key 的 hashCode 经过扰动函数处理过后得到 hash 值&#…

java第二十九课 —— 断点 | 零钱通项目

断点调试&#xff08;debug&#xff09; 实际需求 在开发中&#xff0c;新手程序员在查找错误时&#xff0c;这时老程序员就会温馨提示&#xff0c;可以用断点调试步一步的看源码执行的过程&#xff0c;从而发现错误所在。 重要提示&#xff1a;在断点调试过程中&#xff0c;…

Open3D(C++) 删除点云中重复的点

目录 一、算法原理1、重叠点2、主要函数二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、重叠点 原始点云克隆一份   构造重叠区域   合并点云获得重叠点 2、主要…

嫦娥六号平安回家,Smartbi非常荣幸参与中国航天项目

“小时不识月&#xff0c;呼作白玉盘。”李白的这句诗&#xff0c;承载了古人对月亮的美好想象与纯真童趣。今天&#xff0c;当我们仰望夜空&#xff0c;那轮明月不仅是诗词中的意象&#xff0c;更是科学探索的目标和梦想的寄托。 2024年6月25日14时07分&#xff0c;嫦娥六号返…