요약

요약

어제 새로운 TrueOS 인스턴스(FreeBSD 변형)를 설치하고 USB 키보드(Logitech G510)를 연결했습니다. 설치 환경, 첫 번째 부팅 설정 중, 새 인스턴스가 다시 시작될 때까지 제대로 작동합니다. 이 시점에서는 부팅 시 BSD의 모듈 로딩 단계부터 시작하여 입력 전송을 완전히 중지하는 것처럼 보입니다. 왜냐하면 이 때 Scroll Lock이 작동을 멈추기 때문입니다. 그러나 LCD 화면과 백라이트가 켜져 있고 다른 키보드를 연결하면 상태 변경(Caps/NumLock 등)을 추적하고 Windows/Linux 및 랩톱에서 잘 작동합니다.

BIOS에서 Legacy USB와 Hand-off를 켜고 끄는 것뿐만 아니라 다른 포트를 사용하는 다양한 조합을 시도했지만 소용이 없었습니다. 다른 USB 키보드(아래 로그의 "공급업체 0x1241 USB 키보드")는 어느 쪽이든 잘 작동합니다. USB 마우스는 항상 작동합니다. PS/2 포트가 없습니다.

여기서 무슨 일이 일어나고 있고 어떻게 해결하는지 아시나요? 감사해요!

% dmesg | grep kb
kbd1 at kbdmux0
atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0
atkbd0: <AT Keyboard> irq 1 on atkbdc0
kbd0 at atkbd0
atkbd0: [GIANT-LOCKED]
ukbd0 on uhub5
ukbd0: <vendor 0x1241 USB Keyboard, class 0/0, rev 1.10/2.80, addr 2> on usbus6
kbd2 at ukbd0
ukbd1 on uhub0
ukbd1: <Logitech G510 Gaming Keyboard, class 0/0, rev 2.00/1.65, addr 2> on usbus0
kbd3 at ukbd1

