USB HID Learning Record
版本：v0.6
Crifan Li
摘要
本文主要介绍了USB HID的基本知识，以及举例说明如何解析HID Report
本文提供多种格式供：

HTML版本的在线地址为：
http://​www.crifan.com/​files/​doc/​docbook/​usb_​hid/​release/​html/​usb_​hid.html
有任何意见，建议，提交bug等，都欢迎去讨论组发帖讨论：
http://​www.crifan.com/​bbs/​categories/​usb_​hid/
在线阅读	HTML  1	HTMLs  2	PDF  3	CHM  4	TXT  5	RTF  6	WEBHELP  7	
下载（7zip压缩包）	HTML  8	HTMLs  9	PDF  10	CHM  11	TXT  12	RTF  13	WEBHELP  14	
修订历史	
修订 0.4	2011-06-16	crl	
· 	写好了USB HID基本内容
· 		
修订 0.6	2013-09-05	crl	
· 	通过Docbook发布
· 	更新了所有xml:id
· 		
USB HID Learning Record:
Crifan Li
版本：v0.6
出版日期 2013-09-05
版权 © 2012 Crifan, http://​crifan.com

本文章遵从：署名-非商业性使用 2.5 中国大陆(CC BY-NC 2.5)15

目录
1. USB HID基础知识  	 # 

1.1. USB HID Structure  	 # 
1.2. HID descriptor  	 # 

1.2.1. HID Class Structure  	 # 
1.2.2. Short Items  	 # 
1.2.3. Long Items  	 # 
1.2.4. Main Items  	 # 
1.2.5. Global Items  	 # 
1.2.6. Local Items  	 # 
1.3. Usage Page Summary  	 # 
2. HID Report Example  	 # 

2.1. Normal examples  	 # 

2.1.1. Generic mouse  	 # 
2.1.2. Keyboard  	 # 
2.2. An HID Report Example analysis  	 # 

插图清单
1.1. USB HID Structure  	 # 
1.2. HID descriptor  	 # 
1.3. HID Class Structure  	 # 
1.4. HID Short Items  	 # 
1.5. HID Long Items  	 # 
1.6. HID Main Items  	 # 
1.7. HID Global Items  	 # 
1.8. HID Local Items  	 # 
1.9. HID Usage page summary  	 # 
2.1. HID Report Example - 3 button mouse  	 # 
2.2. HID Report Example - keyboard - 1/2  	 # 
2.3. HID Report Example - keyboard - 2/2  	 # 
2.4. HID Data Format  	 # 

第 1 章 USB HID基础知识

1.1. USB HID Structure

图 1.1. USB HID Structure

1.2. HID descriptor

图 1.2. HID descriptor

1.2.1. HID Class Structure

图 1.3. HID Class Structure

1.2.2. Short Items

图 1.4. HID Short Items

1.2.3. Long Items

图 1.5. HID Long Items

1.2.4. Main Items

图 1.6. HID Main Items

1.2.5. Global Items

图 1.7. HID Global Items

1.2.6. Local Items

图 1.8. HID Local Items

1.3. Usage Page Summary

图 1.9. HID Usage page summary

第 2 章 HID Report Example

2.1. Normal examples

2.1.1. Generic mouse
3-button mouse:

图 2.1. HID Report Example - 3 button mouse

Note: above data’s format is:
05 01 = 0x 01 05
09 02 = 0x 02 09

2.1.2. Keyboard

图 2.2. HID Report Example - keyboard - 1/2

图 2.3. HID Report Example - keyboard - 2/2

2.2. An HID Report Example analysis
Follow is the example.
According to the format, defined in specification:

图 2.4. HID Data Format

Now to analysis the corresponding meaning for every group bytes:
Data send by LSB
The data is send by LSB, so when “0x45, 0xFF’ is sent, first send is “0x45”, second send “0xFF”, the LSB is “0x45” located in low address, the MSB “0xFF” located in high address, so the hex value is ”0xFF45“

 0x06, 0x45, 0xFF,
 0x0A, 0x00, 0xA0,
 0xA1, 0x01,
 0x75, 0x08,
 0x96, 0x07, 0x01,
 0x15, 0x00,
 0x26, 0xFF, 0x00,
 0x0A, 0x01, 0xA0,
 0x91, 0x02,
 0x75, 0x08,
 0x95, 0x08,
 0x0A, 0x02, 0xA0,
 0x81, 0x02,
 0xC0

