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 或 https://open-source.org.cn/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您提交给本工作的任何贡献都将按照上述方式授权,不附加任何额外条款或条件。
行为准则
对本软件包的贡献是在 Rust 行为准则 的条款下组织的,本软件包的维护者、Rust嵌入式社区 保证将介入以维护该行为准则。