질문
해당 기능을 사용할 수 있는 경우 연결된 키보드에 대해 프로그래밍 방식으로 NKRO(N-key conflict-free)를 협상하고 활성화할 수 있는 방법이 있습니까? 또한 "표준 모드" 핸들러와 NKRO를 올바르게 구별하는 방법은 무엇입니까?
근본적인
저는 세 가지 다른 키보드를 가지고 있는데, 심지어 플랫폼 간에도 모두 서로 조금씩 다르게 작동합니다. 그들은 모두 각자의 방식으로 NKRO를 지지합니다. 내 주요 문제는 그 중 하나에 NKRO 모드를 강제/전환하는 키 조합이 없으며 드라이버/OS에서만 수행할 수 있다는 것입니다.
시험
Windows 10
저는 Linux 5.10.17+
Pi Zero 플랫폼에서 키보드를 연주합니다. 내 장치는 Razer Ornata Chroma
, HyperX HX-KB1BR1-NA
및 입니다 Havit HV-KB390L
. 나는 여기에 장치의 동작 설명을 넣을 수 있다고 생각했습니다.
나는 standard mode
일반적으로 사용되는 저속 8바이트 크기 USB 패킷을 언급하고 있습니다. game-mode
키보드 관련 기능(사용 가능한 경우)을 말하는 것입니다 .
Windows
- Razer: NKRO enabled by default regardless of game-mode state, game-mode only disables Win key,
game-mode state stored only by platform driver
(Razer Central installed)
- Havit: NKRO enabled by default, game-mode does nothing (probably configured via software)
(no additional software installed)
- HyperX: stores NKRO state internally in keyboard and enforces it, game-mode disables Win key only
(no additional software installed)
Linux
- Razer: standard mode by default, game-mode enforces NKRO and disables Win key
- Havit: standard mode by default, game-mode does nothing, There is no key sequence to enforce NKRO
- HyperX: behaves the same as on Windows, internal state changes works between platforms
따라서 HyperX
표준 모드/NKRO 토글의 구현은 제가 가장 좋아하는 것입니다. Razer
적어도 NKRO를 강제하는 키 조합을 제공하는 것입니다(비록 모든 연결/부팅에서 수행되어야 하지만). Havit
불행히도 다음을 통해 NKRO를 활성화하는 옵션은 제공되지 않습니다. .
/drivers/input
리눅스 소스코드와 문서들( , /Documentation/input
, ) 을 뒤져보았 /drivers/hid/hid-input.c
으나 NKRO를 수행하는데 도움이 될만한 내용을 찾지 못했고, C 코드를 이해하는 것도 나에게 가장 쉬운 작업은 아니었습니다. 내가 찾은 NKRO에 대한 유일한 언급은 다음 줄이었습니다.
#define HP_SDC_CFG_ROLLOVER 0x08 /* WTF는 "N키 롤오버"입니까? */
글쎄요, 그건 별로 도움이 안 돼요.
그렇다면 OS 측에서 NKRO를 활성화하는 것이 가능합니까?
표준 핸들러와 NKRO 핸들러 구별
테스트하는 동안 나는 이 두 가지 모드가 eventX
두 가지 다른 핸들러와 연관되어 있음을 발견했습니다. /proc/bus/input/devices
파일을 검사 하고 더 많은 컨텍스트를 찾을 수 있습니다.
I: Bus=0003 Vendor=0951 Product=16b7 Version=0111
N: Name="Kingston HyperX Alloy FPS Mechanical Gaming Keyboard"
P: Phys=usb-20980000.usb-1.1/input0
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.0/0003:0951:16B7.0001/input/input0
U: Uniq=
H: Handlers=sysrq kbd leds event0
B: PROP=0
B: EV=120013
B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=1f
I: Bus=0003 Vendor=0951 Product=16b7 Version=0111
N: Name="Kingston HyperX Alloy FPS Mechanical Gaming Keyboard Mouse"
P: Phys=usb-20980000.usb-1.1/input1
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.1/0003:0951:16B7.0002/input/input1
U: Uniq=
H: Handlers=mouse0 event1
B: PROP=0
B: EV=17
B: KEY=1f0000 0 0 0 0 0 0 0 0
B: REL=1943
B: MSC=10
I: Bus=0003 Vendor=0951 Product=16b7 Version=0111
N: Name="Kingston HyperX Alloy FPS Mechanical Gaming Keyboard System Control"
P: Phys=usb-20980000.usb-1.1/input1
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.1/0003:0951:16B7.0002/input/input2
U: Uniq=
H: Handlers=kbd event2
B: PROP=0
B: EV=13
B: KEY=c000 100000 0 0 0
B: MSC=10
I: Bus=0003 Vendor=0951 Product=16b7 Version=0111
N: Name="Kingston HyperX Alloy FPS Mechanical Gaming Keyboard Consumer Control"
P: Phys=usb-20980000.usb-1.1/input1
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.1/0003:0951:16B7.0002/input/input3
U: Uniq=
H: Handlers=kbd event3
B: PROP=0
B: EV=1f
B: KEY=3f 301ff 0 0 0 0 483ffff 17aff32d bfd44446 0 0 1 130ff3 8b17c000 677bfa d9415fed 19ed680 4400 0 10000002
B: REL=1040
B: ABS=1 0
B: MSC=10
I: Bus=0003 Vendor=0951 Product=16b7 Version=0111
N: Name="Kingston HyperX Alloy FPS Mechanical Gaming Keyboard"
P: Phys=usb-20980000.usb-1.1/input1
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.1/0003:0951:16B7.0002/input/input5
U: Uniq=
H: Handlers=sysrq kbd event4
B: PROP=0
B: EV=100013
B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
파일 형식이 잘 설명되어 있습니다.여기
이 HyperX
경우 5개의 서로 다른 핸들러를 사용할 수 있습니다(다른 핸들러에서는 더 많거나 적을 수 있음).
- 키보드 이벤트 핸들러, 표준 모드
- 마우스 핸들러(예: 원격 USB 키보드 및 터치패드) 나는 그것이 설계상 항상 거기에 있었다고 가정합니다.
- "시스템 제어"라는 이름만 보면 전원, 절전 등의 이벤트를 제공합니다.
- 멀티미디어 및 관련 특수키에 대한 이벤트를 제공하려면 "소비자 제어"를 참조하세요.
- NKRO 이벤트 핸들러
검색을 통해 "표준 모드" 키보드 핸들러를 쉽게 찾을 수 있습니다 EV=120013
(이것이 올바른 접근 방식인지 확실하지 않습니다). 이 특별한 경우에는 지원되는 동일한 키 비트맵이 있는 다른 항목을 찾을 수 있지만 불행히도 Havit
해당 비트맵이 매우 다른 경우입니다. 내가 본 유용할 수 있는 또 다른 패턴은 find inside handlers 이지만 sysrq
, 그것이 무엇을 의미하는지 모르겠습니다.
그게 다야.
특정 키보드에 대한 standard mode
합계 NKRO
처리기를 올바르게 찾는 방법은 무엇입니까?