1. 概述
HID 是 USB 的一个分支,支持标准 USB 请求(Standard Request) 和 HID 相关的特定类请求(Class-Specific Request)。
2. 标准请求
USB 标准请求结构如下,分为5部分:
- 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:
- wValue 和 wIndex :
不同类型请求对于其接收者,这两个字段含义有所差别。
描述符类型:
wIndex 不同含义
当表示是一个端点请求时:
- 高位表示方向
- 低4位表示端点地址
当表示为一个接口时,表示一个接口号。
- wLength:传输的数据长度。
2.1 Get_Descriptor Request
对于 一个标准的 USB 描述符请求,bmRequestType D4~D0, 表示接收者是一个设备,接口,端点或者其他。
wValue 的高位用来描述 描述符类型, 低位用来描述 描述符索引
2.2 Set_Descriptor Request
设置描述符 是主机用来改变设备描述符,是一个可选的请求。
3. 类请求
当bmRequestType 的 D6~D5 为01时,表示一个类请求。对于HID 描述符 由于其在接口描述符的,故bmRequestType 的D0 为1.
HID 支持的特定类请求bRequest如下:
上标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请求一般发生于设备初始化时或需要读取设备报表时。
wValue 取值范围:
- 高字节报告类型
- 01:表示输入报告(input Report)
- 02: 表示输出报告(Output Report)
- 03: 表示特性报告(Feature Report)
- 04-ff:保留
- 低字节为报告ID.
注释:Input Report 需要 中断输入端点;Output Report 可以是控制传输或者中断传输,中断输出端点可选。
3.2 SET_REPORT
SetReport请求用于主机向设备发送报告请求。其各字段定义同GET_REPORT
3.3 GET_IDLE
GetIdle用于获取HID设备空闲速率。空闲速率是指当HID设备没有数据报告时,主机限制中断输入端点的报告间隔时间。默认情况下,空闲速率为0。GetIdle是一个非必要请求。
3.4 SET_IDLE
SetIdle用于设置HID设备空闲速率。默认情况下,空闲速率为0。SetIdle是一个非必要请求。
- wValue(2):
高字节用于指定空闲速率,以4ms为单位,可选的值为4ms~1020ms,低字节为ReportId.
SetIdle由主机发输,用于向设备的中断端点设置无动作参数,该请求使中断输入管道上的特定报告不再输放到主机,直到发生新事件或经过指定的时间量再输入。
该请求使端点在其当前报告保持不变的情况下拒绝对端点中的中断,进行任何轮询。在没有变化的情况下,轮询将在给定的,基于时间的持续时间内继续 NAK。
3.5 GET_PROTOCOL
GetProtocol用于获取HID设备的协议值。对于USB引导设备,该协议是必须的;对于非引导设备,是可选的。
3.6 SET_PROTOCOL
SetProtocol用于设置ID设备的协议值。对于USB引导设备,该协议是必须的;对于非引导设备,是可选的
4. 总结
本文回顾了 USB 标准请求,并以USB 标准请求为基准介绍了 HID 类请求。所有资源来源于 usb2.0 spec 和 hid 协议规范。对hid 感兴趣的朋友可以有选择的查看。
参考文档:
- Device Class Definition for Human interface Devices (hid1_11.pdf)
- usb_20.pdf