草庐IT

USB 的UVC协议分析

易水寒陈 2023-04-11 原文

UVC(USB Video Class)是USB的一种协议,可以直接传输视频。之前在STM32和GD32上做过UVC的驱动,先大致介绍下

  1. USB的枚举
    USB枚举过程主要分为:
    1)USB主机检测到USB设备插入后,就会先对设备复位。
    2)USB设备在总线复位后其地址为0,这样主机就可以通过地址0和那些刚插入的设备通信。USB主机往地址为0的设备的端点0发送获取设备描述符的请求(控制传输的建立过程)。设备收到该请求后,会按照主机请求的参数,在数据过程将设备描述符返回给主机。
    3)主机在成功获取到一个数据包的设备描述符并确认没有错误后,就返回一个0长度的确认数据包(状态过程)给设备,从而进入到接下来的设置地址阶段。
    4)第一次主机只会读取一个数据包的设备描述符。标准的设备描述符有18字节,有些USB设备的端点0大小不足18字节(但至少具有8字节),在这种情况下,USB主机也是只发送一次数据输入请求,多余的数据将不会再次请求。因此当设备端点0大小不足18字节时,就需要注意到这个问题。也就是说在第一次获取设备描述符时,只需要返回一次数据即可,不要再等主机继续获取剩余数据(如果还有),因为主机不会这么做。当主机成功获取到设备描述符的前8字节之后(USB协议端点0最大包长至少8字节),它就知道端点0的最大包长度了,因为端点0最大包长度刚好再设备描述符的第八字节处。
    5)主机对设备又一次复位。这时就进入到了设置地址阶段。
    6) USB主机往地址为0的设备端点0发送一个设置地址的请求(控制传输的建立阶段),新的设备地址包含在建立过程的数据包中。具体的地址由USB主机负责管理,主机会分配一个唯一的地址给刚接入的设备。USB设备在收到这个建立过程之后,就直接进入状态过程,因为这个控制传输没有数据过程。设备等待主机请求状态返回(一个输入令牌包),收到输入令牌包后,设备就返回0长度的状态数据包。如果主机确认该状态包已经正确收到,就会发送应答包ACK给设备,设备在收到这个ACK之后,就要启用新的设备地址了。这样设备就分配到了唯一的设备地址,以后主机就通过它来访问该设备。
    7)主机再次获取设备描述符。 这次能第一次有些不一样,首先是主机不再使用地址0来访问呢设备,而是使用新的设备地址;另外,这次需要获取全部的18字节的设备描述符。如果你的端点0最大包长小于18字节,那就会有多次请求数据输入(即发送多个IN令牌包)。
    主机获取配置描述符。 配置描述符共9字节。主机获取到配置描述符后,根据配置描述符中所描述的配置集合总长度,获取配置集合。获取配置描述符和获取配置描述符请求是差不多的,只是指定的长度不一样。有些主机干脆不单独获取配置描述符,而是直接使用最大长度来获取配置描述符集合,因为设备实际返回的数据可以少于指定的字节数。配置描述符集合包括配置描述符、接口描述符、类特殊描述符(如果有)、端点描述符等。接口描述符、类特殊描述符、端点描述符是不能单独获取的,必须跟随配置描述符以一个集合的方式一并返回。
    流程图图1-1所示


图1-1

2.UVC的枚举分析
首先看标准请求的格式,如图2-1

图2-1
以T30为例,先看BUSHOND对枚举的数据抓取,如图2-2

图2-2
先看枚举阶段一
1) CTL 80 06 00 01 00 00 12 00 (获取描述符)
CTL 是“USB control transfer”,控制传输,是双向传输方式。UVC设备插入PC后,PC向其端点0发送了8个字节的 数据
0x80(1000 0000b): D7-1 设备到主机 ; D6:5-00 标准请求; D4:0-0000 接受者为设备
0x06:GET_DESCRIPTOR 获取描述符请求
0x0100 :0x01 设备描述符 ;0x00 描述符ID
0x0000: 空
0x0012: 请求数据长度,设备需要上传0x12个数据
2) IN 12 01 00 02 ef 02 01 40 15 c2 15 17 00 02 01 12 03 01 (上传设备描述符)
3) CTL 80 06 00 02 00 00 09 00 (获取配置描述符)
0x80(1000 0000b): D7-1 设备到主机 ; D6:5-00 标准请求; D4:0-0000 接受者为设备
0x06:GET_DESCRIPTOR 获取描述符请求
0x0200 :0x02 配置描述符 ;0x00 描述符ID
0x0000: 空
0x0009: 请求数据长度,设备需要上传0x09个数据
4) IN 09 02 cf 00 02 01 11 80 32 (上传配置描述符)
5) CTL 80 06 00 02 00 00 cf 00 (获取配置描述符集合,包含配置+IAD+接口+端点)
6) IN 09 02 cf 00 02 01 11 80 32 09 04 00 00 00 0e 01…(上传描述符集合)
7) SET_CONFIGURATION(设置配置指令)
CTL 00 09 01 00 00 00 00 00 SET CONFIG
0x00(0000 0000b): D7-0 主机到设备,数据为OUT方向 ; D6:5-00 标准请求; D4:0-0000 接受者为设备
0x09: SET_CONFIGURATION 设置配置请求
0x0001 :0x01 配置描述符中的Configuration Value 值
0x0000: 空
0x0000: 空
8) CTL 01 0b 00 00 01 00 00 00 (设置接口指令)
0x00(0000 0001b): D7-0 设备到主机 ; D6:5-00 标准请求; D4:0-0001 接收者为接口
0x0b: SET_INTERFACE 设置接口请求
0x0000 :接口备用配置ID
0x0001: 接口ID(VS接口)
0x0000: 空

