USB HIDレポートエラー(意図的ですか?)により、Joydevが軸の値を正しく計算できなくなります。

USB HIDレポートエラー(意図的ですか?)により、Joydevが軸の値を正しく計算できなくなります。

Thrustmaster T.Flight 4は部分的にしか利用できなかったのでjstest(Z軸、スロットル、スロットルハンドルの追加軸)、それを修正することにしました。

hidrawデータをダンプして軸が機能することを知っていましたが、パケットの位置をデコードされたHIDレポートと比較すると、レポートがデータを誤って表示しているようです。レポートを正しく読み取る方法を理解していないか、データを誤って集計しました。このマニュアルでは、ジョイスティックをPC Windowsで使用するには、ドライバをインストールすることが重要であることを示しています。はい仮説Vendor definedそのドライバは、その地域の値を正しいUsage領域に継続的に書き換えます。

値を解析するためにHIDユーザースペース「ドライバ」の半分を作成しましたが、ベンダー領域からレポートが主張する場所にバイトをコピーできる場合は、すべての重い操作を実行できると思いました。joydev修正だけが残りました。これは、PS4互換性のため、またはWindowsユーザーがドライバをインストールして使用できるようにするのに役立つため、意図的なバグである可能性があるこのマイナーな問題です。

質問:

  • これが今後の正しい考えですか?
  • では、どうすればこれを達成できますか?
  • そうでなければ、続行するより良い方法は何ですか?私はどういうわけかjoydev私のユーザースペースドライバが識別されたと仮定していますが、ここでは未知の領域に進んでいるので、どんな指示でも役に立ちます。

以下はパケットの例です。

    1 80 80 80 80 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 0 80 80 5c ff 80 0 0 80 80 0 0 0 0 0 0 0 0 0 

counter(1)を無視すると、最初の2バイトはX軸sumの中立位置に正しく設定されますY。ただし、何を押すか押しても、次の2バイト(合計でなければならないZ)は値を変更しません。Rz

問題はストリームを見るとバイト5cとバイトffがどこにあるのか、それらベンダー固有の領域に位置し、スロットル軸と追加のアナログボタン軸です。その横にはZ軸(値80)があります。ジョイスティックをねじってみてください。

レポートは次のとおりです。

