HID 入门学习:标准请求和类请求

简介: HID 入门学习:标准请求和类请求

1. 概述


HID 是 USB 的一个分支,支持标准 USB 请求(Standard Request) 和 HID 相关的特定类请求(Class-Specific Request)。


2. 标准请求


USB 标准请求结构如下,分为5部分:


image.png


  • bmRequestType:


数据位 说明
D7 0 主机到设备(SET 请求)
D7 1 主机到设备(GET 请求)
D6~D5 00 标准请求命令(Standard)
D6~D5 01 类请求命令(Class)
D6~D5 10 厂商自定义(Vendor)
D6~D5 11 保留
D4~D0 0000 接收者为设备
D4~D0 0001 接收者为接口
D4~D0 0010 接收者为端点
D4~D0 0011 接收者为其他
D4~D0 .... 保留


  • bRequest:


image.png


  • wValue 和 wIndex :


不同类型请求对于其接收者,这两个字段含义有所差别。


image.png


描述符类型:


image.png


wIndex 不同含义


当表示是一个端点请求时:


  • 高位表示方向


  • 低4位表示端点地址


image.png


当表示为一个接口时,表示一个接口号。


  • wLength:传输的数据长度。


image.png


2.1 Get_Descriptor Request


image.png


对于 一个标准的 USB 描述符请求,bmRequestType D4~D0, 表示接收者是一个设备,接口,端点或者其他。


wValue 的高位用来描述 描述符类型, 低位用来描述 描述符索引


2.2 Set_Descriptor Request


设置描述符 是主机用来改变设备描述符,是一个可选的请求。


image.png


3. 类请求


当bmRequestType 的 D6~D5 为01时,表示一个类请求。对于HID 描述符 由于其在接口描述符的,故bmRequestType 的D0 为1.


image.png


HID 支持的特定类请求bRequest如下:


image.png


上标1表示所有设备支持,2 仅适用于boot device



bmRequestType bRequest wValue wIndex wLength 数据
0xa1 GET_IDE 高字节报告类型(01:输入;02:输出;03:特性)。低字节报告ID 接口 ID 数据长度 数据
0xa1 GET_REPORT 高字节报告类型(01:输入;02:输出;03:特性)。低字节报告ID 接口 ID 数据长度 数据
0xa1 GET_PROTOCOL 0 接口 ID 数据长度 0 表示引导协议,1表示报告协议
0x21 SET_IDE 高字节用于指定空闲速率,以4ms为单位,可选的值为4ms~1020ms,低字节为ReportId 接口 ID 数据长度 无数据
0x21 SET_REPORT 高字节报告类型(01:输入;02:输出;03:特性)。低字节报告ID 接口 ID 数据长度 数据
0x21 SET_PROTOCOL 数据为0表示引导协议,为1表示报告协议 接口 ID 数据长度 无数据


3.1 GET_REPORT


GetReport请求用于获取HID设备的报告,由主机发送GetReport请求,设备返回报表数据。GetReport请求一般发生于设备初始化时或需要读取设备报表时。


image.png


wValue 取值范围:


  • 高字节报告类型


  • 01:表示输入报告(input Report)


  • 02: 表示输出报告(Output Report)


  • 03: 表示特性报告(Feature Report)


  • 04-ff:保留


  • 低字节为报告ID.


image.png


注释:Input Report 需要 中断输入端点;Output Report 可以是控制传输或者中断传输,中断输出端点可选。


3.2 SET_REPORT


SetReport请求用于主机向设备发送报告请求。其各字段定义同GET_REPORT


image.png


3.3 GET_IDLE


GetIdle用于获取HID设备空闲速率。空闲速率是指当HID设备没有数据报告时,主机限制中断输入端点的报告间隔时间。默认情况下,空闲速率为0。GetIdle是一个非必要请求。




3.4 SET_IDLE


SetIdle用于设置HID设备空闲速率。默认情况下,空闲速率为0。SetIdle是一个非必要请求。


image.png


  • wValue(2):


高字节用于指定空闲速率,以4ms为单位,可选的值为4ms~1020ms,低字节为ReportId.


SetIdle由主机发输,用于向设备的中断端点设置无动作参数,该请求使中断输入管道上的特定报告不再输放到主机,直到发生新事件或经过指定的时间量再输入。


该请求使端点在其当前报告保持不变的情况下拒绝对端点中的中断,进行任何轮询。在没有变化的情况下,轮询将在给定的,基于时间的持续时间内继续 NAK。


3.5 GET_PROTOCOL


GetProtocol用于获取HID设备的协议值。对于USB引导设备,该协议是必须的;对于非引导设备,是可选的。


image.png


3.6 SET_PROTOCOL


SetProtocol用于设置ID设备的协议值。对于USB引导设备,该协议是必须的;对于非引导设备,是可选的


image.png


4. 总结


本文回顾了 USB 标准请求,并以USB 标准请求为基准介绍了 HID 类请求。所有资源来源于 usb2.0 spec 和 hid 协议规范。对hid 感兴趣的朋友可以有选择的查看。


参考文档:


  1. Device Class Definition for Human interface Devices (hid1_11.pdf)


  1. usb_20.pdf
相关文章
|
5月前
|
安全 API Android开发
Android网络和数据交互: 解释Retrofit库的作用。
Android网络和数据交互: 解释Retrofit库的作用。
66 0
|
5月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)(上)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
45 0
|
12月前
|
前端开发 vr&ar
【前端验证】被动响应型uvm_model环境搭建——以握手型ram_model为例
【前端验证】被动响应型uvm_model环境搭建——以握手型ram_model为例
|
5月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)(下)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
47 0
|
5月前
|
前端开发
|
5月前
|
前端开发
开发指南002-前后端信息交互规范-返回类ResponseResult
返回类有两个,一般返回类ResponseResult和分页返回类PageResult,本篇介绍ResponseResult
|
5月前
|
前端开发
|
JSON 网络安全 对象存储
python接口自动化(六)--发送get请求接口(详解)
如果想用python做接口测试,我们首先有不得不了解和学习的模块。它就是第三方模块:Requests。 虽然Python内置的urllib模块,用于访问网络资源。但是,它用起来比较麻烦,而且,缺少很多实用的高级功能。更好的方案是使用 requests。
429 1
python接口自动化(六)--发送get请求接口(详解)
|
JSON 网络安全 数据格式
python接口自动化(八)--发送post请求的接口(详解)
上篇介绍完发送get请求的接口,大家必然联想到发送post请求的接口也不会太难,被聪明的你又猜到了。答案是对的,虽然发送post请求的参考例子很简单,但是实际遇到的情况却是很复杂的,因为所有系统或者软件、网站都是从登录开 始的,进入这扇门才可以发现里边的奥秘,所以首先介绍的第一个post请求肯定是登录了,但登录是最难处理的。如果把登录问题这只拦路虎解决了,那么后面问题都迎刃而解。
467 1
python接口自动化(八)--发送post请求的接口(详解)
|
JSON jenkins 持续交付
python接口自动化(十一)--发送post【data】(详解)
前面登录博客园的是传 json 参数,由于其登录机制的改变没办法演示,然而在工作中有些登录不是传 json 的,如 jenkins 的登录,这里小编就以jenkins 登录为案例,传 data 参数,给各位童鞋详细演练一下。
227 0
python接口自动化(十一)--发送post【data】(详解)