11个版本 (6个重大更改)
0.7.0 | 2023年2月12日 |
---|---|
0.6.1 | 2022年10月21日 |
0.5.1 | 2020年7月19日 |
0.5.0 | 2019年2月6日 |
0.1.1 | 2018年8月22日 |
#111 在 嵌入式开发 中
每月5,784 次下载
在 13 个crate中使用了 (12个直接使用)
210KB
4.5K SLoC
pc-keyboard
一个用于处理PC键盘的简单驱动程序,支持Scancode Set 1(在PC上运行时)和Scancode Set 2(直接从PS/2键盘输出读取时)。
支持
- Scancode Set 1(来自i8042 PC键盘控制器)
- Scancode Set 2(直接来自AT或PS/2接口键盘)
- 几种键盘布局
名称 | 键数 | 描述 | 链接 |
---|---|---|---|
Us104 |
101/104 | 北美标准英语 | 维基百科 |
Uk105 |
102/105 | 英国标准英语 | 维基百科 |
Azerty |
102/105 | 通常用于法语地区 | 维基百科 |
De104 |
102/105 | 德语布局 | 维基百科 |
Jis109 |
106/109 | JIS 109键布局(仅拉丁字符) | 维基百科 |
Colemak |
101/104 | 一个旨在提高打字效率和舒适度的键盘布局 | 维基百科 |
Dvorak104Key |
101/104 | 比QWERTY更“人体工程学”的替代方案 | 维基百科 |
DVP104Key |
101/104 | 程序员的Dvorak | 维基百科 |
101/104键是ANSI布局(宽回车键)和102/105键是ISO布局(高回车键)。101和104(以及102和105)之间的区别来自Windows 95推出时添加的两个Windows键和菜单键。JIS键盘有额外的按键,这是通过缩短空格键和退格键实现的。
用法
处理键盘输入有三个基本步骤。您的应用程序可能绕过其中一些。
Ps2Decoder
- 将11位PS/2字转换为字节,去除起始/停止位并检查奇偶校验位。只有在通过GPIO引脚与PS/2键盘通信时才需要,如果与i8042 PC键盘控制器通信则不需要。ScancodeSet
- 将Scancode Set 1(i8042 PC键盘控制器)或Scancode Set 2(原始PS/2键盘输出)转换为符号KeyCode
和上下KeyState
。EventDecoder
- 将符号KeyCode
和KeyState
转换为 Unicode 字符(在可能的情况下),根据当前选定的KeyboardLayout
。
还有一个 Keyboard
对象,它将上述三个功能合并为一个。
有关更多详细信息,请参阅 examples
文件夹。
文档
键码
此包使用符号键码来抽象 Scancode Set 1 和 Scancode Set 2。它们由 KeyCode
枚举表示。扫描码可以来自三种受支持的键盘之一:102/105 键 ISO、101/104 键 ANSI 和 106/109 键 JIS。
102/105 键 ISO
这是 KeyCode
到 102/105 键 ISO 键盘的映射
┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
│Esc │ │ F1 │ F2 │ F3 │ F4 │ │ F5 │ F6 │ F7 │ F8 │ │ F9 │F10 │F11 │F12 │ │PrSc│Scrl│PBrk│
└────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
│Oem8│Key1│Key2│Key3│Key4│Key5│Key6│Key7│Key8│Key9│Key0│Oem─│Oem+│Backspace│ │Inse│Home│PgUp│ │NumL│Num/│Num*│Num─│
├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
│ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │Oem4│Oem6│ Enter │ │Dele│End │PgDo│ │Num7│Num8│Num9│ │
├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┐ │ └────┴────┴────┘ ├────┼────┼────┤Num+│
│CapsLo│ A │ S │ D │ F │ G │ H │ J │ K │ L │Oem1│Oem3│Oem7│ │ │Num4│Num5│Num6│ │
├────┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────┴───────┤ ┌────┐ ├────┼────┼────┼────┤
│LShf│Oem5│ Z │ X │ C │ V │ B │ N │ M │OemC│OemP│Oem2│ RShift │ │ Up │ │Num1│Num2│Num3│ │
├────┴┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┴────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤Num │
│LCtrl│LWin │ Alt │ Space │AltGr│RWin │ Menu │RCtrl │ │Left│Down│Righ│ │Num0 │NumP│Ente│
└─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
102 键缺少 LWin
、RWin
和 Menu
。
101/104 键 ANSI
这是 KeyCode
到 101/104 键 ANSI 键盘的映射
┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
│Esc │ │ F1 │ F2 │ F3 │ F4 │ │ F5 │ F6 │ F7 │ F8 │ │ F9 │F10 │F11 │F12 │ │PrSc│Scrl│PBrk│
└────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
│Oem8│Key1│Key2│Key3│Key4│Key5│Key6│Key7│Key8│Key9│Key0│Oem─│Oem+│Backspace│ │Inse│Home│PgUp│ │NumL│Num/│Num*│Num─│
├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────+────+────┤ ├────┼────┼────┼────┤
│ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │Oem4│Oem6│ Oem5 │ │Dele│End │PgDo│ │Num7│Num8│Num9│ │
├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤ └────┴────┴────┘ ├────┼────┼────┤Num+│
│CapsLo│ A │ S │ D │ F │ G │ H │ J │ K │ L │Oem1│Oem3│ Enter │ │Num4│Num5│Num6│ │
├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤ ┌────┐ ├────┼────┼────┼────┤
│ LShift │ Z │ X │ C │ V │ B │ N │ M │OemC│OemP│Oem2│ RShift │ │ Up │ │Num1│Num2│Num3│ │
├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┴────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤Num │
│LCtrl│LWin │ Alt │ Space │AltGr│RWin │ Menu │RCtrl │ │Left│Down│Righ│ │Num0 │NumP│Ente│
└─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
注意,104 键 ANSI 键盘上缺少 Oem7
键。
101 键也缺少 LWin
、RWin
和 Menu
。
106/109 键 JIS
这是 KeyCode
到 106/109 键 JIS 键盘的映射
┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
│Esc │ │ F1 │ F2 │ F3 │ F4 │ │ F5 │ F6 │ F7 │ F8 │ │ F9 │F10 │F11 │F12 │ │PrSc│Scrl│PBrk│
└────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
│Oem8│Key1│Key2│Key3│Key4│Key5│Key6│Key7│Key8│Key9│Key0│Oem─│Oem+│Om13│BkSp│ │Inse│Home│PgUp│ │NumL│Num/│Num*│Num─│
├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
│ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │Oem4│Oem6│ Enter │ │Dele│End │PgDo│ │Num7│Num8│Num9│ │
├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┐ │ └────┴────┴────┘ ├────┼────┼────┤Num+│
│CapsLo│ A │ S │ D │ F │ G │ H │ J │ K │ L │Oem1│Oem3│Oem7│ │ │Num4│Num5│Num6│ │
├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────┴───────┤ ┌────┐ ├────┼────┼────┼────┤
│LShift │ Z │ X │ C │ V │ B │ N │ M │OemC│OemP│Oem2│Oem12 │RShift │ │ Up │ │Num1│Num2│Num3│ │
├─────┬───┴─┬──┴──┬─┴───┬┴────┴────┴────┴────┴┬───┴─┬──┴──┬─┴──┬────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤Num │
│LCtrl│LWin │LAlt │Oem9 │ Space Bar │Oem10│Oem11│RWin│Menu│RCtrl │ │Left│Down│Righ│ │Num0 │NumP│Ente│
└─────┴─────┴─────┴─────┴─────────────────────┴─────┴─────┴────┴────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
注意,在 109 键 JIS 布局中缺少 Oem5
,但添加了 Oem9
(Muhenkan)、Oem10
(Henkan/Zenkouho)、Oem11
(Hiragana/Katakana)、Oem12
(反斜杠)和 Oem13
(¥)。
106 键也缺少 LWin
、RWin
和 Menu
。
转换表
Scancode Set 1 和 Scancode Set 2 可以无损转换。实际上,这是您的 PC 中的 i8042 键盘控制器所做的事情 - 它从键盘接收 Scancode Set 2 并向操作系统提供 Scancode Set 1。这允许他们更改键盘设计,而不破坏与任何从键盘读取原始扫描码的 MS-DOS 应用程序的兼容性。
此表显示了我们的符号 KeyCode、Scancode Set 1 和 Scancode Set 2 之间的对应关系。我们可能在未来扩展此功能,以处理 USB HID 扫描码。任何以 0xE0
或 0xE1
为前缀的代码都是 扩展 多字节扫描码。通常这些是未在 IBM PC 和 PC/XT 键盘上存在的键,因此它们被添加到其中,以便即使忽略 0xE0,也能得到合理的结果。例如,ArrowLeft
在 Scancode Set 1 中的值为 0xE04B
,因为 Numpad4
的值为 0x4B
,而在 IBM PC 或 PC/XT 上它是左箭头键。
符号键 | Scancode Set 1 | Scancode Set 2 |
---|---|---|
Escape | 0x01 | 0x76 |
F1 | 0x3B | 0x05 |
F2 | 0x3C | 0x06 |
F3 | 0x3D | 0x04 |
F4 | 0x3E | 0x0C |
F5 | 0x3F | 0x03 |
F6 | 0x40 | 0x0B |
F7 | 0x41 | 0x83 |
F8 | 0x42 | 0x0A |
F9 | 0x43 | 0x01 |
F10 | 0x44 | 0x09 |
F11 | 0x57 | 0x78 |
F12 | 0x58 | 0x07 |
PrintScreen | 0xE037 | 0xE07C |
SysRq | 0x54 | 0x7F |
ScrollLock | 0x46 | 0x7E |
PauseBreak | -- | -- |
- | -- | -- |
Oem8 | 0x29 | 0x0E |
Key1 | 0x02 | 0x16 |
Key2 | 0x03 | 0x1E |
Key3 | 0x04 | 0x26 |
Key4 | 0x05 | 0x25 |
Key5 | 0x06 | 0x2E |
Key6 | 0x07 | 0x36 |
Key7 | 0x08 | 0x3D |
Key8 | 0x09 | 0x3E |
Key9 | 0x0A | 0x46 |
Key0 | 0x0B | 0x45 |
OemMinus | 0x0C | 0x4E |
OemPlus | 0x0D | 0x55 |
Backspace | 0x0E | 0x66 |
Insert | 0xE052 | 0xE070 |
Home | 0xE047 | 0xE06C |
PageUp | 0xE049 | 0xE07D |
NumpadLock | 0x45 | 0x77 |
NumpadDivide | 0xE035 | 0xE04A |
NumpadMultiply | 0x37 | 0x7C |
NumpadSubtract | 0x4A | 0x7B |
- | -- | -- |
Tab | 0x0F | 0x0D |
Q | 0x10 | 0x15 |
W | 0x11 | 0x1D |
E | 0x12 | 0x24 |
R | 0x13 | 0x2D |
T | 0x14 | 0x2C |
Y | 0x15 | 0x35 |
U | 0x16 | 0x3C |
I | 0x17 | 0x43 |
O | 0x18 | 0x44 |
P | 0x19 | 0x4D |
Oem4 | 0x1A | 0x54 |
Oem6 | 0x1B | 0x5B |
Oem5 | 0x56 | 0x61 |
Oem7 | 0x2B | 0x5D |
Delete | 0xE053 | 0xE071 |
End | 0xE04F | 0xE069 |
PageDown | 0xE051 | 0xE07A |
Numpad7 | 0x47 | 0x6C |
Numpad8 | 0x48 | 0x75 |
Numpad9 | 0x49 | 0x7D |
NumpadAdd | 0x4E | 0x79 |
- | -- | -- |
CapsLock | 0x3A | 0x58 |
A | 0x1E | 0x1C |
S | 0x1F | 0x1B |
D | 0x20 | 0x23 |
F | 0x21 | 0x2B |
G | 0x22 | 0x34 |
H | 0x23 | 0x33 |
J | 0x24 | 0x3B |
K | 0x25 | 0x42 |
L | 0x26 | 0x4B |
Oem1 | 0x27 | 0x4C |
Oem3 | 0x28 | 0x52 |
Return | 0x1C | 0x5A |
Numpad4 | 0x4B | 0x6B |
Numpad5 | 0x4C | 0x73 |
Numpad6 | 0x4D | 0x74 |
- | -- | -- |
LShift | 0x2A | 0x12 |
Z | 0x2C | 0x1A |
X | 0x2D | 0x22 |
C | 0x2E | 0x21 |
V | 0x2F | 0x2A |
B | 0x30 | 0x32 |
N | 0x31 | 0x31 |
M | 0x32 | 0x3A |
OemComma | 0x33 | 0x41 |
OemPeriod | 0x34 | 0x49 |
Oem2 | 0x35 | 0x4A |
RShift | 0x36 | 0x59 |
ArrowUp | 0xE048 | 0xE075 |
Numpad1 | 0x4F | 0x69 |
Numpad2 | 0x50 | 0x72 |
Numpad3 | 0x51 | 0x7A |
NumpadEnter | 0xE01C | 0xE075 |
- | -- | -- |
LControl | 0x1D | 0x14 |
LWin | 0xE05B | 0xE01F |
LAlt | 0x38 | 0x11 |
Spacebar | 0x39 | 0x29 |
RAltGr | 0xE038 | 0xE011 |
RWin | 0xE05C | 0xE027 |
Apps | 0xE05C | 0xE02F |
RControl | 0xE01D | 0xE014 |
ArrowLeft | 0xE04B | 0xE06B |
ArrowDown | 0xE050 | 0xE072 |
ArrowRight | 0xE04D | 0xE074 |
Numpad0 | 0x52 | 0x70 |
NumpadPeriod | 0x53 | 0x71 |
- | -- | -- |
Oem9 | 0x7B | 0x67 |
Oem10 | 0x79 | 0x64 |
Oem11 | 0x70 | 0x13 |
Oem12 | 0x73 | 0x51 |
Oem13 | 0x7D | 0x6A |
- | -- | -- |
PrevTrack | 0xE010 | 0xE015 |
NextTrack | 0xE019 | 0xE04D |
Mute | 0xE020 | 0xE023 |
Calculator | 0xE021 | 0xE02B |
Play | 0xE022 | 0xE034 |
Stop | 0xE024 | 0xE03B |
VolumeDown | 0xE02E | 0xE021 |
VolumeUp | 0xE030 | 0xE032 |
WWWHome | 0xE032 | 0xE03A |
TooManyKeys | -- | 0x00 |
PowerOnTestOk | -- | 0xAA |
RControl2 | 0xE11D | 0xE114 |
RAlt2 | 0xE02A | 0xE012 |
注意1: PauseBreak
没有扫描码,因为它是我们从一系列其他按键(按下 NumLock
时同时按下 RControl2
)中推断出来的。
注意2: SysReq
在图中没有按键,因为只有在你执行 Alt
+ PrintScreen
时才会生成扫描码。
最低支持的 Rust 版本 (MSRV)
此软件包保证可以在稳定的 Rust 1.61 及以上版本中编译。它可能可以在较旧版本中编译,但在任何新的补丁版本中可能会发生变化。
变更日志
在 CHANGELOG.md 中有变更日志。
许可证
根据以下任一许可证授权:
- Apache License,版本 2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您提交给本工作的任何贡献都将按照上述方式授权,不附加任何额外条款或条件。
行为准则
对本软件包的贡献是在 Rust 行为准则 的条款下组织的,本软件包的维护者、Rust嵌入式社区 保证将介入以维护该行为准则。