芯片:STM32F407VE
编译器:KEIL5
作者:SY
日期:2017-7-21 15:19:46
报告描述符是HID
设备使用的描述符,主机通过解析从机上传的报告描述符,才能知道从机上传的报告代表什么含义。从机主要上传2份数据,一个是报告描述符,一个是报告。
一般使用键值对的方式表示:Usage(Usage Page:Usage ID)
使用HID Descriptor Tool
我们可以快速制作HID
报告描述符,
举个例子:0x05, 0x01, // USAGE_PAGE (Generic Desktop)
分两部分解析:
0x05
,主要使用手册Device Class Definition for Human Interface Devices (HID)
翻到p24 5.3 Generic Item Format
,将一个字节分为三部分:
7-4
:bTag
,参考p45
3-2
:pType
,参考p36
值 | 含义 |
---|---|
0 | Main |
1 | Global |
2 | Local |
3 | Reserved |
1-0
:bSize
值 | 含义 |
---|---|
0 | 0 bytes |
1 | 1 bytes |
2 | 2 bytes |
3 | 4 bytes |
那么05h == 0000 0101
就表示Usage Page
Global
1Bytes
数据,1Bytes
表示后面跟着的数据部分为1个字节。
0x01
,参考Universal Serial Bus HID Usage Table.pdf
的p14
,表示General Desktop Control
使用HID Descriptor Tool
产生如下鼠标报告:
char ReportDescriptor[52] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x02, // USAGE (Mouse)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x03, // USAGE_MAXIMUM (Button 3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x03, // REPORT_COUNT (3)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x09, 0x38, // USAGE (Wheel)
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x03, // REPORT_COUNT (3)
0x81, 0x06, // INPUT (Data,Var,Rel)
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};
含义很明确:
先定义鼠标的3
个按键,解释他的数值范围。再定义鼠标的移动坐标和滚轮。这样,主机拿到这个报告一一解析出来就知道报告的含义了。
Device Class Definition for Human Interface Devices (HID)
Universal Serial Bus HID Usage Table.pdf
[HID Descriptor Tool](http://www.usb.org/developers/hidpage#HID Descriptor Tool)
Language Identifiers (LANGIDs)
usb ids