Linux 内核删除自定义键盘扫描码

use*_*941 16 linux kernel keyboard-shortcuts keyboard linux-kernel

我有一个老式的 IBM 122 键型号 M 键盘,我正在改装以在现代计算机上使用。我正在使用 Teensy 2.0 进行编码和处理 USB 方面的事情。我从 Humble Hacker 键盘项目 ( https://github.com/humblehacker/keyboard )借用了固件,并在构建配置中添加了额外的键。到现在为止还挺好。

所有“常规”键都有效,但内核似乎正在删除额外的键(F13-F24等)。

运行/lib/udev/keymap -i input/event0显示所有普通键的扫描码,但没有显示额外键的扫描码。

运行wireshark以捕获 USB 端口的数据包显示键盘正在发送扫描码,但看起来内核只是原则上丢弃它们。

我觉得这是内核驱动程序中的某些东西,它根本没有提供它不期望的扫描码。

我认为.h内核源代码中的某个文件中会有某种“主”键映射,但到目前为止,我还没有成功找到它。

值得强调的是,我并不是像在我之前的许多其他人一样要求在 X 中映射额外的键。这是一个低级别的,显然与内核相关的问题。暂时假设我根本不会使用 X。我需要的是在我运行时显示扫描码/lib/udev/keymap -i,我可以从那里完成其余的工作。

小智 1

内核看到奇怪的扫描代码并丢弃它们。我会尝试获取这些扫描代码值,然后更新硬件数据库索引。简而言之,计划是这样的:

  • 从 dmesg 输出获取代码 - 当按下未知的键码时,dmesg 应该输出类似这样的内容:

    Unknown key pressed (translated set 2, code 0xa0 on isa0060/serio0)
    
    Run Code Online (Sandbox Code Playgroud)

a0是代码值。

  • 创建自定义键码映射文件。示例和帮助位于默认文件中
    /usr/lib/udev/hwdb.d/60-keyboard.hwdb对于 Arch,在其他发行版中可能有所不同)。

  • 通过运行以下命令更新并触发硬件数据库:

    > udevadm hwdb --update
    > udevadm trigger /dev/input/eventXX
    
    Run Code Online (Sandbox Code Playgroud)

其中eventXX对应于您的键盘(您可以通过运行获取它evtest)。您也可以重新启动而不是触发。

查看Arch wiki和默认键码映射文件以获取更详细的描述(如果不是 Arch,则查看您的发行版文档)。

这是可靠且简单的方法,在内核级别进行映射,因此无论显示服务器、DE 等是什么,都可以工作。