我的笔记本电脑内置键盘坏了(Shift 按钮有时会卡住)。我专门使用外接键盘,但内置键盘会干扰它。 (我无法拔掉设备。)
我可以使用 禁用xinput
,但它会再次启用(请参阅永久禁用键盘)。
我已识别出该设备。 (您需要安装lsinput
例如apt install input-utils
)。
sudo lsinput
/dev/input/event0
bustype : BUS_I8042
vendor : 0x1
product : 0x1
version : 43841
name : "AT Translated Set 2 keyboard"
phys : "isa0060/serio0/input0"
bits ev : EV_SYN EV_KEY EV_MSC EV_LED EV_REP
我如何禁用它?
答案1
将其列入黑名单可能是一种选择。就像,如果正在通过该atkbd
模块并且没有其他东西需要该特定模块,则只需将该模块列入黑名单即可。
否则,也许unbind
也是一个选择。
由于缺乏笔记本电脑进行测试,我将一个备用鼠标连接到我的系统,然后将其禁用。
这是鼠标:
I: Bus=0003 Vendor=04f3 Product=0235 Version=0111
N: Name="OM"
P: Phys=usb-0000:00:14.0-10.1/input0
S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb2/2-10/2-10.1/2-10.1:1.0/0003:04F3:0235.0004/input/input12
U: Uniq=
H: Handlers=event12 mouse1
B: PROP=0
B: EV=17
B: KEY=70000 0 0 0 0
B: REL=903
B: MSC=10
正在经历/sys/bus/hid/...
:
# head /sys/bus/hid/drivers/*/*/*/*/name
==> /sys/bus/hid/drivers/hid-generic/0003:046A:010D.0001/input/input3/name <==
HID 046a:010d
==> /sys/bus/hid/drivers/hid-generic/0003:046A:010D.0002/input/input4/name <==
HID 046a:010d
==> /sys/bus/hid/drivers/hid-generic/0003:046D:C077.0003/input/input5/name <==
Logitech USB Optical Mouse
==> /sys/bus/hid/drivers/hid-generic/0003:04F3:0235.0004/input/input12/name <==
OM
好吧,让我们把它踢出去吧。
# echo 0003:04F3:0235.0004 > /sys/bus/hid/drivers/hid-generic/unbind
它消失了。不再移动鼠标光标。甚至不再被列为输入设备。真的没了。
因此,您可以使用 ing 执行此类操作unbind
,并且根据它使用的驱动程序,还可以将其列入黑名单。主要问题是找到正确的名称和位置来解除绑定,然后使用自定义 udev 规则进行自动化。否则,如果您拔下插头并将其重新插入,它会再次出现。
答案2
如果查看 USB 级别没有发现任何可以修复的内容,那么接下来您可以做的两件事是在输入层级别“抓住”它,或者阻止它在 X 级别上激活。
为了第一,
evtest --grab /dev/input/event0 > /dev/null
或者类似的东西应该可以解决问题:抓取确保只有抓取应用程序接收事件,即 X 不会接收任何事件。
对于第二个,将一个InputClass
部分添加到您的xorg.conf
,沿着以下行
Section "InputClass"
Identifier "BrokenKeyboard"
MatchDevicePath "/dev/input/by-path/platform-i8042-serio-0-event-kb"
Option "Ignore" "true"
EndSection
假设该路径实际上是链接到您的键盘的路径。不要/dev/input/event0
在这里使用 etc.,它不能保证跨引导的一致性。
答案3
迟来了,但我想为苹果用户稍微解释一下上面的答案。我有一个带有损坏内部键盘的 MBP,我一直使用evtest
它来获取输入并将其发送到/dev/null
.这似乎是最常见的建议。此解决方案的问题在于,如果更新内核,则事件编号会发生变化,并且如果您有一个像我一样在启动时运行的脚本,则必须在每次内核更新时手动更新该编号。这就是 using 的用武之地unbind
,以及上面的答案如何激励我最终放弃evtest
.我想出了一个简单的台词,它似乎完美地完成了这项工作。
这是完整的命令:
head /sys/bus/hid/drivers/*/*/*/*/name | grep "apple" | sed -E 's/[^0-9A-F:.]*//g' | awk '{ print substr( $0, 1, length($0)-2 ) }' > /sys/bus/hid/drivers/apple/unbind
我们知道第一部分的作用,所以我将解释sed
和 的必要性awk
。head
与 a 一起运行grep
将输出类似于以下内容的内容:
/sys/bus/hid/drivers/apple/0003:046D:C077.0003/input/input18/name
现在,我们用来sed
删除所有不是十六进制字符的内容:
0003:046D:C077.000318
您会注意到输入数字也包含在末尾,这是我们不需要的,因此我们使用它awk
来删除字符串的最后两个字符:
0003:046D:C077.0003
当然,我们有输出方向将此字符串发送到/sys/bus/hid/drivers/apple/unbind
.将其放入可以在启动时运行的脚本中,然后就完成了!需要注意的是,它必须针对hid-generic
设备进行修改。 Apple 有自己的输入驱动程序目录,这使这变得更简单,并且grep
仅使用“apple”就足够了。
编辑:这就是众包信息的美妙之处。感谢下面的 Stephen Kitt 提供的这个解决方案。它比我的优雅得多,并且正确地考虑了输入设备编号。
for name in /sys/bus/hid/drivers/apple/*/*/*/name; do device=$(cut -d/ -f7 <<<"$name"); [ "$device" != "*" ] && printf "%s" "$device" > /sys/bus/hid/drivers/apple/unbind; done