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
忽略计数器 ( 1
),前两个字节被正确设置为轴X
和 的中性位置Y
。但是,无论我按下或按下什么,接下来的两个字节(应该是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
我遇到了一个 github 存储库,该人已经编写了一个内核模块,(我相信)修补了 HID 报告以正确指向正确的字节。我测试了它,它工作得很好,所以如果你只是想让你的硬件工作,这里是: