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嵌入式开发

Download history 1370/week @ 2024-03-13 1570/week @ 2024-03-20 1579/week @ 2024-03-27 1524/week @ 2024-04-03 1447/week @ 2024-04-10 1572/week @ 2024-04-17 1624/week @ 2024-04-24 1444/week @ 2024-05-01 1440/week @ 2024-05-08 1526/week @ 2024-05-15 1576/week @ 2024-05-22 1727/week @ 2024-05-29 1527/week @ 2024-06-05 1248/week @ 2024-06-12 1426/week @ 2024-06-19 1314/week @ 2024-06-26

每月5,784 次下载
13 个crate中使用了 (12个直接使用)

MIT/Apache

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 - 将符号 KeyCodeKeyState 转换为 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 键缺少 LWinRWinMenu

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 键也缺少 LWinRWinMenu

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 键也缺少 LWinRWinMenu

转换表

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 扫描码。任何以 0xE00xE1 为前缀的代码都是 扩展 多字节扫描码。通常这些是未在 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 中有变更日志。

许可证

根据以下任一许可证授权:

由您选择。

贡献

除非您明确声明,否则您提交给本工作的任何贡献都将按照上述方式授权,不附加任何额外条款或条件。

行为准则

对本软件包的贡献是在 Rust 行为准则 的条款下组织的,本软件包的维护者、Rust嵌入式社区 保证将介入以维护该行为准则。

无运行时依赖