USB HID Learning Record

版本：v0.6

Crifan Li

摘要

本文主要介绍了USB HID的基本知识，以及举例说明如何解析HID Report

[提 本文提供多种格式供：
示]      在线阅读      HTML HTMLs PDF CHM TXT RTF WEBHELP
    下载（7zip压缩包） HTML HTMLs PDF CHM TXT RTF WEBHELP

    HTML版本的在线地址为：

    http://www.crifan.com/files/doc/docbook/usb_hid/release/html/usb_hid.html

    有任何意见，建议，提交bug等，都欢迎去讨论组发帖讨论：

    http://www.crifan.com/bbs/categories/usb_hid/

2013-09-05

┌─────────────────────────────────────────────────────────────────────────────┐
│修订历史                                                                     │
├────────────────────────────┬────────────────────────────────────┬───────────┤
│修订 0.4                    │2011-06-16                          │crl        │
├────────────────────────────┴────────────────────────────────────┴───────────┤
│ 1. 写好了USB HID基本内容                                                    │
├────────────────────────────┬────────────────────────────────────┬───────────┤
│修订 0.6                    │2013-09-05                          │crl        │
├────────────────────────────┴────────────────────────────────────┴───────────┤
│ 1. 通过Docbook发布                                                          │
│ 2. 更新了所有xml:id                                                         │
└─────────────────────────────────────────────────────────────────────────────┘

版权 © 2012 Crifan, http://crifan.com

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

目录

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.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

摘要

1.1. USB HID Structure

图 1.1. USB HID Structure

USB HID Structure


1.2. HID descriptor

图 1.2. HID descriptor

HID descriptor


1.2.1. HID Class Structure

图 1.3. HID Class Structure

HID Class Structure


1.2.2. Short Items

图 1.4. HID Short Items

HID Short Items


1.2.3. Long Items

图 1.5. HID Long Items

HID Long Items


1.2.4. Main Items

图 1.6. HID Main Items

HID Main Items

HID Main Items


1.2.5. Global Items

图 1.7. HID Global Items

HID Global Items

HID Global Items


1.2.6. Local Items

图 1.8. HID Local Items

HID Local Items


1.3. Usage Page Summary

图 1.9. HID Usage page summary

HID Usage page summary

HID 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

摘要

2.1. Normal examples

2.1.1. Generic mouse

3-button mouse:

图 2.1. HID Report Example - 3 button mouse

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

HID Report Example - keyboard - 1/2


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

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

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,1
        0x0A, 0x00, 0xA0,2
        0xA1, 0x01,3
        0x75, 0x08,4
        0x96, 0x07, 0x01,5
        0x15, 0x00,6
        0x26, 0xFF, 0x00,7
        0x0A, 0x01, 0xA0,8
        0x91, 0x02,9
        0x75, 0x08,10
        0x95, 0x08,11
        0x0A, 0x02, 0xA0,12
        0x81, 0x02,13
        0xC014


1          [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    

2     [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          

    here Usage=0xA000 is just self defined, just need not confict with self's
    others, no other special meaning

3                   [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      

4                [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      

5       [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      

6               [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      

7       [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     

8     [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          

    here Usage=0xA001 is just self defined, just need not confict with self's
    others, no other special meaning

9                    [Data]                 bTag=7:4   bType=3:2   bSize=1:0     0x91
      0x02                                  1001      00          01          1001 0001
      0x02=0000 0010

      Bit 1 { Variable (1)}                 Output    Main item   1 bytes      

      All other bits are Reserved (0)

10               [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      

11               [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      

12    [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          

13                   [Data]                 bTag=7:4   bType=3:2   bSize=1:0     0x81
      0x02                                  1000      00          01          1000 0001
      0x02=0000 0010

      Bit 1 { Variable (1)}                 Input     Main item   1 bytes      

      All other bits are Reserved (0)

14                [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:

 1. This is a vendor-specific HID device
 2. 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
 3. Every bytes value range is 0~255

