USB HID 键盘描述符

描述符

/* USB 键盘HID描述符 */
/* HID Report Descriptor Keyboard */
const u8 Keyboard_ReportDescriptor[] =
{
    0x05, 0x01,             //  Usage Page (Generic Desktop)
    0x09, 0x06,             //  Usage (Generic Device Controls)
    0xA1, 0x01,             //  Collection (Application)
    0x85, REPORT_ID,        //      REPORT_ID 
    0x05, 0x07,             //      Usage Page (Keyboard/Keypad) 
    0x19, 0xE0,             //      Usage Minimum (Button 224)
    0x29, 0xE7,             //      Usage Maximum (Button 231)
    0x15, 0x00,             //      Logical Minimum (0)
    0x25, 0x01,             //      Logical Maximum (1)
    0x75, 0x01,             //      Report Size (1)
    0x95, 0x08,             //      Report Count (8)
    0x81, 0x02,             //      Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)
    0x95, 0x01,             //      Report Count (1)
    0x75, 0x08,             //      Report Size (8)
    0x81, 0x01,             //      Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)
    0x95, 0x05,             //      Report Count (5)
    0x75, 0x01,             //      Report Size (1)
    0x05, 0x08,             //      Usage Page (LEDs) 
    0x19, 0x01,             //      Usage Minimum (Button 1)
    0x29, 0x05,             //      Usage Maximum (Button 5)
    0x91, 0x02,             //      Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit)
    0x95, 0x01,             //      Report Count (1)
    0x75, 0x03,             //      Report Size (3)
    0x91, 0x01,             //      Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit)
    0x95, 0x06,             //      Report Count (6)
    0x75, 0x08,             //      Report Size (8)
    0x15, 0x00,             //      Logical Minimum (0)
    0x26, 0xFF, 0x00,       //      Logical Maximum (255)
    0x05, 0x07,             //      Usage Page (Keyboard/Keypad) 
    0x19, 0x00,             //      Usage Minimum (Button 0)
    0x2A, 0xFF, 0x00,       //      Usage Maximum (Button 255)
    0x81, 0x00,             //      Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)
    0xC0                    //  End Collection
}

报文说明

键盘发送给PC的数据每次9个字节

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8

定义分别是:

Byte0 --  Report ID 
Byte1 --
       |--Bit0:   Left Control是否按下,按下为1
       |--Bit1:   Left Shift  是否按下,按下为1
       |--Bit2:   Left Alt    是否按下,按下为1
       |--Bit3:   Left GUI    是否按下,按下为1
       |--Bit4:   Right Control是否按下,按下为1 
       |--Bit5:   Right Shift 是否按下,按下为1
       |--Bit6:   Right Alt   是否按下,按下为1
       |--Bit7:   Right GUI   是否按下,按下为1
Byte2 -- 填0,保留位
Byte3~Byte8 -- 这六个为普通按键

例如(假设Report ID等于c4):

按键:左Ctrl + 1
按下报文: c4 01 00 1e 00 00 00 00 00
释放报文: c4 00 00 00 00 00 00 00 00

按键:左Ctrl + 2
按下报文: c4 01 00 1f 00 00 00 00 00
释放报文: c4 00 00 00 00 00 00 00 00

按键:左Ctrl + 右Shift + 3 + 4
按下报文: c4 21 00 20 21 00 00 00 00
释放报文: c4 00 00 00 00 00 00 00 00

按键:5
报文按下: c4 00 00 22 00 00 00 00 00
报文释放: c4 00 00 00 00 00 00 00 00

对于键码,HID和PS2的键盘有所不同,其它键码请参照 USB HID to PS2 Scan Code Translation Table.pdf 的“Key Name”列和“HID Usage ID”列;

补充

2017年7月12日

1、如果发送X键按下报文后不发送释放报文,则设备一直处于连按X键状态,值到发送释放报文或直接断开设备;
2、如果发送X1键按下报文后不发送释放报文,而发送其他按键X2键按下报文,则X1键被释放,设备一直处于连按X2键状态,值到发送释放报文或直接断开设备;

2017年5月22日

1、可能是因为驱动冲突吧,用在声波ST7000MAC WinXP下时,需修改下PID。

 继续浏览关于 HIDUSB 的文章

 本文最后更新于 2021/03/01 15:32:30,可能因经年累月而与现状有所差异

 引用转载请注明: 落梧笔记 > 电子 > USB HID 键盘描述符