枚举阶段二

以上指令都是特定类请求
以第一条为例
CTL a1 86 00 02 00 03 01 00 GET INFO
0xa1(1010 0001b): D7-0 设备到主机,指的是主机请求获取数据 ; D6:5-01 类请求; D4:0-0001 接受者为接口
0x86: GET_INFO 获取功能或动态
0x0200 :0x02 PU_BRIGHTNESS_CONTROL ; 0x00 Zero
0x0300: 0x03 单元ID ; 0x00 接口ID(VC接口)
0x0001: 请求数据长度,设备需要上传1个数据
以上就是UVC的枚举过程
打开摄像头和关闭摄像头

UVC相机在打开时,会使用SET_INTERFACE命令,在停止播放时,也会发送SET_INTERFACE命令。
打开时,数据抓包为:
CTL 01 0b 01 00 01 00 00 00 SET INTERFACE
停播放时,数据抓包为:
CTL 01 0b 00 00 01 00 00 00 SET INTERFACE
通过SET_INTERFACE数据命令分析,可知
01 :x01表示从主机到设备,请求标准命令,接收者为接口。
0b :表示设置接口
打开时,值为 01 00,即0x0001,表示接口,转换接口=1
打开时,值为 01 00,即0x0000,表示接口,转换接口=0
01 00 :表示接口为1.
00 00 :表示数据长度为0.
通过上面可以知道,打开或停止摄像头,是通过转换接口来实现的。
在T30程序中,当打开摄像头时,程序会进入uint8_t USBD_UVC_SOF (USBD_HandleTypeDef *pdev)中,在里面将状态标志置为UVC_STATE_NEED_FRAME,然后再进入uint8_t USBD_UVC_DataIn (USBD_HandleTypeDef *pdev,uint8_t epnum)中,里面的状态标志判断为UVC_STATE_NEED_FRAME,之后就发送数据了。
4.通讯接口
通讯都是靠VC命令的控制对比度来实现,每次只能传输2个字节,需要发送多次SET和GET,以单点校正为例,如图4-1

图4-1
1)通讯命令的接收
发送的2个字节都会进入到uint8_t USBD_UVC_EP0_RxReady (USBD_HandleTypeDef *pdev)中,在USB_COM_Receive(VideoCtl,&USB_Command,&USB_instructReply)函数中进行一帧数据的完整接收,按照VIVA协议来进行。USB_Command是接收的结构体,USB_instructReply是回复的结构体。若是1帧完整接收,且CRC校验都正常,则会置位接收按成的标志位。
2)通讯命令的解析
当接收完成后,USB_CommunicationInteractive(&USB_Command,&USB_instructReply)函数进行解析, 在Data_Analysis文件中。所有的通讯命令如单点校正都在此文件中进行解析
3)通讯命令的驱动
当解析完成后,需要进行相应的命令驱动。我把所有的命令驱动都放在了CommandDrever文件中。
4)通讯命令的回复
主机会发送GET指令,程序最终会进入到void UVC_Req_GetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)中,每GET1次,传输2个字节。PtrUPloadInformation是个全局指针,指向回复的结构体地址。如图4-2和4-3所示

图4-2

图4-3

UVC的画资料不多,有个网站对这一块研究挺深的
USB中文网

有关USB 的UVC协议分析的更多相关文章

  1. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  2. ruby - HTTP POST 上的 SSL 错误(未知协议(protocol)) - 2

    尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify

  3. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  4. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

  5. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  6. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  7. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

  8. ruby-on-rails - 如何使用 ruby​​-prof 和 JMeter 分析 Rails - 2

    我想使用ruby​​-prof和JMeter分析Rails应用程序。我对分析特定Controller/操作/或模型方法的建议方法不感兴趣,我想分析完整堆栈,从上到下。所以我运行这样的东西:RAILS_ENV=productionruby-prof-fprof.outscript/server>/dev/null然后我在上面运行我的JMeter测试计划。然而,问题是使用CTRL+C或SIGKILL中断它也会在ruby​​-prof可以写入任何输出之前杀死它。如何在不中断ruby​​-prof的情况下停止mongrel服务器? 最佳答案

  9. 网络实验之RIPV2协议(一) - 2

    一、RIPV2协议简介  RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对

  10. 【Unity游戏破解】外挂原理分析 - 2

    文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat

随机推荐