HID类GamePad和兼容HID设备报表描述符
1.12版本规范的GamePad参考报表描述符,报表格式如下图。
用CH582模拟GamePad,在电脑上显示的HID接口↓
报表描述符↓,其他描述符可以直接参考JoyStick相关一文,改一下HID类描述符中的一个长度值即可,见文章最后。
const uint8_t GamePadRepDesc[] = { //HID1.12规范,该报表适用于类似街机游戏机上有1个摇杆+6个按键的设备 0x05, 0x01, //UsagePage(Generic Desktop) UsagePage定义数据的用法或功能 0x09, 0x05, //Usage(Game Pad) Usage描述项目 0xA1, 0x01, //Collection(Application) Collection:包含有共同用途或者执行单一功能的项目。 0x09, 0x01, //Usage (Pointer) 定义指针(摇杆) 0xA1, 0x00, //Collection(Physical) 物理按键集合 0x09, 0x30, //Usage (X) X方向 0x09, 0x31, //Usage (Y) Y方向 0x15, 0xFF, //Logical Minimum (-1) 报表项目的最小数值 0x25, 0x01, //Logical Maximum (1) 报表项目的最大数值 0x75, 0x02, //Report Size (2) 项目字段的大小 0x95, 0x02, //Report Count (2) 项目的数据域位的数目 0x81, 0x02, //Input (Data,Variable,Absolute,No Null) 0x02的各位含义详见卷标 0xC0, //End Collection 关闭集合 0x75, 0x04, //Report Size (4) 项目字段的大小 4-bit pad 0x95, 0x01, //Report Count (1) 项目的数据域位的数目 0x81, 0x03, //Input (Constant, Variable, Absolute) 0x03的各位含义详见卷标 0x05, 0x09, //Usage Page (Buttons) 定义按键 0x19, 0x01, //Usage Minimum (Button 1) 定义1~6号六个按键 0x29, 0x06, //Usage Maximum (Button 6) 0x15, 0x00, //Logical Minimum (0) 报表项目的最小数值 0x25, 0x01, //Logical Maximum (1) 报表项目的最大数值 0x95, 0x06, //Report Count (6) 6个数据段 0x75, 0x01, //Report Size (1) 每个数据段占1位 0x81, 0x02, //Input (Data, Variable, Absolute) 0x02的各位含义详见卷标 0x95, 0x02, //Report Count (2) 回传2个数据 Size沿用上一个 2-bit pad 0x81, 0x03, //Input (Constant, Variable, Absolute) 0x03的各位含义详见卷标 0xC0 //End Collection 关闭集合 };
HID兼容设备也是HID中的一种设备。之所以“兼容”,是因为其支持双向传输,基本不做报表格式的限制,但数据中各字节各位的内容,就需要上层软件作区分。
下列描述符能够实现64字节的双向传输,无固定格式,在电脑上显示如图的HID接口↓
设备描述符略,具体含义见JoyStick相关一文,配置描述符↓
const uint8_t MyCfgDescr[] = { 0x09,0x02,0x29,0x00,0x01,0x01,0x04,0xA0,0x23, //配置描述符 0x09,0x04,0x00,0x00,0x02,0x03,0x00,0x00,0x05, //接口描述符 0x09,0x21,0x00,0x01,0x00,0x01,0x22,0x18,0x00, //HID类描述符 0x07,0x05,0x81,0x03,0x40,0x00,0x01, //端点描述符 0x07,0x05,0x01,0x03,0x40,0x00,0x01 //端点描述符 }; const uint8_t HIDDescr[] = { //HID1.0版本协议,双向传输HID兼容设备 0x06, 0x00, 0xFF, //UsagePage(Vendor-defined) 厂商自定义用法或功能(在UsagePage使用了“厂商自定义”之后,以下的Usage都为厂商自定义,这里我都写0xFF了,厂商能够自行区分就好。在使用了标准的UsagePage后,Usage才需要继续查表格去得到标准值) 0x09, 0xFF, //Usage 自定义 0xA1, 0xFF, //Collection(Vendor-defined) 厂商自定义集合 0x09, 0xFF, //Usage 自定义 0x15, 0x00, //Logical Minimun(0) 报表项目的最小数值 0x25, 0xFF, //Logical Maximun(255) 报表内容最大数值 0x75, 0x08, //Report Size(8) 每个数据段占8位 0x95, 0x40, //Report Counet(64) 64个数据段 双向64字节数据的IN方向传输 0x81, 0x02, //Input(Data,Variable,Absolute) 0x02各项含义详见卷标 0x09, 0xFF, //Usage 自定义 0x91, 0x02, //Output(Data,Variable,Absolute) 0x02各项含义详见卷标 0xC0 //End Collection 关闭集合 };
小贴士:HID类描述符中有代码是相关报表描述符总长度的↓
0xXX(低8位), 0xXX(高8位), //wDescriptorLength 报表描述符总长度
如果报表描述符不长,也可以将其写在类描述符的前面,用sizeof来获取长度,直接放到低8位的字节内。若报表描述符较长,就需要另行自定义函数去判断长度,再放进共计16位的数据中。