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

관련 정보