0% found this document useful (0 votes)
4 views

Gamecube Protocol – Simple Controllers

This document provides a detailed explanation of the Gamecube Controller protocol, including the pinout of the GCC connector and the data transmission process. It describes the console's probing signals, controller responses, and how data is transmitted via one wire, along with specific byte values for various buttons and triggers. Additionally, it highlights the importance of recalibration and the effects of the controller's initial position on data values.

Uploaded by

Renba Renbler
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views

Gamecube Protocol – Simple Controllers

This document provides a detailed explanation of the Gamecube Controller protocol, including the pinout of the GCC connector and the data transmission process. It describes the console's probing signals, controller responses, and how data is transmitted via one wire, along with specific byte values for various buttons and triggers. Additionally, it highlights the importance of recalibration and the effects of the controller's initial position on data values.

Uploaded by

Renba Renbler
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 7

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

home

products

resources

tutorials

projects

contact
© 2024, Simple Controllers Powered by Shopify

You might also like