GPIO Controller

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).

Registers

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 TRM_ENABLE_POWER_GPIO in the NFC driver.
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.

Configuring a GPIO

To configure a GPIO, write a combination of the following flags to the GPIO register:

Direction
  • Output: 0x200
  • Input: 0x800
Unknown flags
  • 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);

Setting or reading a GPIO

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;