This repository was archived by the owner on Nov 2, 2023. It is now read-only.
- Notifications
You must be signed in to change notification settings - Fork338
Xbox 360 and Xbox One Controller HID Report Descriptors #40
Open
Description
While looking at originalxboxgip.sys
(version 10.0.18362.267) and how it works I foundgipControllerHidDescriptor
var that this driver uses for its HID Physical Device Object. It wasHID_DESCRIPTOR
struct.
Stripped header and decoded it viaRDD! HID Report Descriptor Decoder tool. Maybe could be userfull in this or other projects:
//--------------------------------------------------------------------------------// Report descriptor data in hex (length 262 bytes)//--------------------------------------------------------------------------------// 05010905 A101A100 09300931 150027FF FF000095 02751081 02C0A100 09330934// 150027FF FF000095 02751081 02C00501 09321500 26FF0395 01750A81 02150025// 00750695 01810305 01093515 0026FF03 9501750A 81021500 25007506 95018103// 05091901 290A950A 75018102 15002500 75069501 81030501 09391501 25083500// 463B0166 14007504 95018142 75049501 15002500 35004500 65008103 A102050F// 09971500 25017504 95019102 15002500 91030970 15002564 75089504 91020950// 66011055 0E26FF00 95019102 09A79102 65005500 097C9102 C0050109 80A10009// 85150025 01950175 01810215 00250075 07950181 03C00506 09201500 26FF0075// 08950181 02C0//--------------------------------------------------------------------------------// Decoded Application Collection//--------------------------------------------------------------------------------/*05 01 (GLOBAL) USAGE_PAGE 0x0001 Generic Desktop Page09 05 (LOCAL) USAGE 0x00010005 Game Pad (Application Collection)A1 01 (MAIN) COLLECTION 0x01 Application (Usage=0x00010005: Page=Generic Desktop Page, Usage=Game Pad, Type=Application Collection)A1 00 (MAIN) COLLECTION 0x00 Physical (Usage=0x0: Page=, Usage=, Type=) <-- Error: COLLECTION must be preceded by a USAGE <-- Warning: USAGE type should be CP (Physical Collection)09 30 (LOCAL) USAGE 0x00010030 X (Dynamic Value)09 31 (LOCAL) USAGE 0x00010031 Y (Dynamic Value)15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Info: Consider replacing 15 00 with 1427 FFFF0000 (GLOBAL) LOGICAL_MAXIMUM 0x0000FFFF (65535)95 02 (GLOBAL) REPORT_COUNT 0x02 (2) Number of fields75 10 (GLOBAL) REPORT_SIZE 0x10 (16) Number of bits per field81 02 (MAIN) INPUT 0x00000002 (2 fields x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=BitmapC0 (MAIN) END_COLLECTION PhysicalA1 00 (MAIN) COLLECTION 0x00 Physical (Usage=0x0: Page=, Usage=, Type=) <-- Error: COLLECTION must be preceded by a USAGE <-- Warning: USAGE type should be CP (Physical Collection)09 33 (LOCAL) USAGE 0x00010033 Rx (Dynamic Value)09 34 (LOCAL) USAGE 0x00010034 Ry (Dynamic Value)15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 1427 FFFF0000 (GLOBAL) LOGICAL_MAXIMUM 0x0000FFFF (65535) <-- Redundant: LOGICAL_MAXIMUM is already 6553595 02 (GLOBAL) REPORT_COUNT 0x02 (2) Number of fields <-- Redundant: REPORT_COUNT is already 275 10 (GLOBAL) REPORT_SIZE 0x10 (16) Number of bits per field <-- Redundant: REPORT_SIZE is already 1681 02 (MAIN) INPUT 0x00000002 (2 fields x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=BitmapC0 (MAIN) END_COLLECTION Physical05 01 (GLOBAL) USAGE_PAGE 0x0001 Generic Desktop Page <-- Redundant: USAGE_PAGE is already 0x000109 32 (LOCAL) USAGE 0x00010032 Z (Dynamic Value)15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 1426 FF03 (GLOBAL) LOGICAL_MAXIMUM 0x03FF (1023)95 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields75 0A (GLOBAL) REPORT_SIZE 0x0A (10) Number of bits per field81 02 (MAIN) INPUT 0x00000002 (1 field x 10 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 1425 00 (GLOBAL) LOGICAL_MAXIMUM 0x00 (0) <-- Info: Consider replacing 25 00 with 2475 06 (GLOBAL) REPORT_SIZE 0x06 (6) Number of bits per field95 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields <-- Redundant: REPORT_COUNT is already 181 03 (MAIN) INPUT 0x00000003 (1 field x 6 bits) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap05 01 (GLOBAL) USAGE_PAGE 0x0001 Generic Desktop Page <-- Redundant: USAGE_PAGE is already 0x000109 35 (LOCAL) USAGE 0x00010035 Rz (Dynamic Value)15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 1426 FF03 (GLOBAL) LOGICAL_MAXIMUM 0x03FF (1023)95 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields <-- Redundant: REPORT_COUNT is already 175 0A (GLOBAL) REPORT_SIZE 0x0A (10) Number of bits per field81 02 (MAIN) INPUT 0x00000002 (1 field x 10 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 1425 00 (GLOBAL) LOGICAL_MAXIMUM 0x00 (0) <-- Info: Consider replacing 25 00 with 2475 06 (GLOBAL) REPORT_SIZE 0x06 (6) Number of bits per field95 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields <-- Redundant: REPORT_COUNT is already 181 03 (MAIN) INPUT 0x00000003 (1 field x 6 bits) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap05 09 (GLOBAL) USAGE_PAGE 0x0009 Button Page19 01 (LOCAL) USAGE_MINIMUM 0x00090001 Button 1 Primary/trigger (Selector, On/Off Control, Momentary Control, or One Shot Control)29 0A (LOCAL) USAGE_MAXIMUM 0x0009000A Button 10 (Selector, On/Off Control, Momentary Control, or One Shot Control)95 0A (GLOBAL) REPORT_COUNT 0x0A (10) Number of fields75 01 (GLOBAL) REPORT_SIZE 0x01 (1) Number of bits per field81 02 (MAIN) INPUT 0x00000002 (10 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 1425 00 (GLOBAL) LOGICAL_MAXIMUM 0x00 (0) <-- Redundant: LOGICAL_MAXIMUM is already 0 <-- Info: Consider replacing 25 00 with 2475 06 (GLOBAL) REPORT_SIZE 0x06 (6) Number of bits per field95 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields81 03 (MAIN) INPUT 0x00000003 (1 field x 6 bits) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap05 01 (GLOBAL) USAGE_PAGE 0x0001 Generic Desktop Page09 39 (LOCAL) USAGE 0x00010039 Hat switch (Dynamic Value)15 01 (GLOBAL) LOGICAL_MINIMUM 0x01 (1)25 08 (GLOBAL) LOGICAL_MAXIMUM 0x08 (8)35 00 (GLOBAL) PHYSICAL_MINIMUM 0x00 (0) <-- Info: Consider replacing 35 00 with 3446 3B01 (GLOBAL) PHYSICAL_MAXIMUM 0x013B (315)66 1400 (GLOBAL) UNIT 0x0014 Rotation in degrees [1° units] (4=System=English Rotation, 1=Rotation=Degrees) <-- Info: Consider replacing 66 1400 with 65 1475 04 (GLOBAL) REPORT_SIZE 0x04 (4) Number of bits per field95 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields <-- Redundant: REPORT_COUNT is already 181 42 (MAIN) INPUT 0x00000042 (1 field x 4 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 1=Null 0=NonVolatile 0=Bitmap75 04 (GLOBAL) REPORT_SIZE 0x04 (4) Number of bits per field <-- Redundant: REPORT_SIZE is already 495 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields <-- Redundant: REPORT_COUNT is already 115 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Info: Consider replacing 15 00 with 1425 00 (GLOBAL) LOGICAL_MAXIMUM 0x00 (0) <-- Info: Consider replacing 25 00 with 2435 00 (GLOBAL) PHYSICAL_MINIMUM 0x00 (0) <-- Redundant: PHYSICAL_MINIMUM is already 0 <-- Info: Consider replacing 35 00 with 3445 00 (GLOBAL) PHYSICAL_MAXIMUM 0x00 (0) <-- Info: Consider replacing 45 00 with 4465 00 (GLOBAL) UNIT 0x00 No unit (0=None) <-- Info: Consider replacing 65 00 with 6481 03 (MAIN) INPUT 0x00000003 (1 field x 4 bits) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=BitmapA1 02 (MAIN) COLLECTION 0x02 Logical (Usage=0x0: Page=, Usage=, Type=) <-- Error: COLLECTION must be preceded by a USAGE <-- Warning: USAGE type should be CL (Logical Collection)05 0F (GLOBAL) USAGE_PAGE 0x000F Physical Interface Device Page09 97 (LOCAL) USAGE 0x000F0097 DC Enable Actuators (Selector)15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 1425 01 (GLOBAL) LOGICAL_MAXIMUM 0x01 (1)75 04 (GLOBAL) REPORT_SIZE 0x04 (4) Number of bits per field <-- Redundant: REPORT_SIZE is already 495 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields <-- Redundant: REPORT_COUNT is already 191 02 (MAIN) OUTPUT 0x00000002 (1 field x 4 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 1425 00 (GLOBAL) LOGICAL_MAXIMUM 0x00 (0) <-- Info: Consider replacing 25 00 with 2491 03 (MAIN) OUTPUT 0x00000003 (1 field x 4 bits) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap09 70 (LOCAL) USAGE 0x000F0070 Magnitude (Dynamic Value)15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 1425 64 (GLOBAL) LOGICAL_MAXIMUM 0x64 (100)75 08 (GLOBAL) REPORT_SIZE 0x08 (8) Number of bits per field95 04 (GLOBAL) REPORT_COUNT 0x04 (4) Number of fields91 02 (MAIN) OUTPUT 0x00000002 (4 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap09 50 (LOCAL) USAGE 0x000F0050 Duration (Dynamic Value)66 0110 (GLOBAL) UNIT 0x1001 Time in seconds [1 s units] (1=System=SI Linear, 1=Time=Seconds)55 0E (GLOBAL) UNIT_EXPONENT 0x0E (Unit Value x 10⁻²)26 FF00 (GLOBAL) LOGICAL_MAXIMUM 0x00FF (255)95 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields91 02 (MAIN) OUTPUT 0x00000002 (1 field x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap09 A7 (LOCAL) USAGE 0x000F00A7 Start Delay (Dynamic Value)91 02 (MAIN) OUTPUT 0x00000002 (1 field x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap65 00 (GLOBAL) UNIT 0x00 No unit (0=None) <-- Info: Consider replacing 65 00 with 6455 00 (GLOBAL) UNIT_EXPONENT 0x00 (Unit Value x 10⁰) <-- Info: Consider replacing 55 00 with 5409 7C (LOCAL) USAGE 0x000F007C Loop Count (Dynamic Value)91 02 (MAIN) OUTPUT 0x00000002 (1 field x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=BitmapC0 (MAIN) END_COLLECTION Logical05 01 (GLOBAL) USAGE_PAGE 0x0001 Generic Desktop Page09 80 (LOCAL) USAGE 0x00010080 System Control (Application Collection)A1 00 (MAIN) COLLECTION 0x00 Physical (Usage=0x00010080: Page=Generic Desktop Page, Usage=System Control, Type=Application Collection) <-- Warning: USAGE type should be CP (Physical Collection)09 85 (LOCAL) USAGE 0x00010085 System Main Menu (One Shot Control)15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 1425 01 (GLOBAL) LOGICAL_MAXIMUM 0x01 (1)95 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields <-- Redundant: REPORT_COUNT is already 175 01 (GLOBAL) REPORT_SIZE 0x01 (1) Number of bits per field81 02 (MAIN) INPUT 0x00000002 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 1425 00 (GLOBAL) LOGICAL_MAXIMUM 0x00 (0) <-- Info: Consider replacing 25 00 with 2475 07 (GLOBAL) REPORT_SIZE 0x07 (7) Number of bits per field95 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields <-- Redundant: REPORT_COUNT is already 181 03 (MAIN) INPUT 0x00000003 (1 field x 7 bits) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=BitmapC0 (MAIN) END_COLLECTION Physical05 06 (GLOBAL) USAGE_PAGE 0x0006 Generic Device Controls Page09 20 (LOCAL) USAGE 0x00060020 Battery Strength (Dynamic Value)15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 1426 FF00 (GLOBAL) LOGICAL_MAXIMUM 0x00FF (255)75 08 (GLOBAL) REPORT_SIZE 0x08 (8) Number of bits per field95 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields <-- Redundant: REPORT_COUNT is already 181 02 (MAIN) INPUT 0x00000002 (1 field x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=BitmapC0 (MAIN) END_COLLECTION Application*///--------------------------------------------------------------------------------// Generic Desktop Page inputReport (Device --> Host)//--------------------------------------------------------------------------------typedefstruct{// No REPORT ID byte// Collection: CA:GamePad CP:uint16_t GD_GamePadX;// Usage 0x00010030: X, Value = 0 to 65535uint16_t GD_GamePadY;// Usage 0x00010031: Y, Value = 0 to 65535uint16_t GD_GamePadRx;// Usage 0x00010033: Rx, Value = 0 to 65535uint16_t GD_GamePadRy;// Usage 0x00010034: Ry, Value = 0 to 65535// Collection: CA:GamePaduint16_t GD_GamePadZ :10;// Usage 0x00010032: Z, Value = 0 to 1023uint8_t :6;// Paduint16_t GD_GamePadRz :10;// Usage 0x00010035: Rz, Value = 0 to 1023uint8_t :6;// Paduint8_t BTN_GamePadButton1 :1;// Usage 0x00090001: Button 1 Primary/trigger, Value = 0 to 0uint8_t BTN_GamePadButton2 :1;// Usage 0x00090002: Button 2 Secondary, Value = 0 to 0uint8_t BTN_GamePadButton3 :1;// Usage 0x00090003: Button 3 Tertiary, Value = 0 to 0uint8_t BTN_GamePadButton4 :1;// Usage 0x00090004: Button 4, Value = 0 to 0uint8_t BTN_GamePadButton5 :1;// Usage 0x00090005: Button 5, Value = 0 to 0uint8_t BTN_GamePadButton6 :1;// Usage 0x00090006: Button 6, Value = 0 to 0uint8_t BTN_GamePadButton7 :1;// Usage 0x00090007: Button 7, Value = 0 to 0uint8_t BTN_GamePadButton8 :1;// Usage 0x00090008: Button 8, Value = 0 to 0uint8_t BTN_GamePadButton9 :1;// Usage 0x00090009: Button 9, Value = 0 to 0uint8_t BTN_GamePadButton10 :1;// Usage 0x0009000A: Button 10, Value = 0 to 0uint8_t :6;// Paduint8_t GD_GamePadHatSwitch :4;// Usage 0x00010039: Hat switch, Value = 1 to 8, Physical = (Value - 1) x 45 in degreesuint8_t :4;// Pad// Collection: CA:GamePad CP:SystemControluint8_t GD_GamePadSystemControlSystemMainMenu :1;// Usage 0x00010085: System Main Menu, Value = 0 to 1uint8_t :7;// Pad// Collection: CA:GamePaduint8_t GEN_GamePadBatteryStrength;// Usage 0x00060020: Battery Strength, Value = 0 to 255} inputReport_t;//--------------------------------------------------------------------------------// Physical Interface Device Page outputReport (Device <-- Host)//--------------------------------------------------------------------------------typedefstruct{// No REPORT ID byte// Collection: CA:GamePad CL:uint8_t PID_GamePadDcEnableActuators :4;// Usage 0x000F0097: DC Enable Actuators, Value = 0 to 1uint8_t :4;// Paduint8_t PID_GamePadMagnitude[4];// Usage 0x000F0070: Magnitude, Value = 0 to 100uint8_t PID_GamePadDuration;// Usage 0x000F0050: Duration, Value = 0 to 255, Physical = Value in 10⁻² s unitsuint8_t PID_GamePadStartDelay;// Usage 0x000F00A7: Start Delay, Value = 0 to 255, Physical = Value in 10⁻² s unitsuint8_t PID_GamePadLoopCount;// Usage 0x000F007C: Loop Count, Value = 0 to 255} outputReport_t;