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リポジトリを見つけました。テストしてみるとうまくいきます。ハードウェアのみを動作させるには: