This is a reverse engineering of the USB interface of the G27 when connected to a PS3.
Enumeration
Device descriptor
bLength
|
18
|
bDescriptorType
|
DEVICE (0x01)
|
bcdUSB
|
2.00 (0x0200)
|
bDeviceClass
|
Defined in Interface (0x00)
|
bDeviceSubClass
|
Defined in Interface (0x00)
|
bDeviceProtocol
|
Defined in Interface (0x00)
|
bMaxPacketSize0
|
16
|
idVendor
|
0x046d
|
idProduct
|
0xc294
|
bcdDevice
|
12.38 (0x1238)
|
iManufacturer
|
None (0)
|
iProduct
|
Not Requested (2)
|
iSerialNumber
|
None (0)
|
bNumConfigurations
|
1
|
Configuration descriptor
Configuration Descriptor
bLength
|
9
|
bDescriptorType
|
CONFIGURATION (0x02)
|
wTotalLength
|
41
|
bNumInterfaces
|
1
|
bConfigurationValue
|
1
|
iConfiguration
|
None (0)
|
bmAttributes.Reserved
|
0
|
bmAttributes.RemoteWakeup
|
RemoteWakeup Not Supported (0b0)
|
bmAttributes.SelfPowered
|
Bus Powered (0b0)
|
bMaxPower
|
98mA (0x31)
|
Interface Descriptor
bLength
|
9
|
bDescriptorType
|
INTERFACE (0x04)
|
bInterfaceNumber
|
0
|
bAlternateSetting
|
0
|
bNumEndpoints
|
2
|
bInterfaceClass
|
Human Interface Device (0x03)
|
bInterfaceSubClass
|
None (0x00)
|
bInterfaceProtocol
|
None (0x00)
|
iInterface
|
None (0)
|
HID Descriptor
bLength 9
bDescriptorType
|
HID(33)
|
bcdHID
|
1.00 (0x0100)
|
bCountryCode
|
0x21
|
bNumDescriptors
|
1
|
bDescriptorType
|
REPORT (34)
|
wDescriptorLength
|
130
|
Endpoint Descriptor
bLength
|
7
|
bDescriptorType
|
ENDPOINT (0x05)
|
bEndpointAddress
|
1 IN (0b10000001)
|
bmAttributes.TransferType
|
Interrupt (0b11)
|
wMaxPacketSize.PacketSize
|
8
|
wMaxPacketSize.Transactions
|
One transaction per microframe if HS (0b00)
|
bInterval
|
10
|
Endpoint Descriptor
bLength
|
7
|
bDescriptorType
|
ENDPOINT (0x05)
|
bEndpointAddress
|
1 OUT (0b00000001)
|
bmAttributes.TransferType
|
Interrupt (0b11)
|
wMaxPacketSize.PacketSize
|
8
|
wMaxPacketSize.Transactions
|
One transaction per microframe if HS (0b00)
|
bInterval
|
10
|
Report descriptor
05 01
|
09 04
|
A1 01
|
A1 02
|
95 01
|
75 0A
|
15 00
|
26 FF 03
|
35 00
|
46 FF 03
|
09 30
|
81 02
|
95 0C
|
75 01
|
25 01
|
45 01
|
05 09
|
19 01
|
29 0C
|
81 02
|
95 02
|
06 00 FF
|
09 01
|
81 02
|
05 01
|
09 31
|
26 FF 00
|
46 FF 00
|
95 01
|
75 08
|
81 02
|
25 07
|
46 3B 01
|
75 04
|
65 14
|
09 39
|
81 42
|
75 01
|
95 04
|
65 00
|
06 00 FF
|
09 01
|
25 01
|
45 01
|
81 02
|
95 02
|
75 08
|
26 FF 00
|
46 FF 00
|
09 02
|
81 02
|
C0
|
A1 02
|
26 FF 00
|
46 FF 00
|
95 07
|
75 08
|
09 03
|
91 02
|
C0
|
C0
|
|
Usage Page
|
Generic Desktop Controls (0x01)
|
Usage
|
Joystick (0x04)
|
Collection
|
Application (0x01)
|
Collection
|
Logical (0x02)
|
Report Count
|
1
|
Report Size
|
10
|
Logical Minimum
|
0
|
Logical Maximum
|
1023
|
Physical Minimum
|
0
|
Physical Maximum
|
1023
|
Usage
|
X (0x30)
|
Input
|
Data (0x02)
|
Report Count
|
12
|
Report Size
|
1
|
Logical Maximum
|
1
|
Physical Maximum
|
1
|
Usage Page
|
Button (0x09)
|
Usage Minimum
|
Button 1 (primary/trigger) (0x01)
|
Usage Maximum
|
Button 12 (0x0c)
|
Input
|
Data (0x02)
|
Report Count
|
2
|
Usage Page
|
Vendor-defined (0xff00)
|
Usage
|
Undefined (0x01)
|
Input
|
Data (0x02)
|
Usage Page
|
Generic Desktop Controls (0x01)
|
Usage
|
Y (0x31)
|
Logical Maximum
|
255
|
Physical Maximum
|
255
|
Report Count
|
1
|
Report Size
|
8
|
Input
|
Data (0x02)
|
Logical Maximum
|
7
|
Physical Maximum
|
315
|
Report Size
|
4
|
Unit
|
20
|
Usage
|
Hat switch (0x39)
|
Input
|
Data (0x42)
|
Report Size
|
1
|
Report Count
|
4
|
Unit
|
0
|
Usage Page
|
Vendor-defined (0xff00)
|
Usage
|
Undefined (0x01)
|
Logical Maximum
|
1
|
Physical Maximum
|
1
|
Input
|
Data (0x02)
|
Report Count
|
2
|
Report Size
|
8
|
Logical Maximum
|
255
|
Physical Maximum
|
255
|
Usage
|
Undefined (0x02)
|
Input
|
Data (0x02)
|
End Collection
|
Collection
|
Logical (0x02)
|
Logical Maximum
|
255
|
Physical Maximum
|
255
|
Report Count
|
7
|
Report Size
|
8
|
Usage
|
Undefined (0x03)
|
Output
|
Data (0x02)
|
End Collection
|
End Collection
|
|
Get Reports (control endpoint)
FFB reports
Set Reports (control endpoint)
Interrupt IN report
byte index
|
bit 7
|
bit 6
|
bit 5
|
bit 4
|
bit 3
|
bit 2
|
bit 1
|
bit 0
|
[0]
|
Wheel axis LSB (unsigned, min = 0, max = 0x03ff, center = 0x0200)
|
[1]
|
left shift
|
right shift
|
triangle
|
circle
|
rectangle
|
cross
|
Wheel axis MSB
|
[2]
|
1
|
0
|
top-mid-bottom right
|
top-mid-bottom left
|
oxoo
|
ooxo
|
ooox
|
xooo
|
[3]
|
pedals (signed, center = 0x7f)
|
[4]
|
1
|
0
|
0
|
0
|
hat switch (Released=8, N=0, NE=1, E=2, SE=3, S=4, SW=5, W=6, NW=7)
|
[5-6]
|
0xffff
|
Interrupt OUT reports
TODO