Usage Page (Generic Desktop),
Usage(Game Pad), ; An arcade-style joystick probably doesn't actually meet the requirements for a joystick?
Collection(Application),
Usage(Pointer),
Collection(Physical),
Usage(X),
Usage(Y),
Logical Minimum(-1),
Logical Maximum(1),
Report Count(2),
Report Size(2),
Input(Data, Variable, Absolute, No Null), ; 2-bit signed integer X axis
End Collection(),
Usage Minimum(D-Pad Up),
Usage Maximum(D-Pad Left),
Report Count(4),
Report Size(1),
Input(Data, Variable, Absolute), ; are the D-Pad buttons necessary in practice?
Usage Page (Buttons),
Usage Minimum (1),
Usage Maximum (12),
Logical Minimum(0),
Logical Maximum(1),
Report Count(12),
Report Size(1),
Input(Data, Variable, Absolute)
Report Count(1),
Report Size(4),
Input(Constant),
End Collection,
End Collection
0x05, 0x01, // Usage Page (Generic Desktop),
0x09, 0x05, // Usage(Game Pad),
0xA1, 0x01, // Collection(Application),
0x09, 0x01, // Usage(Pointer),
0xA1, 0x00, // Collection(Physical),
0x09, 0x30, // Usage(X),
0x09, 0x31, // Usage(Y),
0x15, 0xFF, // Logical Minimum(-1),
0x25, 0x01, // Logical Maximum(1),
0x95, 0x02, // Report Count(2),
0x75, 0x02, // Report Size(2),
0x81, 0x02, // Input(Data, Variable, Absolute, No Null),
0xC0, // End Collection(),
0x19, 0x90, // Usage Minimum(D-Pad Up),
0x29, 0x93, // Usage Maximum(D-Pad Left),
0x95, 0x04, // Report Count(4),
0x75, 0x01, // Report Size(1),
0x81, 0x02, // Input(Data, Variable, Absolute),
0x05, 0x09, // Usage Page (Buttons),
0x19, 0x01, // Usage Minimum (1),
0x29, 0x0C, // Usage Maximum (12),
0x15, 0x00, // Logical Minimum(0),
0x25, 0x01, // Logical Maximum(1),
0x95, 0x0C, // Report Count(12),
0x75, 0x01, // Report Size(1),
0x81, 0x02, // Input(Data, Variable, Absolute)
0x95, 0x01, // Report Count(1),
0x75, 0x04, // Report Size(4),
0x81, 0x01, // Input(Constant),
0xC0 // End Collection