PS/2“键盘”在 Linux Mint 下工作时遇到问题

PS/2“键盘”在 Linux Mint 下工作时遇到问题

我正在尝试让一个旧的手持式条形码阅读器在 Linux Mint 19.1 下工作,它通过 PS/2 作为键盘连接。每次您扫描条形码时,它都会发送条形码文本,就像您在键盘上输入的一样。

条形码阅读器在引导时工作,例如在 Grub 命令行中,但在 Linux 引导时不生成任何输出。然而,它向我显示它可以将其缓冲区发送到 PC,因为否则它就无法准备好再次扫描,而事实确实如此。所以一定已经存在某种连接。为了进行比较:我也在同一台 PC 上的 Windows 10 下进行了尝试,但扫描仪卡住了,因为它根本无法刷新缓冲区。

我已经了解到 i8042 驱动程序负责 PS/2,如下dmesg所示。我已经尝试通过添加启动参数来让它运行,但这没有帮助。

# dmesg | grep i8042
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.15.0-43-generic root=UUID=dfc4afd2-a995-48d8-8538-355cba9f9eda ro atkbd.reset i8042.nomux=1 i8042.reset quiet splash vt.handoff=1
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.15.0-43-generic root=UUID=dfc4afd2-a995-48d8-8538-355cba9f9eda ro atkbd.reset i8042.nomux=1 i8042.reset quiet splash vt.handoff=1
[    0.827672] i8042: PNP: No PS/2 controller found.
[    0.827673] i8042: Probing ports directly.
[    0.832411] serio: i8042 KBD port at 0x60,0x64 irq 1
[    0.832414] serio: i8042 AUX port at 0x60,0x64 irq 12

下没有 PS/2 设备的条目/dev/input

内核是:

Linux version 4.15.0-43-generic (buildd@lgw01-amd64-001) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018 (Ubuntu 4.15.0-43.46-generic 4.15.18)

这似乎与废弃的问题非常相似PS/2 键盘仅在 GRUB 下有效,在操作系统完全启动后无效只是使用 Linux Mint 而不是 Arch。


更多信息:

主板和 UEFI 版本:华擎 Z77 Pro3 P1.30
PS/2 位于主板上,并且在启动前已连接读卡器。

开机后满dmesghttps://pastebin.com/Pse6aCUE
atkbd serio0: keyboard reset failed on isa0060/serio0在那里注意到了几个。

evtest:

No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:  Power Button
/dev/input/event1:  Power Button
/dev/input/event2:  Video Bus
/dev/input/event3:  Logitech USB Receiver
/dev/input/event4:  Logitech USB Receiver
/dev/input/event5:  Logitech M705
/dev/input/event6:  Logitech K360
/dev/input/event7:  Logitech Logitech G35 Headset
/dev/input/event8:  HDA Intel PCH Front Mic
/dev/input/event9:  HDA Intel PCH Rear Mic
/dev/input/event10: HDA Intel PCH Line
/dev/input/event11: HDA Intel PCH Line Out Front
/dev/input/event12: HDA Intel PCH Line Out Surround
/dev/input/event13: HDA Intel PCH Line Out CLFE
/dev/input/event14: HDA Intel PCH Line Out Side
/dev/input/event15: HDA Intel PCH Front Headphone
/dev/input/event16: HDA NVidia HDMI/DP,pcm=3
/dev/input/event17: HDA NVidia HDMI/DP,pcm=7
/dev/input/event18: HDA NVidia HDMI/DP,pcm=8
/dev/input/event19: HDA NVidia HDMI/DP,pcm=9

lsusb:

Bus 002 Device 003: ID 046d:c531 Logitech, Inc. C-U0007 [Unifying Receiver]
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 002: ID 2109:0812 VIA Labs, Inc. VL812 Hub
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 003: ID 2109:2812 VIA Labs, Inc. VL812 Hub
Bus 005 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 8087:0a2b Intel Corp. 
Bus 001 Device 003: ID 05e3:0745 Genesys Logic, Inc. Logilink CR0012
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 003 Device 004: ID 046d:0a15 Logitech, Inc. 
Bus 003 Device 002: ID 05e3:0606 Genesys Logic, Inc. USB 2.0 Hub / D-Link DUB-H4 USB 2.0 Hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

在里面/sys/devices/platform/i8042/我得到power,serio0serio1子目录。

答案1

部分答案:

由于它在 BIOS 中工作并且 i8042 硬件被识别,所以底层驱动程序堆栈层应该没问题。 i8042 之上有serio内核模块,源代码为drivers/input/serio.可能这需要一个“真正的”键盘并且无法识别扫描仪。

但是,您也可以使用原始 PS/2 端口访问serio_raw。做

echo -n "serio_raw" > /sys/bus/serio/devices/serio0/drvctl

你应该得到一个/dev/psaux设备(观看dmesg,也有错误)。hexdump -C /dev/psaux看看使用条形码阅读器时是否得到了一些东西(请记住它会缓冲行,或修改每行单个字节的命令)。

如果有效,您可以将其与原始协议一起使用(自行解码),或者您可以开始尝试查看serio源代码并尝试找出它不喜欢您的条形码阅读器的原因(借助您看到的协议内容serio_raw)。

如果不起作用,我们已经进一步缩小了故障点的范围,但我不知道在这种情况下该如何继续。

对于与正在工作的serio驱动程序一起阅读本文并想玩的人serio_raw,您可以serio使用以下命令再次连接驱动程序

echo -n "rescan" > /sys/bus/serio/devices/serio0/drvctl

编辑

这些是“make”(按键)和“break”(按键释放)扫描代码。例如,1e 9e是钥匙的接通和断开A

请注意,这些被分配给按键本身,Shift等等也有通断代码。因此,如果条形码扫描仪读取大写和小写字符等,您会得到这些“假”代码。

参见例如这里或者这里了解详情。

通常,该atkbd模块会处理这些内容,并将它们转发到内核输入层,在那里它们会显示在/dev/input/eventX设备节点中。查看atkbd_probe例程,它会读取键盘 ID,如果失败,则会尝试重置 LED。如果也失败,则认为它不是键盘。同样,如果 ID 与已知的键盘 ID 不匹配,它也会判定它不是键盘。

所以我猜条形码阅读器未通过这些测试。您可以通过在原始串行设备中发送您自己的命令来验证这一点。

相关内容