Gamecube Protocol

This document is a in-depth explanation on the Gamecube Controller protocol and how it works.

 

Pinout of GCC Connector, looking into female connector.

1 - Yellow - 5v (For Rumble)

2 - Red - Data

3 - Green - Ground

4 - White - Ground (For Rumble)

5 - NC (Not Connected)

6 - Blue - 3.3v

7 - Black - Cable Shielding (Ground)

 

Green and black share a common ground.

Yellow and white are isolated from the 3.3v power/signal/ground lines.

-------------------------------------------------------------------------------------------------------------------

Protocol:

Console probes: 

  • 0x00 - 0000 0000

  • Stop Bit

Sometimes 0xFF - 1111 1111 can be sent instead of 0000 0000, this tells the controller to recalibrate.

 

Controller responds: 

  • 0x09 - 0000 1001

  • 0x00 - 0000 0000

  • 0x03 - 0000 0011

  • Stop Bit

-------------------------------------------------------------------------------------------------------------------

Console probes origin:

  • 0x41 - 0100 0001

  • Stop Bit

0x42 - 0100 0010 can be sent instead of 0x41, meaning the controller is being asked to recalibrate.

 

Controller responds origin (Number after colon represents number of bits that buttons/axis is represented by):

  • 0, 0 ,0 , Start : 1, Y : 1, X : 1, B : 1, A : 1

  • 1, L : 1 , R : 1, Z : 1, D-Up : 1, D-Dn : 1, D-Rt : 1, D-Lt : 1

  • Analog Stick X Value : 8 (256 values)

  • Analog Stick Y Value : 8

  • C-Stick X Value : 8

  • C-Stick Y Value : 8

  • L-Trigger : 8

  • R-Trigger : 8

  • 0x00 - 0000 0000

  • 0x00 - 0000 0000 (2 null bytes)

  • Stop Bit

Sometimes instead of the two null bytes 0x02, is sent for both bytes and noted by NiceMitch.  Unsure what this flags but is worth noting.

 

-------------------------------------------------------------------------------------------------------------------

 

Console responds poll request:

  • 0x40 - 0100 0000

  • 0x03 - 0000 0011

  • 0, 0, 0, 0, 0 , 0, Rumble Activated Before : 1, Rumble : 1

  • Stop Bit

The second byte is a little tricky 0x03 is the typical value the rest are requesting special data formats (0x00, 0x01, 0x02).  Nicohood has more info in Gamecube.c, line 179.

This last byte is relatively unknown and usually deals with Rumble.   Usually the bit before Rumble will turn to a 1, if Rumbles been activated before and 0 if it has not.  (Could be related to rumble brake).  Therefore typical responses are 0x03, 0x02, 0x01, 0x00.

If you are coding this I would only focus on the last 2 bits for the last two bytes (first byte should be read as normal), ignore the rest incase of any unknown protocols/formats.  

 

Controller responds values (Same as origin without the two null bytes):

  • 0, 0 ,0 , Start : 1, Y : 1, X : 1, B : 1, A : 1

  • 1, L : 1 , R : 1, Z : 1, D-Up : 1, D-Dn : 1, D-Rt : 1, D-Lt : 1

  • Analog Stick X Value : 8 (256 values)

  • Analog Stick Y Value : 8

  • C-Stick X Value : 8

  • C-Stick Y Value : 8

  • L-Trigger : 8

  • R-Trigger : 8

  • Stop Bit

 

-------------------------------------------------------------------------------------------------------------------

The console and controller will then continue the last two sequences until a controller is disconnected.  If a controller is disconnected the console will go back to probing for a controller.

 

Data is transmitted via one wire and this is how it looks.  High bits are 1us lows followed by 3us highs,  LOW bits are 3us lows followed by 1us highs, Stop bits are 1 us lows followed by 2us highs

  • HIGH bits are 1us lows followed by 3us highs

  • LOW bits are 3us lows followed by 1us highs

  • STOP bits are 1 us lows followed by 2us highs


The official console will report bits slightly differently where instead of 4us for a bit it will be 5us.  Meaning 3.75us and 1.25us (instead of 3, 1 and 1, 3 uS respectively).

 

Example on how bits would be read (Picture used is from the Sammy Keyboard Controller Protocol):

 

 

Explanation how origin sequence and controller bytes are read:

Controller data is sent as a byte, (8 bits, 0-255 in decimal).  This means that 128 by default is the center value and you can go 127 units to the right, and 128 units to the left (the Phob controller uses 127 as its center coordinate).

But depending where you controller origins (where the controller starts out at), this changes.  This means that if you were to plug in your controller and you stick as at 129, 131 (x, y).  Your controllers' values are now all offset by that amount.  Meaning that 129, 131 is your new center.  130, is one unit to the right, and 127, is two units to the left.  This same thing goes for the Y value except for the fact that in relative to its initial position (131), for it to go one unit up it would now be 132, and two units down would be 129!

For analog triggers it is also sent as a byte (0-255), but uses normal logic of 0 is lowest value 255 is highest.

In relation to voltage values 0v is sent as 0, 3.3v is sent as value 255 in binary.

 

These are good sources that were used in this document, I would highly recommend looking through them:

http://www.int03.co.uk/crema/hardware/gamecube/gc-control.html

https://github.com/NicoHood/Nintendo

 

Back to blog