概述
问题描述
在使用dmesg
命令时总是发现大多日志内容都为以下内容
[ 1507.534145] atkbd serio0: Unknown key pressed (translated set 2, code 0xbb on isa0060/serio0).
[ 1507.534155] atkbd serio0: Use 'setkeycodes e03b <keycode>' to make it known.
[ 1507.540552] atkbd serio0: Unknown key released (translated set 2, code 0xbb on isa0060/serio0).
[ 1507.540561] atkbd serio0: Use 'setkeycodes e03b <keycode>' to make it known.
经过反复观察发现当我使用笔记本键盘上的功能键Fn + ☀时内核日志中就会出现大量上面的内容,以上功能键用于调整我笔记本屏幕上面的亮度。
排除思路
经过查阅大量资料才知道这是因为键盘上的扫描码没有和对应的键做映射,所以atkbd
会进行提示。
再经过学习了解才知道键盘上每个按键都会有一个扫描码(scancode),扫描码对应着一个键码(keycode),键码再对应一个字符或控制符号,计算机就知道我们按键的键对应哪个字符啦。
解决方法
既然没有映射,那我们给他映射就可以啦,映射有两种方式,一种是使用setkeycodes
命令进行,另一种就是使用systemd-udevd
组件。
获取扫描码和键码
- 扫描码可以通过内核日志
dmes
得到或查看/var/log/message
日志文件。- 键盘码可以通过命令
xmodmap -pke
进行查看所有的键盘码设置,找到想设置的功能$ xmodmap -pke | grep Brightness keycode 232 = XF86MonBrightnessDown NoSymbol XF86MonBrightnessDown keycode 233 = XF86MonBrightnessUp NoSymbol XF86MonBrightnessUp keycode 237 = XF86KbdBrightnessDown NoSymbol XF86KbdBrightnessDown keycode 238 = XF86KbdBrightnessUp NoSymbol XF86KbdBrightnessUp keycode 251 = XF86MonBrightnessCycle NoSymbol XF86MonBrightnessCycle
1、setkeycodes
我们可以按照atkbd
的提示进行设置,其中e03b
就是当前键盘的扫描码,可以像下面进行设置:
setkeycodes e03b 233
需要使用超级管理员权限
经过上面的设置,再次按下就不会再有提示了,但下次重启还会提示,所以我们要把上面命令写入到系统自启动脚本中或系统环境变量中。
1). 创建自启动服务/etc/systemd/system/custom.service
文件,内容如下
[Unit]
Description=Keymap Custom
Requires=gdm.service
After=gdm.service
[Service]
Type=oneshot
ExecStart=/usr/bin/setkeycodes e03b 233
ExecStart=/usr/bin/setkeycodes e03d 232
[Install]
WantedBy=graphical.target
2).启用服务
systemctl enable custom.service
3). 开机自起
systemctl enable custom.service
2、systemd-udevd
systemd-udevd会将按键的映射规则存放在路径/etc/udev/hwdb.bin
中,我们只要编写规则存放在路径/etc/udev/hwdb.d
路径中,文件名称可以这样命名90-custom-keyboard.hwdb
,后缀以.hwdb
为结束,文件内容如下:
1).创建文件/etc/udev/hwdb.d/90-custom-keyboard.hwdb
evdev:atkbd:dmi:bvn*:bvr*:bd*:svn*:pn*
KEYBOARD_KEY_e03b=233 # Fn+Up Brightness Up
KEYBOARD_KEY_e03c=232 # Fn+Down Brightness Down
内容解释:
第一行是用来匹配设备的
evdev
:表示设备输入事件
atkbd
:表示键盘驱动
dmi
:桌面管理界面(Desktop Management Interface, DMI)
bvn
:BIOS版本(bios_version)
bvr
:BIOS供应商(bios vendor)
bd
:BISO生产日期(bios date)
svn
: 设备厂商(sys vendor)
pn
:型号
*
:号表示通配
第二行和第三行用于按键映射
e03b
和e03c
对应键盘的屏幕亮度控制扫描码
233
和232
是我的键码(这里实质无法控制屏幕亮度,控制屏幕的程序会监听该键码来进行控制)
查看设备详细信息
cat /sys/class/dmi/id/modalias
2). 更新/etc/udev/hwdb.bin
数据库文件
systemd-hwdb update
3). 重新加载硬件数据库
udevadm trigger
3). 查看注册信息
udevadm info /dev/input/by-path/platform-i8042-serio-0-event-kbd
-----------------------------------------------------------------
P: /devices/platform/i8042/serio0/input/input3/event3
N: input/event3
L: 0
S: input/by-path/platform-i8042-serio-0-event-kbd
E: DEVPATH=/devices/platform/i8042/serio0/input/input3/event3
E: DEVNAME=/dev/input/event3
E: MAJOR=13
E: MINOR=67
E: SUBSYSTEM=input
E: USEC_INITIALIZED=5675887
E: KEYBOARD_KEY_bb=brightnessup
E: KEYBOARD_KEY_bc=brightnessdown
E: KEYBOARD_KEY_e03b=brightnessup
E: KEYBOARD_KEY_e03c=brightnessdown
E: ID_INPUT=1
E: ID_INPUT_KEY=1
E: ID_INPUT_KEYBOARD=1
E: ID_BUS=i8042
E: ID_SERIAL=noserial
E: ID_PATH=platform-i8042-serio-0
E: ID_PATH_TAG=platform-i8042-serio-0
E: LIBINPUT_DEVICE_GROUP=11/1/1:isa0060/serio0
E: DEVLINKS=/dev/input/by-path/platform-i8042-serio-0-event-kbd
E: TAGS=power-switch
E: CURRENT_TAGS=power-switch
这样内核就不会给出大量提示日志了,可能其他人是其他按键报错,可以按照这种方式进行映射,当然也可根据自己的需要将按键映射成其他功能或字符。
参考资料
- hwdb手册说明
- wikiarch
- stackexchange
- jveweb
最后
以上就是积极小蜜蜂为你收集整理的内核报错Unknown key released (translated set 2, code 0xbb on isa0060/serio0)问题描述排除思路解决方法的全部内容,希望文章能够帮你解决内核报错Unknown key released (translated set 2, code 0xbb on isa0060/serio0)问题描述排除思路解决方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复