// 0x05, 0x01,                    // Usage Page (Generic Desktop)        0
// 0x09, 0x05,                    // Usage (Game Pad)                    2
// 0xa1, 0x01,                    // Collection (Application)            4
// 0x85, 0x01,                    //  Report ID (1)                      6
// 0x09, 0x30,                    //  Usage (X)                          8
// 0x09, 0x31,                    //  Usage (Y)                          10
// 0x09, 0x32,                    //  Usage (Z)                          12
// 0x09, 0x35,                    //  Usage (Rz)                         14
// 0x15, 0x00,                    //  Logical Minimum (0)                16
// 0x26, 0xff, 0x00,              //  Logical Maximum (255)              18
// 0x75, 0x08,                    //  Report Size (8)                    21
// 0x95, 0x04,                    //  Report Count (4)                   23
// 0x81, 0x02,                    //  Input (Data,Var,Abs)               25
// 0x09, 0x39,                    //  Usage (Hat switch)                 27
// 0x15, 0x00,                    //  Logical Minimum (0)                29
// 0x25, 0x07,                    //  Logical Maximum (7)                31
// 0x35, 0x00,                    //  Physical Minimum (0)               33
// 0x46, 0x3b, 0x01,              //  Physical Maximum (315)             35
// 0x65, 0x14,                    //  Unit (Degrees,EngRotation)         38
// 0x75, 0x04,                    //  Report Size (4)                    40
// 0x95, 0x01,                    //  Report Count (1)                   42
// 0x81, 0x42,                    //  Input (Data,Var,Abs,Null)          44
// 0x65, 0x00,                    //  Unit (None)                        46
// 0x05, 0x09,                    //  Usage Page (Button)                48
// 0x19, 0x01,                    //  Usage Minimum (1)                  50
// 0x29, 0x0e,                    //  Usage Maximum (14)                 52
// 0x15, 0x00,                    //  Logical Minimum (0)                54
// 0x25, 0x01,                    //  Logical Maximum (1)                56
// 0x75, 0x01,                    //  Report Size (1)                    58
// 0x95, 0x0e,                    //  Report Count (14)                  60
// 0x81, 0x02,                    //  Input (Data,Var,Abs)               62
// 0x06, 0x00, 0xff,              //  Usage Page (Vendor Defined Page 1) 64
// 0x09, 0x20,                    //  Usage (Vendor Usage 0x20)          67
// 0x75, 0x06,                    //  Report Size (6)                    69
// 0x95, 0x01,                    //  Report Count (1)                   71
// 0x81, 0x02,                    //  Input (Data,Var,Abs)               73
// 0x05, 0x01,                    //  Usage Page (Generic Desktop)       75
// 0x09, 0x33,                    //  Usage (Rx)                         77
// 0x09, 0x34,                    //  Usage (Ry)                         79
// 0x15, 0x00,                    //  Logical Minimum (0)                81
// 0x26, 0xff, 0x00,              //  Logical Maximum (255)              83
// 0x75, 0x08,                    //  Report Size (8)                    86
// 0x95, 0x02,                    //  Report Count (2)                   88
// 0x81, 0x02,                    //  Input (Data,Var,Abs)               90
// 0x06, 0x00, 0xff,              //  Usage Page (Vendor Defined Page 1) 92
// 0x09, 0x21,                    //  Usage (Vendor Usage 0x21)          95
// 0x95, 0x36,                    //  Report Count (54)                  97
// 0x81, 0x02,                    //  Input (Data,Var,Abs)               99
// 0x85, 0x05,                    //  Report ID (5)                      101
// 0x09, 0x22,                    //  Usage (Vendor Usage 0x22)          103
// 0x95, 0x1f,                    //  Report Count (31)                  105
// 0x91, 0x02,                    //  Output (Data,Var,Abs)              107
// 0x85, 0x03,                    //  Report ID (3)                      109
// 0x0a, 0x21, 0x27,              //  Usage (Vendor Usage 0x2721)        111
// 0x95, 0x2f,                    //  Report Count (47)                  114
// 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             116
// 0xc0,                          // End Collection                      118
// 0x06, 0xf0, 0xff,              // Usage Page (Vendor Usage Page 0xfff0) 119
// 0x09, 0x40,                    // Usage (Vendor Usage 0x40)           122
// 0xa1, 0x01,                    // Collection (Application)            124
// 0x85, 0xf0,                    //  Report ID (240)                    126
// 0x09, 0x47,                    //  Usage (Vendor Usage 0x47)          128
// 0x95, 0x3f,                    //  Report Count (63)                  130
// 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             132
// 0x85, 0xf1,                    //  Report ID (241)                    134
// 0x09, 0x48,                    //  Usage (Vendor Usage 0x48)          136
// 0x95, 0x3f,                    //  Report Count (63)                  138
// 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             140
// 0x85, 0xf2,                    //  Report ID (242)                    142
// 0x09, 0x49,                    //  Usage (Vendor Usage 0x49)          144
// 0x95, 0x0f,                    //  Report Count (15)                  146
// 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             148
// 0x85, 0xf3,                    //  Report ID (243)                    150
// 0x0a, 0x01, 0x47,              //  Usage (Vendor Usage 0x4701)        152
// 0x95, 0x07,                    //  Report Count (7)                   155
// 0xb1, 0x02,                    //  Feature (Data,Var,Abs)             157
// 0xc0,                          // End Collection                      159

答え1

私は誰かが正しいバイトを指すようにHIDレポートをパッチしたカーネルモジュールを書いたgithubリポジトリを見つけました。テストしてみるとうまくいきます。ハードウェアのみを動作させるには:

https://github.com/walterschell/tflight4

関連情報