GPIO

The gamepad has registers in the F0005xxx space that allow direct control over the SoC's I/O lines.

Here is a list of the known GPIO registers, as well as the values the stock firmware initializes them to.

Address Init. Desc.
0xF000502C 0x8000 ?
0xF0005038 0x8000 ?
0xF000503C 0x0001 ?
0xF0005040 0x0001 ?
0xF0005044 0x0001 ?
0xF0005048 0x8000 ?
0xF000504C 0x0001 ?
0xF0005050 0x0001 ?
0xF0005054 0x0001 ?
0xF0005058 0x0001 ?
0xF000505C 0x0001 ?
0xF0005060 0x0001 ?
0xF0005064 0x0001 ?
0xF0005068 0x0001 ?
0xF000506C 0x0001 ?
0xF0005070 0x0001 ?
0xF0005074 0x8001 ?
0xF0005078 0x0001 ?
0xF0005080 0x0000 ?
0xF0005084 0x0000 ?
0xF0005088 0x0000 ?
0xF000508C 0x0000 ?
0xF0005090 0x0000 ?
0xF0005094 0x0000 ?
0xF0005098 0xC000 ?
0xF000509C 0x8001 ?
0xF00050A0 0x8001 ?
0xF00050AC 0xC001 ?
0xF00050B0 0xC001 ?
0xF00050B4 0xC001 ?
0xF00050B8 0xC001 ?
0xF00050BC 0xC001 ?
0xF00050C0 0xC001 ?
0xF00050C4 0x0000 ?
0xF00050C8 0x0000 ?
0xF00050CC 0x0000 ?
0xF00050D0 0x0000 ?
0xF00050D4 0x8001 ?
0xF00050D8 0x0001 ?
0xF00050DC 0x8001 ?
0xF00050E0 0x8001 ?
0xF00050E4 0x0001 ?
0xF00050E8 0x0001 ?
0xF00050EC 0x8001 SPI - clock
0xF00050F0 0x0001 SPI - MISO
0xF00050F4 0x8001 SPI - MOSI
0xF00050F8 0xC300 SPI - Flash chipselect
0xF00050FC 0xC300 SPI - UIC chipselect
0xF0005100 0xC200 LCD - ?? toggled before I2C comm.
0xF0005104 0xC300 SPI - chipselect for mystery 3rd device
0xF0005108 0x8000 ?
0xF000510C 0xD800 ? - NFC related
0xF0005110 0xF200 ? - NFC related
0xF0005114 0x8000 Rumble motor
0xF0005118 0x8000 Sensor bar power
0xF000511C 0x8000 ? - camera related

GPIO register format:

Bits Desc.
0 ???
8 Output value
9 Output mode (1=output)
10 Input value (read-only)
11 Input mode (1=input)
12 ???
13 ???
14 ???
15 ???

There are probably settings for pullup/pulldown resistors hiding in the unknown bits. It is also unknown what happens if both bit9 and bit11 are set.

Note: when the LSB of the hardware ID register (0xF0000000) is 0x41, bit14 and bit15 seem to be swapped.

Important note: improper GPIO configurations may cause shorts.