[Data]	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0x06	
0xFF	0x45	0000	01	10	0000 0110	
0xFF45 -> 0xFF00 -0xFFFF = Vendor defined	Usage Page	Global item	2 bytes	 	

here Usage=0xA000 is just self defined, just need not confict with self’s others, no other special meaning
[Data]	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0x0A	
0xA0	0x00	0000	10	10	0000 1010	
Usage=0xA000	Usage	Local item	2 bytes	 	

 	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0xA1	
 	0x01	1010	00	01	1010 0001	
 	Application (mouse, keyboard)	Collection	Main item	1 bytes	 	

 	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0x75	
 	0x08	0111	01	01	0111 0101	
 	Report Size = 0x08 bits	Report Size	Global item	1 bytes	 	

[Data]	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0x96	
0x01	0x07	1001	01	10	1001 0110	
Report Count = 0x0107=263	Report Count	Global item	2 bytes	 	

 	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0x15	
 	0x00	0001	01	01	0001 0101	
 	Logical Minimum = 0x00	Logical Minimum	Global item	1 bytes	 	

[Data]	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0x26	
0x00	0xFF	0010	01	10	0010 0110	
Logical Maximum =x00FF=255	Logical Maximum	Global item	2 bytes	 	

here Usage=0xA001 is just self defined, just need not confict with self’s others, no other special meaning
[Data]	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0x0A	
0xA0	0x01	0000	10	10	0000 1010	
Usage = 0xA001	Usage	Local item	2 bytes	 	

 	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0x91	
 	0x02	1001	00	01	1001 0001	
 	0x02=0000 0010
Bit 1 {  Variable (1)} 
All other bits are Reserved (0)
	Output	Main item	1 bytes	 	

 	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0x75	
 	0x08	0111	01	01	0111 0101	
 	Report Size = 0x08 bits	Report Size	Global item	1 bytes	 	

 	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0x95	
 	0x08	1001	01	01	1001 0101	
 	Report Count= 0x08 = 8	Report Count	Global item	1 bytes	 	

[Data]	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0x0A	
0xA0	0x02	0000	10	10	0000 1010	
Usage = 0xA002	Usage	Local item	2 bytes	 	

 	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0x81	
 	0x02	1000	00	01	1000 0001	
 	0x02=0000 0010
Bit 1 {  Variable (1)} 
All other bits are Reserved (0)
	Input	Main item	1 bytes	 	

 	[Data]	bTag=7:4	bType=3:2	bSize=1:0	0xC0	
 	 	1100	00	00	1100 0000	
Closes an item collection	End Collection	Main item	0 bytes	 	
After analyze following data, the summary is:
Usage Page (0xFF45)	=Vendor-Specific	0xFF45 06	Global	
Usage (0xA000)	 	0xA000 0A	Local	
Collection (Application)	 	0x01 A1	Main	
 	Report Size (8)	0x08 75	Global	
 	Report Count (263)	0x0107 96	Global	
 	Logical Minimum (0)	0x00 15	Global	
 	Logical Maximum (255)	0x00FF 26	Global	
 	Usage (0xA001)	0xA0001 0A	Local	
 	Output (Variable)	0x02 91	Main	
 	Report Size (8)	0x08 75	Global	
 	Report Count (8)	0x08 95	Global	
 	Usage (0xA002)	0xA002 0A	Local	
 	Input (Variable)	0x02 81	Main	
End Collection	 	0xC0	Main	
Report (Usage=0xA0000)	 	
 	Output Report (Usage=0xA001)	
263 bytes	Byte 0	
 	Byte 1	
 	...	
 	...	
 	Byte 261	
 	Byte 262	
 	 	
 	Input Report (Usage=0xA002)	
8 bytes	Byte 0	
 	Byte 1	
 	...	
 	Byte 7	
 	 	
All of above means:
· 	This is a vendor-specific HID device
· 	input or output is relative to Host side:Output = Host ⇒ Device = host send 263 bytes to device
Input = Host ⇐ Device = device send 8 bytes to host
Every bytes value range is 0~255
·