USB 키보드(HID)가 Linux에서는 응답하지 않지만 grub에서는 응답하지 않습니다.

USB 키보드(HID)가 Linux에서는 응답하지 않지만 grub에서는 응답하지 않습니다.

사용하려는 외장 USB 키보드가 USB HID 장치로 인식되는데 Linux 부팅 시 작동하지 않습니다. Windows 데스크톱에 연결하면 작동하고 grub에서는 작동하지만 시스템 시작 시에는 작동하지 않습니다.

장치가 USB 포트(05a4:8003)에 표시됩니다.

$ lsusb
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 003 Device 002: ID 046d:c078 Logitech, Inc. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 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 001 Device 004: ID 05a4:8003 Ortek Technology, Inc.

dmesg장치가 연결 되면 오류가 표시되지 않습니다.

[  466.932272] usb 1-1.2: new full-speed USB device number 4 using ehci_hcd
[  467.026740] usb 1-1.2: New USB device found, idVendor=05a4, idProduct=8003
[  467.026745] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  467.026756] usb 1-1.2: Product: USB Keypad     
[  467.026758] usb 1-1.2: Manufacturer: Keypad
[  467.027939] input: Keypad USB Keypad      as /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/input/input13
[  467.028099] hid-generic 0003:05A4:8003.0004: input,hidraw1: USB HID v1.10 Keyboard [Keypad USB Keypad     ] on usb-0000:00:1a.0-1.2/input0
[  467.029600] input: Keypad USB Keypad      as /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1/input/input14
[  467.029726] hid-generic 0003:05A4:8003.0005: input,hidraw2: USB HID v1.10 Mouse [Keypad USB Keypad     ] on usb-0000:00:1a.0-1.2/input1

입력/이벤트 장치가 생성되었지만 응답하지 않습니다. 기기를 두 번(키보드 입력, 마우스 입력) 등록하는데 문제가 있는 것인지 궁금합니다.

Ubuntu 13.04 시스템에서 테스트 중입니다. 의도된 대상 시스템은 Rasbian이 포함된 Raspberry Pi입니다. Rasbian에서도 같은 방식으로 문제가 발생하므로 Linux와 관련이 있다고 가정합니다.

어떻게 더 디버깅할 수 있나요? 이렇게 응답하지 않는 동작을 일으키는 원인이 무엇인지 아시나요?

답변1

이 USB HID 장치가 Windows에서 작동하는 이유는 해당 장치에 대해 작성된 특정 드라이버가 있을 수 있기 때문입니다. GRUB에서 작동하는 이유는 장치가 소위 말하는 방식으로 실행되기 때문입니다.부트 모드. USB HID 장치는 부팅 모드와 HID 모드의 두 가지 작동 모드를 지원합니다. 전자를 사용하면 BIOS에서 전체 HID 스택을 구현하지 않고도 BIOS에서 장치를 사용할 수 있습니다. 후자는 확장된 기능(예: 추가 버튼)을 추가할 수 있는 더 큰 유연성을 제공합니다. 부트스트랩 모드에 대한 지원은 인터페이스 설명자에 부트스트랩 인터페이스 하위 클래스 플래그가 있으면 표시됩니다(참고 자료 참조 lsusb -v -d 05a4:8003).

Interface Descriptor:
...
  bInterfaceSubClass      1 Boot Interface Subclass

Linux 커널 소스 코드(3.14-rc8)의 빠른 grep에는 이 USB HID 장치에 대한 특별한 드라이버가 표시되지 않습니다. 따라서 커널은 일반 HID 드라이버( hid-generic)로 대체됩니다. 그러나 Linux에서 사용하는 장치와 드라이버가 호환되지 않는 것 같습니다.

장치에서 (보이지 않는) 활동이 발생하는지 확인하려면 프로그램을 설치 evtest하고 실행하세요 sudo evtest. 장치를 묻는 메시지가 나타나면 키보드와 일치하는 번호를 입력하세요. 모든 것이 정상이면 키 누르기 이벤트가 표시됩니다.

키가 표시되지 않고 추가로 디버깅하려면 설치하여 wiresharkUSB 인터페이스를 캡처하세요(usbmon 사용). 출력에서 볼 수 있듯이 lsusb입력 장치는 버스 1에 연결되어 있으므로 usbmon1이를 인터페이스로 지정해야 합니다. USB 트래픽을 캡처하는 명령은 다음과 같습니다.

sudo dumpcap -i usbmon1 -w - > usb.pcapng

usb.pcapng(이 방법을 사용하면 일반 사용자로 쓸 수 있지만, 대안으로는 /dev/usbmon1일반 사용자가 파일을 읽을 수 있도록 설정하거나 파일을 생성한 후 소유권을 변경하는 방법이 있습니다.)

USB HID 캡처 분석

권한이 없는 사용자로서 이제 캡처된 USB 트래픽 분석을 시작할 수 있습니다. 알아야 할 기본 사항은 다음과 같습니다.USB그리고고압 가스 방전관그것을 이해하기 위해. 가장 간단한 HID 장치에는 일반적으로 양방향 제어 엔드포인트(EP0, 항상 존재함)와 데이터 전송에 사용되는 인터럽트 엔드포인트라는 두 개의 엔드포인트가 있습니다.~에서장치도착하다USB 호스트("컴퓨터").

주석이 달린 캡처 예시를 만들어서 업로드했습니다.https://www.cloudshark.org/captures/a6c9580208b7. 작동 방식을 더 잘 이해하려면 패킷 주석을 읽어 보시기 바랍니다. Wireshark에서 오프라인으로 이 패킷을 열 때 몇 가지 색상을 추가하는 것이 좋습니다(보기 -> 색상 규칙).

  • frame.comment- 어떤 프레임이 명령을 받았는지 쉽게 확인할 수 있습니다.
  • usb and frame.len == 64(또는 부정 usb and not frame.len == 64) - 어떤 패킷이 페이로드를 받는지 더 빠르게 확인합니다.

또한 몇 가지 추가 열을 추가하는 것이 좋습니다("열 기본 설정" 열을 마우스 오른쪽 버튼으로 클릭).

  • usb.urb_type- 패킷이 URB_SUBMIT장치( )에 제출되었는지( ) 또는 장치에서 수신되었는지( ) 확인합니다 URB_COMPLETE.
  • usb.transfer_type- 제어 데이터(EP0를 통해) 또는 기타 데이터(예: USB HID 장치의 인터럽트 데이터)를 보고 있는지 확인하세요.
  • usb.endpoint_number.direction- 길찾기를 확인하세요데이터 전송(IN은 장치에서 호스트("PC")로, OUT은 호스트("PC")에서 장치로 연결됩니다).

이 열을 Len(gth) 열 옆으로 끌어서 정보 열이 세 개의 USB 열 오른쪽에 계속 표시되도록 크기를 조정했습니다.

이러한 설정을 완료한 후 이제 분석을 시작할 수 있습니다. 아무 키나 누르면 HID 설명자 형식의 데이터로 인터럽트가 생성됩니다. 그렇지 않은 경우 일부 공급업체별 명령(예: 특수 드라이버)이 필요하거나 Linux USB(HID) 스택에 버그가 있을 수 있습니다.

관련 정보