저는 PS/2를 통해 키보드로 연결된 Linux Mint 19.1에서 작동하는 오래된 휴대용 바코드 리더기를 얻으려고 합니다. 바코드를 스캔할 때마다 키보드에 입력한 것과 같은 바코드 텍스트가 전송됩니다.
바코드 리더는 Grub 명령줄 등에서 부팅 시 작동하지만 Linux 부팅 시에는 출력을 생성하지 않습니다. 그러나 버퍼를 PC로 보낼 수 있다는 것을 보여줍니다. 그렇지 않으면 다시 스캔할 준비가 되지 않기 때문입니다. 그래서 어떤 종류의 연관성이 있었음에 틀림 없습니다. 비교를 위해: 동일한 PC의 Windows 10에서도 시도해 보았지만 버퍼를 전혀 플러시할 수 없어 스캐너가 멈췄습니다.
dmesg
아래와 같이 i8042 드라이버가 PS/2를 담당한다는 것을 알게 되었습니다 . 시작 매개변수를 추가하여 실행해 보았지만 도움이 되지 않았습니다.
# 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에서만 작동하며 운영 체제가 완전히 부팅된 후에는 사용할 수 없습니다.Arch 대신 Linux Mint를 사용하세요.
추가 정보:
마더보드 및 UEFI 버전: ASRock Z77 Pro3 P1.30
PS/2는 마더보드에 있으며 카드 리더는 부팅하기 전에 연결됩니다.
부팅 후 전체 dmesg
:https://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
serio0
serio1
답변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와 일치하지 않으면 키보드가 아닌 것으로 판단합니다.
그래서 나는 바코드 리더가 이 테스트에 실패했다고 생각합니다. 원시 직렬 장치에서 고유한 명령을 보내 이를 확인할 수 있습니다.