USB键盘鼠标描述符及数据格式分析

一:键盘

        1:键盘的hid描述符如下,数据的输入断点为中断方式,当有键盘敲击事件时,会上报长度为8字节的数据描述符,描述符共有8字节的输入报告和1字节的输出报告。

        0x05,0x01,// Global Generic Desktop

        0x09,0x06,// Local KeyBoard

        0xA1,0x01,// Main app collection

        0x05,0x07,// Global KeyBoard

        //第1字节

        0x19,0xe0,// Local Usage Min (KeyBoard LeftControl)

        0x29,0xe7,// Local Usage Max (KeyBoard Right GUI)

        0x15,0x00,// Global Logical Min

        0x25,0x01,// Global Logical Max

        0x95,0x08,// Global ReportCount

        0x75,0x01,// Global ReportSize

        0x81,0x02,// Main Input(Data,Var,Abs)

        //第2字节

        0x95,0x01,// Global ReportCount

        0x75,0x08,// Global ReportSize

        0x81,0x03,// Main Input(Cnst,Var,Abs)

        //第3-8字节

        0x95,0x06,// Global ReportCount

        0x75,0x08,// Global ReportSize

        0x15,0x00,// Global Logical Min

        0x26,0xff,0x00,//Global Logical Max

        0x19,0x00,// Local Usage Min

        0x29,0x65,// Local Usage Max

        0x81,0x00,// Main Output(Data,Ary,Abs)

        //1字节输出报告

        0x15,0x00,// Global Logical Min

        0x25,0x01,// Global Logical Max

        0x95,0x05,// Global ReportCount

        0x75,0x01,// Global ReportSize

        0x05,0x08,// Global LED

        0x19,0x01,// Local Usage Min

        0x29,0x05,// Local Usage Max

        0x91,0x02,// Main Output(Data,Var,Abs)

        //补足上面变成1个字节

        0x95,0x01,// Global ReportCount

        0x75,0x03,// Global ReportSize

        0x91,0x03,// Main Output(Cnst,Var,Abs)

        0xc0      // Main End collection

2:1字节的输出报告

        如果不给键盘配置OUT端点,那么键盘的1字节输出报告将由控制端点的SetReport进行传输。这1个字节总共用了5bit和3bit常量来补足1个字节。5bits用来点亮特殊键盘上的led灯,比如键盘的大小写,数字键等。

3:8字节的输入报告

        BYTE        bit7        bit6         bit5         bit4         bit3        bit2        bit1        bit0

           0           r-gui        r-alt       r-shitf       r-ctrl        l-gui       l-alt       l-shift      l-ctrl

           1          reserved

           2          keyboard page usage

           3          keyboard page usage

           4          keyboard page usage

           5          keyboard page usage

           6          keyboard page usage

           7          keyboard page usage

        BYTE0 各bit表示足有GUI(win),Alt,Shift,Ctrl键是否按下,按下为1。

        BYTE1 保留

        BYTE2-7 表示此时按下的其他所有键盘按键的键码,从低到高填充,没按就是0x00.如果同时按下的键超过允许,则显示0xff。

        keyboard page usage 定义如下:

        #define        KB_ERROR            0x01

        #define        KB_A                0x04

        #define        KB_B                0x05

        #define        KB_C                0x06

        #define        KB_D                0x07

        #define        KB_E                0x08

        #define        KB_F                0x09

        #define        KB_G                0x0A

        #define        KB_H                0x0B

        #define        KB_I                0x0C

        #define        KB_J                0x0D

        #define        KB_K                0x0E

        #define        KB_L                0x0F

        #define        KB_M                0x10

        #define        KB_N                0x11

        #define        KB_O                0x12

        #define        KB_P                0x13

        #define        KB_Q                0x14

        #define        KB_R                0x15

        #define        KB_S                0x16

        #define        KB_T                0x17

        #define        KB_U                0x18

        #define        KB_V                0x19

        #define        KB_W                0x1A

        #define        KB_X                0x1B

        #define        KB_Y                0x1C

        #define        KB_Z                0x1D

        #define        KB_1                0x1E

        #define        KB_2                0x1F

        #define        KB_3                0x20

        #define        KB_4                0x21

        #define        KB_5                0x22

        #define        KB_6                0x23

        #define        KB_7                0x24

        #define        KB_8                0x25

        #define        KB_9                0x26

        #define        KB_0                0x27

        #define        KB_ENTER            0x28

        #define        KB_ESC                0x29

        #define        KB_BACKSPACE        0x2A

        #define        KB_TAB                0x2B

        #define        KB_SPACE            0x2C

        #define        KB_MIUS                0x2D    //-_

        #define        KB_EQUAL            0x2E    //=+

        #define        KB_LSQUBRACKET        0x2F    //[{

        #define        KB_RSQUBRACKET        0x30    //]}

        #define        KB_BACKSLASH        0x31    //\|

        #define        KB_SEMICOLON        0x33    //;:

        #define        KB_APOSTROPHE        0x34    //'"

        #define        KB_TILDE            0x35    //`~

        #define        KB_COMMA            0x36    //,<

        #define        KB_FULLSTOP            0x37    //.>

        #define        KB_SLASH            0x38    ///?

        #define        KB_CAPSLOCK            0x39  

        #define        KB_F1                0x3A

        #define        KB_F2                0x3B

        #define        KB_F3                0x3C

        #define        KB_F4                0x3D

        #define        KB_F5                0x3E

        #define        KB_F6                0x3F

        #define        KB_F7                0x40

        #define        KB_F8                0x41

        #define        KB_F9                0x42

        #define        KB_F10                0x43

        #define        KB_F11                0x44

        #define        KB_F12                0x45

        #define        KB_PRTSCR            0x46

        #define        KB_SCOLLLOCK        0x47

        #define        KB_PAUSE            0x48

        #define        KB_INSERT            0x49

        #define        KB_HOME                0x4A

        #define        KB_PAGEUP            0x4B

        #define        KB_DELETE            0x4C

        #define        KB_END                0x4D

        #define        KB_PAGEDOWN            0x4E

        #define        KB_RARROW            0x4F

        #define        KB_LARROW            0x50

        #define        KB_DARROW            0x51

        #define        KB_UARROW            0x52

        #define        KB_NUMLOCK            0x53

        #define        KB_PAD_DIV            0x54    ///

        #define        KB_PAD_MUL            0x55    //*

        #define        KB_PAD_MINUS        0x56    //-

        #define        KB_PAD_PLUS           0x57    //+

        #define        KB_PAD_ENTER        0x58

        #define        KB_PAD_1            0x59

        #define        KB_PAD_2            0x5A

        #define        KB_PAD_3            0x5B

        #define        KB_PAD_4            0x5C

        #define        KB_PAD_5            0x5D

        #define        KB_PAD_6            0x5E

        #define        KB_PAD_7            0x5F

        #define        KB_PAD_8            0x60

        #define        KB_PAD_9            0x61

        #define        KB_PAD_0            0x62

        #define        KB_PAD_DEL           0x63

        #define        KB_APPLICATION        0x65    //RWin右边键

