使用する外部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
入力/イベントデバイスが作成されましたが応答しません。デバイスを2回(キーボード入力、マウス入力)登録するのに問題があるのか気になります。
Ubuntu 13.04システムでテスト中です。目的のターゲットシステムは、Rasbianを含むRaspberry Piです。 Rasbianでも同じ方法で問題が発生するため、Linuxに関連しているとします。
どのようにさらにデバッグできますか?このように応答しない動作を引き起こす原因は何かを知っていますか?
答え1
このUSB HIDデバイスがWindowsで動作する理由は、そのデバイス用に作成された特定のドライバがある可能性があるためです。 GRUB で動作する理由は、デバイスがいわゆる言葉で実行されるためです。ブートモード。 USB HIDデバイスは、ブートモードとHIDモードの2つの動作モードをサポートしています。前者を使用すると、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
。デバイスの入力を求められたら、キーボードと一致する番号を入力してください。すべてが正常な場合は、キー押下イベントが表示されます。
キーが表示されずにさらにデバッグするには、インストールしてwireshark
USBインターフェースをキャプチャします(usbmonを使用)。出力が示すように、lsusb
入力デバイスはバス1に接続されているため、usbmon1
これをインターフェイスとして指定する必要があります。 USB トラフィックをキャプチャするコマンドは次のとおりです。
sudo dumpcap -i usbmon1 -w - > usb.pcapng
usb.pcapng
(この方法では一般ユーザーとして書き込むことができますが、代わりに/dev/usbmon1
一般ユーザーがファイルを読み取ることができるように設定したり、ファイルを作成した後に所有権を変更したりする方法があります。)
USB HIDキャプチャ分析
権限のないユーザーとして、キャプチャされたUSBトラフィック分析を開始できるようになりました。知っておくべき基本は次のとおりです。USBそして高圧ガス放電管それを理解するために。最も簡単なHIDデバイスには、通常、双方向制御エンドポイント(EP0、常に存在)とデータ転送に使用される割り込みエンドポイントという2つのエンドポイントがあります。~からデバイス到着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)列の横にドラッグして、情報列が3つのUSB列の右側に表示されるようにサイズを変更しました。
これらの設定が完了したら、分析を開始できます。いずれかのキーを押すと、HID記述子形式のデータで割り込みが発生します。そうでない場合は、一部のベンダー固有のコマンド(特殊ドライバーなど)が必要になるか、Linux USB(HID)スタックにバグがある可能性があります。