HID报文讲解
1 什么是HID?
HID全称Human Interface Device,人机接口设备,具体指键盘鼠标,蓝牙和USB都采用相同的报文协议,https://www.usb.org/sites/default/files/documents/hid1_11.pdf 协议里有详细描述。
2 什么是HID报文?
HID报文全称为HID Report Description,是一段用指令和数值来描述通信数据结构的数据组,定义了由设备发给PC或手机的数据包里的数据所表示的意思,比如哪个数据是按键,这个是什么按键。
3 报文结构
Collection的意思是集合,如上图,一个Application集用于表示一个虚拟设备,可以包含多个集合和多个报文,一个集合可以包含多个报文,报文描述的是发往PC或手里的数据的意义,也就是描述这个数据表示什么按键。
4 指令和数据
集合和报文是通过指令和数据来描述的,指令为一个字节,后面根据bSize跟着数据,指令结构如下:
Tag标签,Type类型,Size表示数据的个数。
Type值有:
0 = Main
1 = Global
2 = Local
3 = Reserved
根据Type值,在不同的表格里,找Tag的意义
Main类的Tag:
Global类的Tag:
Local类的Tag:
例子:0x05, 0x01
0x09, 0x06
0x05是指令,0x01表示数据
0x05分解开,Tag=0000,Type=01,Size=01
Type=01表示Global类,然后从Global表里找到Tag=0的意思是Usage,即用例,然后在《6 用途表》里找到Global的Usage表,在根据Usage表找到数据值0x01的意思为:Generic Desktop Controls
所以,0x05, 0x01的意思是这是一个普通桌面控制器。
0x09是指令,0x06表示数据
0x09分解开,Tag=0000,Type=10,Size=01
Type=10表示Local类,然后从Local表里找到Tag=0的意思是Usage,即用例然后在《6 用途表》里,去找上面Global指定的子表Generic Desktop表,找到数据值0x06的意思为:Keyboard
所以,0x09, 0x06的意思是这是一个键盘。
通过上面的例子可以知道,Global即父类,Local为子类,先定义父类表包含了各子类表的名称,子类表包含了具体的意思。
5 用途表
https://www.usb.org/sites/default/files/hut1_21_0.pdf
6 简单例子
这是一个只有一个按键的例子:
static uint8_t report_map_data[] =
{
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection (Application)
0x