USB标准请求、类特定请求总结


做USB开发,最常见的就是USB的控制请求的那8个字节的分析,如果抓包工具有协议分析那还好说,但是如果不带速协议分析,那其实还是挺郁闷的。所以说,如何快速的通过USB请求的那几个字段定位出是何请求,是可以大大的提高我们的协议分析效率的。

USB的请求这里包括USB的标准请求和特定类请求,其包括以下几个字段:

1字节1字节2字节2字节2字节
bmRequestType(1)bRequest(1)wValue(2)wIndex(2)wLength(2)

各字段的数据长度分别可见上表,其数据组成也固定。

我们提到的USB标准请求和特定类请求的概念这里有必要做一下解释:

  • USB标准请求:是USB设备支持的最基本的请求,凡是USB设备都得支持,不管你是HID设备,UVC设备或者UAC等其它设备,或者是自定义USB设备,凡是USB设备,都得支持这些请求。USB标准请求是USB设备通讯的基础,是对USB设备的最基本配置。
  • 特定类请求:一些USB设备除了支持USB标准请求外,还支持其特定类的请求。这里的特定类是其它设类型规范,如HID设备,其有HID类特定请求,这些请求只能出现在HID设备中,其它类型的设备不能用。类特定请求是基本该设备类型的协议扩展,常见的类特定请求有UVC设备的类特定请求,UAC设备的类特定请求和HID设备的类特定请求。

我们知道,不管是什么类型的USB设备,按功能划分可分为控制整个USB设备的,控制某个接口、控制某个端点的,所以不管是USB标准请求还是类特定请求,控制请求的目的地就有设备、接口、端点,也有一些自定义的,如其它。

USB设备的请求都是由主机发起,设备接受响应,所以该请求后的数据就有方向性分为IN和OUT,该方向是相对USB主机来说。

bmRequestType字段的USB标准请求(USB基本请求)

  • 凡是以0x00开头的bmRequestType,都是主机向设备发送数据。
  • 凡是以0x01开头的bmRequestType,都是主机向接口发送数据。
  • 凡是以0x02开头的bmRequestType,都是主机向端点发送数据。
  • 凡是以0x03开头的bmRequestType,都是主机向设备的其它类型发送数据,软件开发者可以自由定义。
  • 凡是以0x80开头的bmRequestType,都是设备向主机发送数据,且返回的数据来源于设备。
  • 凡是以0x81开头的bmRequestType,都是设备的接口向主机发送数据。
  • 凡是以0x82开头的bmRequestType,都是设备中某个接口的端点向主机发送数据。
  • 凡是以0x83开头的bmRequestType,这个是USB标准未规范的,可以自由定义,是其它类型向向主机发送数据

bmRequestType字段的类特定请求(HID,UVC,UAC,BOT)

类特定请求是在bmRequestType的基础上加0x20,所以是:

  • 凡是以0x20开头的bmRequestType,都是主机向设备发送数据。
  • 凡是以0x21开头的bmRequestType,都是主机向接口发送数据。
  • 凡是以0x22开头的bmRequestType,都是主机向端点发送数据。
  • 凡是以0x23开头的bmRequestType,都是主机向设备的其它类型发送数据,软件开发者可以自由定义。
  • 凡是以0xa0开头的bmRequestType,都是设备向主机发送数据,且返回的数据来源于设备。
  • 凡是以0xa1开头的bmRequestType,都是设备的接口向主机发送数据。
  • 凡是以0xa2开头的bmRequestType,都是设备中某个接口的端点向主机发送数据。
  • 凡是以0xa3开头的bmRequestType,这个是USB标准未规范的,可以自由定义,是其它类型向向主机发送数据

bmRequestType字段的厂商自定义请求(自定义,不常见)

类特定请求是在bmRequestType的基础上加0x40,所以是:

  • 凡是以0x40开头的bmRequestType,都是主机向设备发送数据。
  • 凡是以0x41开头的bmRequestType,都是主机向接口发送数据。
  • 凡是以0x42开头的bmRequestType,都是主机向端点发送数据。
  • 凡是以0x43开头的bmRequestType,都是主机向设备的其它类型发送数据,软件开发者可以自由定义。
  • 凡是以0xc0开头的bmRequestType,都是设备向主机发送数据,且返回的数据来源于设备。
  • 凡是以0xc1开头的bmRequestType,都是设备的接口向主机发送数据。
  • 凡是以0xc2开头的bmRequestType,都是设备中某个接口的端点向主机发送数据。
  • 凡是以0xc3开头的bmRequestType,这个是USB标准未规范的,可以自由定义,是其它类型向向主机发送数据

在USB请求中(包括标准请求和类特定请求)

  • 其bRequest是协议类型,如SET_DESCRIPTOR、GET_IDLE,SET_ADDRESS,GET_CUR,SET_CUR等
  • wValue 一般是类相关的,在UVC,UAC中可以是选择子,在标准请求中可以是具体的某些数据,比较详尽的内容
  • wIndex,一般高字节为USB设备类的信息类型(如ReportId类型,描述符类型,UVC/UAC规范中的UnitId,终端ID等),低字节为接口的ID、端点的ID、ReportId或描述符索引。
  • wLength:数据长度,和bmRequestType的最高位相配合使用
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
USB(Universal Serial Bus)是一种用于连接电脑和外部设备的标准接口,它有自己的通信协议。USB枚举是指在插入USB设备时,计算机系统自动检测并识别该设备的过程。 首先,当我们将USB设备插入计算机的USB端口时,计算机会发送一个复位信号给USB设备,以便设备知道计算机已经察觉到它的存在。USB设备在接收到复位信号后会执行一些初始化操作,并返回一个握手信号给计算机。 接下来,计算机会发送一个叫作Get Descriptor的命令给USB设备,这个命令的作用是要求USB设备返回一些描述该设备的信息,比如设备的厂商ID、产品ID、设备别等。USB设备收到这个命令后会返回这些信息给计算机。 然后,计算机会发送一个Set Configuration的命令给USB设备,这个命令的目的是告诉USB设备要使用哪种配置,因为有些USB设备可以有多种不同的配置。USB设备在接收到Set Configuration命令后会根据配置来进行初始化,并返回一个确认信号给计算机。 最后,计算机会发送一些其他的命令给USB设备,比如读取和写入数据的命令,以及其他特定的设备命令,这些命令的具体内容取决于USB设备的功能和应用。 通过上述的过程,USB设备和计算机建立起了通信链接,USB设备可以向计算机提供相应的功能和服务。USB枚举过程中的各个步骤确保了设备和计算机之间的正常通信和数据传输。 总结来说,USB枚举过程是计算机通过一系列的命令向USB设备发出请求USB设备根据这些请求进行相应的操作,并返回相应的结果给计算机,以实现设备和计算机之间的通信和数据传输。这个过程是USB协议中非常重要的一部分,保证了USB设备的插拔即用的特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

华佗_PCIe

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

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

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

打赏作者

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

抵扣说明:

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

余额充值