G27 PS3
This is a reverse engineering of the USB interface of the G27 when connected to a PS3.
Contents
Compatibility mode
When plugged the G27 starts in compatibility mode and behaves as a Driving Force (product id 0xc294).
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 9bDescriptorType | 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
|
|
Product string
bLength | 34 |
bDescriptorType | STRING (0x03) |
bString | G27 Racing Wheel |
Get Reports (control endpoint)
FFB reports
TODO
Set Reports (control endpoint)
TODO
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] | l1
(left shift) |
r1
(right shift) |
triangle
(up) |
circle
(right) |
square
(down) |
cross
(left) |
Wheel axis MSB | |
[2] | 1 | 0 | r2
(top-mid-bottom right) |
l2
(top-mid-bottom left) |
oxoo
select |
ooxo
start |
ooox
r3 |
xooo
l3 |
[3] | unknown (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] | gas pedal (released = 0xFF) | |||||||
[6] | brake pedal (released = 0xFF) |
Interrupt OUT reports
TODO
Native mode
Once the native mode is enabled the G27 enumerates as a G27. Only the differences will be detailed.
Enumeration
Device descriptor
idProduct | 0xc29b |
Configuration descriptor
Configuration Descriptor
No difference.
Interface Descriptor
iInterface | Not Requested (254) |
HID Descriptor
bcdHID | 1.11 (0x0111) |
wDescriptorLength | 133 |
Endpoint Descriptor
wMaxPacketSize.PacketSize | 16 |
bInterval | 2 |
Endpoint Descriptor
wMaxPacketSize.PacketSize | 16 |
bInterval | 2 |
Report descriptor
The PS3 does not request it. It contains 3 more null bytes before the last two C0 bytes.
00 00 00 |
Interrupt IN report
byte index | bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
[0] | triangle | circle | square | cross | hat switch (D-Pad, Released=8, N=0, NE=1, E=2, SE=3, S=4, SW=5, W=6, NW=7) | |||
[1] | xooo
l3 |
ooox
r3 |
ooxo
start |
oxoo
select |
l2
(wheel button left up) |
r2
(wheel button right up) |
l1
(left shifter) |
r1
(right shifter) |
[2] | r5
(wheel button right down) |
r4
(wheel button right middle) |
gear 6 | gear 5 | gear 4 | gear 3 | gear 2 | gear 1 |
[3] | wheel (LSB) | l5
(wheel button left down) |
l4
(wheel button left middle) | |||||
[4] | wheel (MSB) (14-bit unsigned, min = 0, center = 0x2000, max = 0x3FFF) | |||||||
[5] | gas pedal (released = 0xFF) | |||||||
[6] | brake pedal (released = 0xFF) | |||||||
[7] | clutch pedal (released = 0xFF) | |||||||
[8] | shifter x axis (center = 0x80, left ~ 0x55, right ~ 0xab) | |||||||
[9] | shifter y axis (center = 0x80, down ~ 0x00, up ~ 0xff) | |||||||
[10] | 1 | reverse engaged | 0 | 1 | 1 | 1 | 0 | stick down |