% ll /dev/*kb*
crw-------  1 root  wheel  0x47 Oct 31 10:46 /dev/atkbd0
lrwxr-xr-x  1 root  wheel     6 Oct 31 10:46 /dev/kbd0 -> atkbd0
lrwxr-xr-x  1 root  wheel     7 Oct 31 10:46 /dev/kbd1 -> kbdmux0
lrwxr-xr-x  1 root  wheel     5 Oct 31 10:46 /dev/kbd2 -> ukbd0
lrwxr-xr-x  1 root  wheel     5 Oct 31 10:46 /dev/kbd3 -> ukbd1
crw-------  1 root  wheel  0x25 Oct 31 10:46 /dev/kbdmux0
crw-------  1 root  wheel  0x62 Oct 31 10:46 /dev/ukbd0
crw-------  1 root  wheel  0x6a Oct 31 10:46 /dev/ukbd1

답변1

요약

실제로 일어난 일은 매우 간단했습니다. 추가 게임 및 기타 키 누르기에 대한 진정한 N 키 롤오버를 제공하기 위해 Logitech은 키보드 입력 이벤트가 USB를 통해 보고되는 방식을 조정했습니다. FreeBSD 커널에 내장된 USB 입력 보고서 구문 분석 라이브러리는 이 기능을 지원하지 않습니다. 커널 메시지 출력을 필터링하지 않으면 다음과 같은 메시지가 표시됩니다.

hid_get_item: 항목 수(991)가 255로 잘림
hid_get_item: 항목 수(257)가 255로 잘림
또는

hid_get_item:364: 255로 잘린 항목 수

세부 사항

USB 입력 보고 프로토콜을 사용하면 USB HID가 각각 최대 65531개의 키로 구성된 두 그룹을 가질 수 있습니다. 현재 USB 표준은 A a첫 번째 그룹의 키 4( )부터 231( )까지의 코드를 정의합니다. ⌘ Right GUI"게임용 키보드"에는 이보다 더 많은 키가 있으며, 대부분은 표준화된 키 코드와 일치하지 않으며 어쨌든 실제로 두 번째 그룹에 속할 수 있습니다.

USBHID개념적으로키보드 활동을 키당 1비트의 거대한 비트맵으로 보고하여 키보드에 있는 모든 키의 현재 작동/작동 상태를 설명합니다. 이는 실제로 8개의 수정자 키(코드 224~231)의 경우에 해당하지만,대개다른 키는 역배열로 보고됩니다. 장치에서 USB 호스트로 회선을 통해 전송되는 키보드 입력 보고서에는 다음이 포함됩니다.색인비트맵의 비트 수1로 설정되어 있습니다.

이 역배열 형태는 공간을 절약합니다. 현재 126키 멀티미디어 키보드로 이 답변을 입력하고 있으며 각 입력 보고서에는 전체 키보드를 비트맵 형식으로 보고하는 데 16바이트가 필요합니다. 그러나 반전된 배열의 경우 8바이트만 사용하며 그 중 6바이트는 수정되지 않은 키의 배열 인덱스입니다.

이 역배열 형식의 문제점은 아무 것도 얻지 못한다는 것입니다.

  • 뒤집기를 제한합니다. 완전한 비트맵을 사용하면 진정한 N 키 롤오버가 가능합니다(키보드 매트릭스 자체의 하드웨어 제한 사항에 따라 다름). 역배열 형식의 경우 배열 인덱스 수에 따라 뒤집기 횟수가 제한됩니다. 일반적으로 USB HID 키보드는 보고서에 6개의 배열 인덱스를 제공하여 최대 6개의(수정자 아님) 키를 동시에 누를 수 있도록 합니다. 왜냐하면 USB HID 표준이 실제로 부록에서 이 "부팅" 보고 형식을 설명하기 때문입니다.
  • 중요한 코드를 제한합니다. 배열 인덱스는 일반적으로 8비트 정수입니다. 256개 이상의 키 코드를 수용할 수 있도록 더 넓게 만들고 6개의 동시에 누른(비수정자) 키를 보고하는 데 8바이트 이상이 필요하거나 보고할 수 있는 동시에 누른 키의 수를 다음보다 적게 줄이십시오. 6.

    안타깝게도 게임 키보드는 256개보다 훨씬 많은 키 코드를 보고할 수 있어야 합니다. 위 로그 발췌 내용을 보면 알 수 있듯이 로지텍 게이밍 키보드의 키코드는 한 경우에는 최대 257이고 다른 경우에는 991이다. 그렇다고 257개와 991개의 키가 있다는 의미는 아닙니다. 이것은 의미한다키코드 값의 범위그렇게 넓나요?

FreeBSD 커널의 제한 사항, 특히 FreeBSD 커널에 연결된 libusb 라이트 버전의 제한 사항은 다소 미묘합니다. 자주 보고되는 것처럼 비트맵 크기에는 제한이 없습니다. 이는 USB 용어의 제한 사항입니다.신고 건수중 하나입력. FreeBSD는 보고서 수를 255개로 제한하고 실제 보고서 수가 255개보다 크면 위의 메시지를 인쇄합니다.

이로 인해 다음과 같은 결과가 발생합니다.둘 다키보드 입력의 비트맵 형태와 역배열 형태.

  • 직선 비트맵 형식의 경우 255보다 큰 비트맵은 255번째 키코드에서 잘립니다. 즉, 비트맵의 처음 64바이트만 고려됩니다. 이는 인식될 키 코드의 범위를 제한합니다.
  • 역배열 형식의 경우 이는 처음 255개의 배열 인덱스만 사용됨을 의미합니다. 물론 처음 255개의 배열 인덱스에는 모든 키 코드가 포함될 수 있습니다. 이는 유효 롤오버 금액을 제한합니다.

이는 후자보다 전자의 문제가 더 크다. 현명한 사람이라면 중요한 상황에서 비트맵 형식 대신 역배열 형식을 사용하지 않을 것입니다. 255개의 배열 인덱스를 가진 역배열은 많습니다.더 적은동일한 크기의 비트맵은 진정한 N 키 롤오버를 통해 8배의 키 코드를 나타낼 수 있으므로 동등한 비트맵 형식보다 공간 효율적입니다.

따라서 Logitech은 모든 추가 키가 제대로 작동할 수 있도록 257 또는 991 키코드 범위의 모든 키코드를 보고하려고 합니다. (이렇게 분할되는 이유는 다양한 유형의 키 누르기에 대한 코드가 서로 다른 "페이지"로 그룹화되는 방식과 항목이 여러 "페이지"에 걸쳐 있을 수 없는 방식과 관련이 있습니다. 이는 USB 미스터리이며 이 기사의 범위를 벗어납니다.) 답변. ) 그리고 사람들에게 단순한 6키 롤프리 기능 이상의 기능을 제공하고자 합니다.

이를 위해 USB로 전환됩니다.보고서 설명자 형식을 입력하세요.비트맵과 광범위한 보고를 사용합니다. (USB를 사용하면 HID가 여러 입력 보고 형식을 가질 수 있으며 형식 간에 전환할 수 있습니다.) FreeBSD 커널은 이를 좋아하지 않으며 문제가 발생합니다.

기본 수정 사항은 Logitech 키보드가 6키 롤오버를 제공하는 "부팅" 입력 보고서 설명자 형식을 계속 사용하도록 하고 "기본" 보고서 대신 키보드의 추가 키에 대한 코드를 보낼 수 없도록 하는 것입니다. 설명자 형식. 이는 각 시스템 부트로더에서 이 명령을 사용 usbconfig하고 add_quirk UQ_KBD_BOOTPROTO이에 대한 하위 명령을 제공하여 수행할 수 있습니다 .

핵심은 이 특이한 점을 FreeBSD 커널에 내장된 미리 정의된 기존의 특이점 목록에 넣고 커널이 이를 일치하는 USB 장치에 마술처럼 적용하도록 하는 것입니다.

서비스 수정 사항은 신고 횟수가 255개로 제한되지 않도록 커널 내 libusb 컷을 수정하는 것입니다. FreeBSD 메일링 리스트 중 하나에서 이에 대한 간단하고 피상적인 논의가 있었지만 누구도 이를 수행하지 않았습니다.

관련 정보