使用 hwdb 来调整键盘的部分按键映射

in #cn3 years ago (edited)

最近我的 HHKB 蓝牙版的键盘,总是出现粘连的问题,感觉应该不是键盘本身的问题,可能跟蓝牙的驱动有关系。

但是实在是没有啥思路去解决,所以就打算换我的另外一个键盘 NuPhy

但是用了两天,对于已经习惯了 HHKB 键位的我来说,太别扭了。

按照我的习惯,需要按照下面这样子,进行键位调整:

image.png

看了下 KDE 自带的预置方案,除了 CapsLock 和 LeftCtrl 有预置,其他的都没有。。。

经过搜索。找到了一个更底层的方案,即使用 hwdb 来修改 scancode 到 keycode 的映射。

Linux中一个按键从按下到得到最终效果需要三次处理:

KEYBOARD --> scancode --> keycode --> keysymbol

1)键盘电路 2)内核处理 3)软件设置

1)键盘硬件把你的按键行为转换成计算机能识别的 scancode

2)系统内核把scancode转换成TTY或X11需要使用的 keycode

3)TTY或X11的设置把keycode转换成具体的按键目的 keysymbol

厂商制造的键盘,要根据标准设置好每个物理位置的按键发出的scancode。操作系统根据最常见和最通用的功能布局:QWERTY,把scancode和keycode对应起来。

我们可以通过 evtest 工具,来获取我们键盘按键的 scancode。

下面就是我通过 evtest 工具获取的我的键盘的相关按键的信息。

启动 evtest 后,选择自己的键盘,我的是 15。

接着会看到我的键盘总线等信息,Input device ID: bus 0x3 vendor 0x5ac product 0x24f version 0x111

mainhost# evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:      Sleep Button
/dev/input/event1:      Power Button
/dev/input/event2:      Logitech Anywhere MX
/dev/input/event3:      Logitech M585/M590
/dev/input/event4:      PC Speaker
/dev/input/event5:      HDA NVidia HDMI/DP,pcm=3
/dev/input/event6:      American Megatrends Inc. Virtual Keyboard and Mouse
/dev/input/event7:      American Megatrends Inc. Virtual Keyboard and Mouse
/dev/input/event8:      HDA NVidia HDMI/DP,pcm=7
/dev/input/event9:      HDA NVidia HDMI/DP,pcm=8
/dev/input/event10:     HDA NVidia HDMI/DP,pcm=9
/dev/input/event11:     HDA NVidia HDMI/DP,pcm=10
/dev/input/event12:     HDA NVidia HDMI/DP,pcm=11
/dev/input/event13:     HDA NVidia HDMI/DP,pcm=12
/dev/input/event14:     HHKB-BT Keyboard
/dev/input/event15:     SONiX USB DEVICE
/dev/input/event16:     SONiX USB DEVICE
Select the device event number [0-16]: 15
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x5ac product 0x24f version 0x111
Input device name: "SONiX USB DEVICE"

接着依次输入自己想要调整的按键,得到下面的信息:

