键盘数据格式说明
USB 键盘数据格式
USB 键盘数据格式由 USB HID 协议定义,该协议定义键盘数据包含 8 个字节,其格式如下表所示。
字节 | bit位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|
字节1 | 含义 | Right GUI | Right Alt | Right Shift | Right Ctrl | Left GUI | Left Alt | Left Shift | Left Ctrl |
字节2 | / | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
字节3 ~ 字节8 | 按键键值 | 按键键值 | 按键键值 | 按键键值 | 按键键值 | 按键键值 | 按键键值 | 按键键值 | 按键键值 |
普通按键的相关键值可以参考《 USB HID to PS/2 Scan Code Translation Table 》,部分键码如下表所示。
键值 | 键盘区域 | 含义 | 键值 | 键盘区域 | 含义 |
---|
0x04 | Keyboard | a and A | 0x53 | Keypad | Num Lock and Clear |
0x1E | Keyboard | 1 and ! | 0x58 | Keypad | ENTER |
0x28 | Keyboard | Return | 0x59 | Keypad | 1 |
0x2C | Keyboard | Spacebar | 0xB6 | Keypad | ( |
0x3A | Keyboard | F1 | 0xBB | Keypad | Backspace |
0x4B | Keyboard | PageUp | 0xD7 | Keypad | + |
例如,键盘发送一帧如下的数据:0x02 0x00 0x04 0x05 0x00 0x00 0x00 0x00 表示同时按下了 Left Shift +‘a’+‘b’ 三个键。
键盘事件结构体定义
根据 USB 键盘的数据格式,SylixOS 定义了 keyboard_event_notify 结构,当每产生一个键盘事件时,驱动应向系统通知一个事件的发生。
#include <SylixOS.h>
typedef struct keyboard_event_notify {
int32_t nmsg; /* 消息数量,通常为1 */
int32_t type; /* 按键状态,按下或松开 */
int32_t ledstate; /* LED状态 */
int32_t fkstat; /* 功能键状态 */
int32_t keymsg[KE_MAX_KEY_ST * 2]; /* 按键键值 */
} keyboard_event_notify;
- nmsg:表示消息数量,通常为 1。
- type:表示按键状态,有如下表所示 2 种情况。
状态位名称 | 含义 |
---|
KE_PRESS | 按键按下 |
KE_RELEASE | 按键松开 |
- ledstate:表示 LED 状态,如果对应的位为 0,表示 LED 按键处于打开状态,反之则处于关闭状态。在打开状态下,通常键盘驱动程序会将相应的 LED 指示灯打开。LED 状态有如下表所示 3 种情况。
状态位名称 | 含义 |
---|
KE_LED_NUMLOCK | 用于标识数字小键盘是否使能 |
KE_LED_CAPSLOCK | 用于标识字母大写状态是否使能 |
KE_LED_SCROLLLOCK | 用于标识滚动锁定状态是否使能 |
- fkstat:表示功能键状态,如果对应的位为 0,表示功能键按下,反之则没有按下,功能键状态位有如下表所示 6 种。
状态位名称 | 含义 |
---|
KE_FK_CTRL | 用于标识左 Ctrl 键是否按下 |
KE_FK_ALT | 用于标识左 Alt 键是否按下 |
KE_FK_SHIFT | 用于标识左 Shift 键是否按下 |
KE_FK_CTRLR | 用于标识右 Ctrl 键是否按下 |
KE_FK_ALTR | 用于标识右 Alt 键是否按下 |
KE_FK_SHIFTR | 用于标识右 Shift 键是否按下 |
- keymsg:表示普通按键键值,其每两个元素为一组。
- event.keymsg[n](n = 0,2,4 ……)表示 SylixOS 键盘键码。
- event.keymsg[n + 1](n = 0,2,4 ……)表示标准键盘键码。