The DRC SoC contains a GPIO controller that is used to control 8 external GPIO pins (of which 6 are used in the current firmware).
The following MMIO registers are used for GPIOs:
Address  | 
Name  | 
Connected to  | 
|---|---|---|
F0005100  | 
GPIO0  | 
Unknown, used in the LCD driver.  | 
F0005108  | 
GPIO1  | 
Unknown, unused in the LVC firmware.  | 
F000510C  | 
GPIO2  | 
Unknown, used in the NFC driver.  | 
F0005110  | 
GPIO3  | 
Unknown, called   | 
F0005114  | 
GPIO4  | 
Controls the rumble motor.  | 
F0005118  | 
GPIO5  | 
Controls the sensor bar power.  | 
F000511C  | 
GPIO6  | 
Unknown, used in the CMOS driver.  | 
F0005098  | 
GPIO7  | 
Unknown, unused in the LVC firmware.  | 
To configure a GPIO, write a combination of the following flags to the GPIO register:
Output: 0x200
Input: 0x800
0x1
0x1000
0x2000 (only set when 0x1000 is also set)
0x4000
0x8000
For example, to configure the rumble motor GPIO as an output GPIO with pull-up resistors:
write32(MMIO_GPIO4, 0x8200);
To configure it as an input GPIO with pull-up resistors:
write32(MMIO_GPIO4, 0x8800);
To set an output GPIO to 0/1, use the 0x100 bit:
// 0
write32(MMIO_GPIO4, read32(MMIO_GPIO4) & ~0x100);
// 1
write32(MMIO_GPIO4, read32(MMIO_GPIO4) | 0x100);
To read an input GPIO, use the 0x400 bit:
int x = read32(MMIO_GPIO4) & 0x400;