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 

忽略计数器 ( 1),前两个字节被正确设置为轴X和 的中性位置Y。但是,无论我按下或按下什么,接下来的两个字节(应该是Z和)都不会改变值。Rz

问题是,如果你看一下流,字节5cff字节在哪里,那些位于供应商特定区域,它们是油门轴和附加模拟按钮轴。与它们相邻的是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 报告以正确指向正确的字节。我测试了它,它工作得很好,所以如果你只是想让你的硬件工作,这里是:

https://github.com/walterschell/tflight4

相关内容