키보드 입력 N키 롤오버

키보드 입력 N키 롤오버

질문

해당 기능을 사용할 수 있는 경우 연결된 키보드에 대해 NKRO(N-Key Rollover)를 프로그래밍 방식으로 협상하고 활성화할 수 있는 방법이 있습니까? 또한 "표준 모드" 처리기와 NKRO를 올바르게 구별하는 방법은 무엇입니까?

이론적 해석

저는 서로 약간씩 다르게 작동하는 세 가지 키보드를 가지고 있습니다. 심지어 플랫폼 간에도 다릅니다. 그들 모두는 각자의 방식으로 NKRO를 지지합니다. 내 주요 문제는 이들 중 하나에 NKRO 모드를 적용/전환하는 키 조합이 없으며 드라이버/OS에서만 수행할 수 있다는 것입니다.

테스트

나는 (Pi Zero) 플랫폼 Windows 10에서 키보드를 사용하여 연주했습니다 . Linux 5.10.17+내 장치는 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/inputLinux 소스 코드와 문서( , /Documentation/input, ) 를 살펴봤지만 /drivers/hid/hid-input.cNKRO를 시행하는 데 도움이 되는 내용을 찾지 못했고 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가지 핸들러를 사용할 수 있습니다(다른 핸들러는 더 많거나 적을 수 있음).

  1. 키보드 이벤트 핸들러, 표준 모드
  2. 마우스 핸들러(예: 원격 USB 키보드 마녀 터치패드) 나는 그것이 항상 설계상 존재한다고 가정합니다.
  3. "시스템 제어"라는 이름만 보면 전원, 절전 등의 이벤트를 제공합니다.
  4. "Consumer Control"을 참조하여 멀티미디어 및 관련 특수키에 대한 이벤트를 제공합니다.
  5. NKRO 이벤트 핸들러

"표준 모드" 키보드 핸들러를 검색하면 쉽게 찾을 수 있습니다 EV=120013(적절한 방법인지 확실하지 않습니다). 이 특별한 경우에는 지원되는 키의 동일한 비트맵이 있는 다른 항목을 찾을 수 있지만 불행히도 Havit해당 비트맵이 상당히 다른 경우입니다. 내가 보고 유용할 수 있는 또 다른 패턴은 핸들러에서 찾는 것입니다 sysrq. 그러나 그것이 무엇을 의미하는지 모르겠습니다.

그리고 그게 다야.

특정 키보드에 대한 핸들러 standard mode와 핸들러를 올바르게 찾으려면 어떻게 해야 합니까 ?NKRO

관련 정보