二:鼠标

        1:鼠标描述符如下

        0x05,0x01, // Global Generic Desktop

        0x09,0x02, // Local Mouse

        0xa1,0x01, // Main app collection

        0x09,0x01, // Local Pointer

        0xa1,0x00, // Main phy collection

        0x95,0x03, // Global ReportCount

        0x75,0x01, // Global ReportSize

        0x05,0x09, // Global Button

        0x19,0x01, // Local Usage Min

        0x29,0x03, // Local Usage Max

        0x15,0x00, // Global Logical Min

        0x25,0x01, // Global Logical Max

        0x81,0x02, // Main Input(Data,Var,Abs)

        0x95,0x01, // Global ReportCount

        0x75,0x05, // Global ReportSize

        0x81,0x03, // Main Input(Cnsr,Var,Abs)

        0x95,0x03,0x75,0x08, // Global ReportCount Global ReportSize

        0x05,0x01, // Global Generic Desktip

        0x09,0x30, // Local X

        0x09,0x31, // Local Y

        0x09,0x38, // Locak Wheel

        0x15,0x81, // Global Logical Min

        0x25,0x7f, // Global Logical Max

        0x81,0x06, // Main Input(Data,Var,Rel)

        0xc0,      // Main End collection

        鼠标发送给PC的数据每次4个字节。

        BYTE1字节:
        bit7~3:补充的常数,无意义,这里为0即可
        bit2: 1表示中键按下
        bit1: 1表示右键按下 0表示右键抬起
        bit0: 1表示左键按下 0表示左键抬起
        BYTE2 — X坐标变化量,与byte的bit4组成9位符号数,负数表示向左移,正数表右移。用补码表示变化量
        BYTE3 — Y坐标变化量,与byte的bit5组成9位符号数,负数表示向下移,正数表上移。用补码表示变化量
        BYTE4 — 滚轮变化。0x01(1)表示滚轮向前滚动一格;0xFF(-1)表示滚轮向后滚动一格;0x80(-0)是个中间值,不滚动

        实际测试:

        BYTE2 X坐标变化量,当BYTE1的bit4为0的时候,0x01~0x7F为向左移动,0x81~0xFF为向右移动,0x00,0x80为不移动。BYTE1的bit4为1的时候,依旧。试验数据是跟BYTE1的bit4没什么关系。

        BYTE3的变化跟BYTE2的一样。
因此BYTE2/BYTE3/BYTE4的变化趋势都是一样的,中间是分界点,山峰结构。从低到高,再从高到低。

        

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值