Event: time 1628668903.055645, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70039
Event: time 1628668903.055645, type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 1
Event: time 1628668903.055645, -------------- SYN_REPORT ------------
Event: time 1628668903.193667, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70039
Event: time 1628668903.193667, type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 0
Event: time 1628668903.193667, -------------- SYN_REPORT ------------
Event: time 1628668903.193910, type 17 (EV_LED), code 1 (LED_CAPSL), value 0
Event: time 1628668903.193910, -------------- SYN_REPORT ------------
Event: time 1628668912.657656, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e0
Event: time 1628668912.657656, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 1
Event: time 1628668912.657656, -------------- SYN_REPORT ------------
Event: time 1628668912.813657, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e0
Event: time 1628668912.813657, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 0
Event: time 1628668912.813657, -------------- SYN_REPORT ------------
Event: time 1628668916.517667, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e2
Event: time 1628668916.517667, type 1 (EV_KEY), code 56 (KEY_LEFTALT), value 1
Event: time 1628668916.517667, -------------- SYN_REPORT ------------
Event: time 1628668916.636649, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e2
Event: time 1628668916.636649, type 1 (EV_KEY), code 56 (KEY_LEFTALT), value 0
Event: time 1628668916.636649, -------------- SYN_REPORT ------------
Event: time 1628668918.396655, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e3
Event: time 1628668918.396655, type 1 (EV_KEY), code 125 (KEY_LEFTMETA), value 1
Event: time 1628668918.396655, -------------- SYN_REPORT ------------
Event: time 1628668918.533647, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e3
Event: time 1628668918.533647, type 1 (EV_KEY), code 125 (KEY_LEFTMETA), value 0
Event: time 1628668918.533647, -------------- SYN_REPORT ------------
Event: time 1628668928.793730, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e5
Event: time 1628668928.793730, type 1 (EV_KEY), code 54 (KEY_RIGHTSHIFT), value 1
Event: time 1628668928.793730, -------------- SYN_REPORT ------------
Event: time 1628668928.912655, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e5
Event: time 1628668928.912655, type 1 (EV_KEY), code 54 (KEY_RIGHTSHIFT), value 0
Event: time 1628668928.912655, -------------- SYN_REPORT ------------
Event: time 1628668930.269666, type 1 (EV_KEY), code 103 (KEY_UP), value 1
Event: time 1628668930.269666, -------------- SYN_REPORT ------------
^[[AEvent: time 1628668930.388664, type 1 (EV_KEY), code 103 (KEY_UP), value 0
Event: time 1628668930.388664, -------------- SYN_REPORT ------------
Event: time 1628668947.118679, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70031
Event: time 1628668947.118679, type 1 (EV_KEY), code 43 (KEY_BACKSLASH), value 1
Event: time 1628668947.118679, -------------- SYN_REPORT ------------
\Event: time 1628668947.180658, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70031
Event: time 1628668947.180658, type 1 (EV_KEY), code 43 (KEY_BACKSLASH), value 0
Event: time 1628668947.180658, -------------- SYN_REPORT ------------
Event: time 1628668951.970696, type 1 (EV_KEY), code 14 (KEY_BACKSPACE), value 1
Event: time 1628668951.970696, -------------- SYN_REPORT ------------
Event: time 1628668952.031674, type 1 (EV_KEY), code 14 (KEY_BACKSPACE), value 0
Event: time 1628668952.031674, -------------- SYN_REPORT ------------

MSC_SCAN 对应的 value 就是按键的 scancode。每次按键会对应着两条数据,一条是按下,一条是弹起。

比如我的 KEY_CAPSLOCK 键的 scancode 为 70039,keycode 为 58。

接下来,在 /etc/udev/hwdb.d/ 目录下创建一个新的配置文件,比如 99-nuphy.hwdb

内容如下:

evdev:input:b0003*
 KEYBOARD_KEY_70039=leftctrl
 KEYBOARD_KEY_700e0=capslock
 KEYBOARD_KEY_700e2=leftmeta
 KEYBOARD_KEY_700e3=leftalt
 KEYBOARD_KEY_700e5=up
 KEYBOARD_KEY_1=rightshift
 KEYBOARD_KEY_70031=backspace
 KEYBOARD_KEY_1=backslash

保存退出,更新 hwdb 数据库:

udevadm hwdb --update

激活配置

udevadm trigger

测试一下,大部分设置生效了,但是 scancode 为 1 的 UP 和 BACKSPACE 有问题。

这个后面再找时间研究吧。

参考

ET碎碎念,每周更新,欢迎订阅,点赞,转发!


好用不贵的VPS推荐

https://1hour.win


感谢你的阅读,我是中文区见证人之一,欢迎通过 AuthSteem 来给我投票,或者打开 https://steemitwallet.com/~witnesses 页面,输入 ety001 进行投票。

2.gif

中文区的见证人目前有:
支持一下他们(按字母顺序),一人可以有30票


Thank you for reading. I'm a witness. I would really appreciate your witness vote! You can vote by SteemLogin. Or open https://steemitwallet.com/~witnesses page, input ety001 to vote.

2.gif

Coin Marketplace

STEEM 0.27
TRX 0.13
JST 0.032
BTC 62900.77
ETH 2949.76
USDT 1.00
SBD 3.59