Redragon Asura USBキーボードは、すべてのCtrl、Alt、WinキーをShift_Lにマップします。

Redragon Asura USBキーボードは、すべてのCtrl、Alt、WinキーをShift_Lにマップします。

状態:この問題はカーネル4.18から修正されました。詳しくは、許可された回答をご覧ください。

今すぐ使い始めました。レッドドラゴン阿修羅USBキーボード。キーボードはうまく機能しますが、残念ながらCtrl、Alt、Winの両方が左のShiftキーにマップされているため、使いにくいです。

dmesg出力は

[185765.848957] input: USB Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:0C45:760B.0022/input/input50
[185765.905395] hid-generic 0003:0C45:760B.0022: input,hidraw3: USB HID v1.11 Keyboard [USB Keyboard] on usb-0000:00:14.0-3/input0
[185765.949342] input: USB Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:0C45:760B.0023/input/input51
[185766.009474] hid-generic 0003:0C45:760B.0023: input,hiddev0,hidraw4: USB HID v1.11 Keyboard [USB Keyboard] on usb-0000:00:14.0-3/input1

デバッグキーの使用を開始しました。シフそして、このキーに対してまったく同じキーマップを取得します。 KeyPressとKeyReleaseイベントが混在している可能性がありますが、全体的には同じです(投稿の終わりを参照)。

Ctrl、Alt、およびWinキーを正しくマッピングするにはどうすればよいですか?

左の選択肢:

KeyRelease event, serial 36, synthetic NO, window 0x3200001,
    root 0xd7, subw 0x0, time 185237066, (307,429), root:(2272,538),
    state 0x1, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

左Ctrl:

KeyPress event, serial 36, synthetic NO, window 0x3200001,
    root 0xd7, subw 0x0, time 185265721, (443,237), root:(2408,346),
    state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

左に移動:

KeyRelease event, serial 36, synthetic NO, window 0x3200001,
    root 0xd7, subw 0x0, time 185303441, (436,539), root:(2401,648),
    state 0x1, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

勝利の鍵:

KeyPress event, serial 36, synthetic NO, window 0x3200001,
    root 0xd7, subw 0x0, time 185327465, (399,367), root:(2364,476),
    state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

右Alt:

KeyPress event, serial 36, synthetic NO, window 0x3200001,
root 0xd7, subw 0x0, time 185361768, (348,141), root:(2313,250),
    state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

右クリック:

KeyPress event, serial 36, synthetic NO, window 0x3200001,
    root 0xd7, subw 0x0, time 185401328, (598,415), root:(2563,524),
    state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

編集する:実際には、キーボードは2つのUSBデバイスとして表示されます。 /sys/debug/kernel/hidからHID記述子をアップロードしました。

答え1

私のものLinuxカーネルパッチでRedragon Asuraキーボードを修正するこれは主流で、カーネルバージョン4.18の一部になります。

Num Lock LEDとCaps Lock LEDがアクティブにならないという小さな問題があります(キーは正しく機能します)。この問題は4.19で修正される予定です。

このパッチは4.16と4.17にも適用でき、openSUSEは4.16からパッチを提供します。

答え2

私はこの答えが少し遅れていることを知っていますが、Swoogansキーボードドライバを見つけて私たちの目的に合わせて修正しました。私自身も最近Asura K501を購入しましたが、同じ問題に遭遇しました。私のAsuraは2017年モデルで、チップセットは0x7603ではなく0x760bです。

https://bitbucket.org/vipinmohan/redragon-asura-kb-ubuntu

これを使用してください。私のAsuraは今うまくいっています。

答え3

部分的な答え:

最初の(自動)HID記述子は通常、USBキーボードで見られるものと似ています。レポートは、左右のCtrl / Shift / Alt / Meta(Win)キーの8ビットと予約済みバイト(0)で構成されています。そして6つのキー入力スキャンコードのバイト。 (これがUSBキーボードが6キーのロールオーバーに制限される理由です。)これはおそらくある種のレガシー記述子です。

2 番目の記述子は複数のレポートタイプを使用します。最初の3つは「消費者」(何でも)、電源制御のためのものであり、1つはサプライヤーが定義したものです(それで私たちはそれが何であるかわかりません)。残りの3つのタイプのレポート(ID 4〜6)は、各キーの押下をビットフィールドとして報告します(nキーロールオーバー付きのゲームキーボードに適しています)。

hidrawダンプが示すように、ファンクションキーが正しく報告されますLeft Ctrl

04 01 00 00 00 00 00 00 

(レポートIDは4、最初のレポートが開いている)、両方をLeft Alt押すと

04 04 00 00 00 00 00 00

(レポートIDは4、ビット3はオン)など、すべてのキーを離すとすべてのビットが0にリセットされます。

カーネルのデバイスマッピング

Keyboard.00e0 ---> Key.LeftControl
Keyboard.00e1 ---> Key.LeftShift
Keyboard.00e2 ---> Key.LeftAlt
Keyboard.00e3 ---> Key.LeftMeta
Keyboard.00e4 ---> Key.RightCtrl
Keyboard.00e5 ---> Key.RightShift
Keyboard.00e6 ---> Key.RightAlt
Keyboard.00e7 ---> Key.RightMeta

実際にこれを理解すると主張します。しなければならない異なるマッピングスキャンパスワード。だからあなたは本物似たようなことを見たことがない

type 4 (EV_MSC), code 4 (MSC_SCAN), value 1d
type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 1
-------------- SYN_REPORT ------------
type 4 (EV_MSC), code 4 (MSC_SCAN), value 1d
type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 0
-------------- SYN_REPORT ------------
type 4 (EV_MSC), code 4 (MSC_SCAN), value 38
type 1 (EV_KEY), code 56 (KEY_LEFTALT), value 1
-------------- SYN_REPORT ------------
type 4 (EV_MSC), code 4 (MSC_SCAN), value 38
type 1 (EV_KEY), code 56 (KEY_LEFTALT), value 0
-------------- SYN_REPORT ------------

evtest別のMSC_SCANコードを一度1d、一度記録してください38。行を気にしないでください。EV_KEY)これにより、カーネルがHIDレポートをスキャンコードにマップするときに問題が発生します。

この場合、これまでのすべての情報を含むカーネル開発者(「入力サブシステム」のようです)にバグを送信してデバッグするアイデアがあることを確認してください。

可能な代替ソリューションの1つは、レガシーHIDデバイスを任意の方法で有効にすることです。これは、通常のUSBキーボードに似ており、デフォルトで機能するためです。キーボードにこれを実行できるキーまたはキーの組み合わせはありますか?

関連情報