# USB Gecko Protocol USB Gecko communicates with a GameCube or Wii via EXI bus. In essence, EXI bus acts like well known SPI. ## Commands If command names are confusing to you, read them as if you were issuing commands from PC to console i.e. `0xA Receive Byte` means "read 1 byte from GC". These commands were documented by studying `Shuriken USB` VHDL code. The official `USB Gecko` and `USB Gecko SE` supported more commands like 16 bit reads/writes or NOR flash access. All commands are 4 bits long. ### `[0xA]` Receive Byte (GC <- PC) Receive 1 byte of data from PC. `RX Status` bit tells there was data in FIFO. If `RX Status = 1` you should discard the data. ##### Command: | Bit | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |:---:|:--:|:--:|:--:|:--:|:--:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| | In | 1 | 0 | 1 | 0 | X | X | X | X | X | X | X | X | X | X | X | ##### Response: | Bit | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |:---:|:--:|:--:|:--:|:---------:|:--:|:-:|:-:|:-------:|:-:|:-:|:-:|:-:|:-:|:-:|:-------:| | Out | X | X | X | 1 | X | X | X | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | | | | | | RX Status | | | | Data[7] | | | | | | | Data[0] | | Bit | Name | Note | |:--------:|:---------:|:------------------------| | Out[11] | RX Status | 0: no data, 1: has data | | Out[7:0] | Data | Data received from PC | ### `[0xB]` Send Byte (GC -> PC) Send 1 byte of data to PC. `TX Status` bit tells you if device was ready to accept data. If `TX Status = 1` the data could not be written and you should retry. ##### Command: | Bit | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |:---:|:---:|:--:|:--:|:-:|:-------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| | In | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | | | Cmd | | | | Data[7] | | | | | | | | | ##### Response: | Bit | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |:---:|:--:|:--:|:--:|:-:|:---------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| | Out | X | X | X | X | 1 | X | X | X | X | X | X | X | X | | | | | | | TX Status | | | | | | | | | | Bit | Name | Note | |:--------:|:---------:|:----------------------| | Out[11] | TX Status | 0: sent, 1: not sent | | Out[7:0] | Data | Data received from GC | ### `[0xC]` Check TX Status Checks if PC is ready to accept data. ##### Command: | Bit | 4 | 3 | 2 | 1 | 0 | |:---:|:-:|:-:|:-:|:-:|:-:| | In | 1 | 1 | 0 | 0 | X | ##### Response: | Bit | 4 | 3 | 2 | 1 | 0 | |:---:|:-:|:-:|:-:|:-:|:---------:| | Out | 0 | 0 | 0 | 0 | 1 | | | | | | | TX Status | | Bit | Name | Note | |:--------:|:---------:|:------------------------------| | Out[0] | RX Status | 0: can write, 1: do not write | ### `[0xD]` Check RX Status Checks if there is data from PC available for read. ##### Command: | Bit | 4 | 3 | 2 | 1 | 0 | |:---:|:-:|:-:|:-:|:-:|:-:| | In | 1 | 1 | 0 | 1 | X | ##### Response: | Bit | 4 | 3 | 2 | 1 | 0 | |:---:|:-:|:-:|:-:|:-:|:---------:| | Out | 0 | 0 | 0 | 0 | 1 | | | | | | | RX Status | | Bit | Name | Note | |:--------:|:---------:|:------------------------| | Out[0] | RX Status | 0: no data, 1: has data | ### `[0xE]` Receive and Send Byte (GC <-> PC) Writes and reads 1 byte of data. `RX Status` bit tells you there was data on the FIFO. `TX Status` bit tells you if device was ready to accept data. ##### Command: | Bit | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |:---:|:---:|:--:|:--:|:-:|:--------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:--------:| | In | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | | | Cmd | | | | Write[7] | | | | | | | | Write[0] | | Bit | Name | Note | |:-------:|:-----:|:---------------------------| | In[7:0] | Write | Data to be sent to console | ##### Response: | Bit | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |:---:|:--:|:--:|:--:|:---------:|:---------:|:-------:|:-:|:-:|:-:|:-:|:-:|:-:|:-------:| | Out | X | X | X | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | | | | | | RX Status | TX Status | Read[7] | | | | | | | Read[0] | | Bit | Name | Note | |:--------:|:---------:|:--------------------------| | Out[9] | RX Status | 0: no data, 1: has data | | Out[8] | TX Status | 0: can write, 1: not sent | | Out[7:0] | Read | Data received from GC | ### `[0x7]` LED Off Turns off onboard LED. ##### Command: | Bit | 3 | 2 | 1 | 0 | |:---:|:---:|:-:|:-:|:-:| | In | 0 | 1 | 1 | 1 | | | Cmd | | | | ### `[0x7]` LED On Lights up onboard LED. ##### Command: | Bit | 3 | 2 | 1 | 0 | |:---:|:---:|:-:|:-:|:-:| | In | 1 | 0 | 0 | 0 | | | Cmd | | | | ### `[0x9]` Identify USB Gecko This commands identifies the device as USB Gecko. The typical `0x00` EXI command used to identify devices like Memory Cards or Broadband Adapter is not implemented and will return `0x00`. You have to use `0x9` USB Gecko specific command to be sure the device is present. Correct response is `ID: 0x8E`. ##### Command: | Bit | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |:---:|:---:|:--:|:--:|:-:|:--------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:--------:| | In | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | | | Cmd | | | | Write[7] | | | | | | | | Write[0] | ##### Response: | Bit | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |:---:|:--:|:--:|:-:|:-:|:-----:|:-:|:-:|:-:|:-:|:-:|:-:|:-----:| | Out | X | X | X | X | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | | | | | | | ID[7] | | | | | | | ID[0] | | Bit | Name | Note | |:--------:|:----:|:---------------------------------| | Out[7:0] | ID | Device identifier, always `0x8E` |