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 (l1)
|
right shift (r1)
|
triangle (up)
|
circle (right)
|
rectangle (down)
|
cross (left)
|
Wheel axis MSB
|
| [2]
|
1
|
0
|
top-mid-bottom right
|
top-mid-bottom left
|
oxoo (select)
|
ooxo (start)
|
ooox (r3)
|
xooo (l3)
|
| [3]
|
pedals (signed, center = 0x7f)
|
| [4]
|
1
|
0
|
0
|
0
|
hat switch (D-Pad, 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