Skip to content

usb2gc

USB/BT controllers to GameCube/Wii console.

Overview

Connects USB and Bluetooth controllers to a GameCube or Wii console via the joybus protocol. Supports 5 button mapping profiles, keyboard mode for PSO, copilot mode (merge multiple controllers), and rumble feedback. Requires 130MHz overclock for joybus timing.

Input

  • USB HID, XInput, Bluetooth controllers
  • USB keyboard (keyboard mode for Phantasy Star Online)
  • USB mouse (mapped to analog stick)

Output

GameCube Output -- joybus PIO protocol on a single port.

Core Configuration

Setting Value
Routing mode MERGE (all inputs blended to one output)
Player slots 4 (fixed assignment)
Max USB devices 4
Clock speed 130MHz (required for joybus)
Profile system 5 profiles, saved to flash

Profiles

Hold Select for 2 seconds, then press D-Pad Up/Down to cycle. Controller rumbles and LED flashes to confirm. Profile persists across power cycles.

Profile Description
Default Standard mapping for most games
SNES L/R as full analog press, Select mapped to Z
SSBM Super Smash Bros. Melee competitive (light shield, multi-jump, 85% stick sensitivity)
MKWii Mario Kart Wii (LB=wheelie, RB=drift, RT=item throw)
Fighting 2D fighters (right stick disabled, LB=C-Up macro)

See the Profiles (Detailed) section below for full button mapping tables per profile.

Key Features

  • Keyboard mode -- Toggle with Scroll Lock or F14. Works with PSO and other GC keyboard games.
  • Copilot mode -- Multiple controllers merge into one output. All inputs OR'd together.
  • Rumble -- Forwarded to compatible controllers (Xbox, DualShock 3/4/5, Switch Pro, 8BitDo).
  • Adaptive triggers -- DualSense L2/R2 analog mapped to GC L/R with configurable threshold.

Supported Boards

Board Build Command
KB2040 make usb2gc_kb2040
RP2040-Zero make usb2gc_rp2040zero

Build and Flash

make usb2gc_kb2040
make flash-usb2gc_kb2040

Profiles (Detailed)

Default Profile

Standard mapping for most games:

USB Input GameCube Output
B1 (Cross/A) B
B2 (Circle/B) A
B3 (Square/X) Y
B4 (Triangle/Y) X
L1 (LB/L) (disabled)
R1 (RB/R) Z
L2 (LT/ZL) L (analog)
R2 (RT/ZR) R (analog)
S1 (Select) (profile switch)
S2 (Start) Start
D-Pad D-Pad
Left Stick Control Stick
Right Stick C-Stick

SNES Profile

For SNES-style controllers (L/R as full press):

USB Input GameCube Output
L1 (LB) L (digital + full analog)
R1 (RB) R (digital + full analog)
S1 (Select) Z
Other Same as Default

SSBM Profile

Super Smash Bros. Melee competitive mapping:

USB Input GameCube Output Notes
B1 (Cross/A) B Attack
B2 (Circle/B) A Jump
B3 (Square/X) Y Jump
B4 (Triangle/Y) X Jump
L1 (LB) Z Grab
R1 (RB) X Short hop aerial
L2 (LT @ 88%) L (17% analog) Light shield
R2 (RT @ 55%) L+R Quit combo
Left Stick 85% sensitivity Precision movement

Key features: light shield at 17% on L trigger, quick quit combo (L+R+Start) on RT, multiple jump buttons (A, X, Y, RB), 85% stick sensitivity for precise movement.

MKWii Profile

Mario Kart Wii optimized:

USB Input GameCube Output Notes
L1 (LB) D-Up Wheelies/tricks
R1 (RB) R (full analog) Drift
R2 (RT) Z (instant) Item throw
Other Same as Default

Fighting Profile

2D fighting game layout:

USB Input GameCube Output Notes
L1 (LB) C-Up Macro input
R1 (RB) Z
Right Stick Disabled Prevents accidental input
Other Same as Default

Troubleshooting

Controller not detected by console: - Check GameCube cable connections (data, 3.3V, ground). - Verify the data pin assignment matches your board.

Rumble not working: - Only compatible USB/BT controllers support rumble feedback. - Check USB power supply -- rumble requires more current. Use a powered USB hub for multiple controllers.

Profile not saving: - Wait 5 seconds after changing the profile for the flash write to complete. - Reflash firmware if flash memory appears corrupted.

Keyboard mode not activating: - Press Scroll Lock or F14 on the connected USB keyboard. - Check the LED indicator for keyboard mode status.

Stick drift or incorrect calibration: - GameCube expects analog center at 128. USB controllers are auto-calibrated. - Check for physical stick drift on the input controller.