USBRetro is an open source controller adapter firmware for converting USB controllers, keyboards, and mice to various retro consoles' native controller protocols.
USB-2-PCE controlleradapter.com/products/usb-2-pce
NUON USB controlleradapter.com/products/nuon-usb
- Download the latest release usbretro_[console].uf2 file.
- Disconnected adapter from the console and all connected USB devices.
- While holding the boot(+) button, connect the USB-C port to a computer.
- A virual drive called RPI-RP2 will appear, drag-n-drop the UF2 update file onto the drive.
- The virtual drive will automatically unmount when the update is completed. 🚀
GC USB controlleradapter.com/products/gc-usb
- Download the latest release usbretro_ngc.uf2 file.
- Disconnected adapter from the console and all connected USB devices.
- Connect the USB-C port to a computer.
- A virual drive called RPI-RP2 will appear, drag-n-drop the UF2 update file onto the drive.
- The virtual drive will automatically unmount and remount when the update is completed. 🚀
- USB Hubs (up to 5 devices)
- USB HID Keyboards/Mice (maps to controller)
- X-input Controllers (Xbox OG/360/One/SeriesX|S)
- D-input Controllers (generic HID gamepad|joystick)
- PlayStation (PSClassic/DS3/DS4/DualSense)
- Switch (SwitchPro/JoyConGrip)
- 8BitDo Controllers/Adapters
- PCEngine 2.4g
- M30 2.4g/BT
- NeoGeo 2.4g
- Wireless Adapter 1 (Grey/Red)
- Wireless Adapter 2 (Black/Red)
- Logitech Wingman Action Pad
- Sega Astrocity controller/joystick
- Hori Pokken and Horipad controllers
- DragonRise Generic USB controllers
- PCEngine/TurboGrafx-16
- Multitap (1-5 players)
- PCEngine Mouse
- 2-button Controller
- 3-button Controller
- 6-button Controller
- Nuon DVD Players
- Standard controller output
- Spinner controller output for Tempest 3000
- GameCube/Wii
- Standard Controller (with rumble)
- GameCube Keyboard (scroll lock to enable)
- Copilot (combine up to 4 controllers into one)
- Xbox One S (USB host controller mod)
- Full button and analog value passthrough
- Rumble passthrough
- CD-i
- 2-player Splitter
- Standard Controller
- CD-i Mouse Output
- 3DO
- Daisy-chaining (1-8 controllers)
- 3DO Mouse Output
- 3DO Arcade Start/Coin (Orbatak/Shootout at Old Tucson)
- Sega Dreamcast
- Standard Controller
- Dreamcast Keyboard
- Virtual VMU/Rumble Pack
- Any retro console or computer..
If you run into any issues, then please submit a bug report on the issues tab of this repo. If you would like to see support for specific USB controllers or think of something I missed, then you are welcome to open a feature request under the issues tab. Don't be shy. 👂
USBRetro | X-input | Switch | PlayStation | DirectInput |
---|---|---|---|---|
B1 | A | B | Cross | 2 |
B2 | B | A | Circle | 3 |
B3 | X | Y | Square | 1 |
B4 | Y | X | Triangle | 4 |
L1 | LB | L | L1 | 5 |
R1 | RB | R | R1 | 6 |
L2 | LT | ZL | L2 | 7 |
R2 | RT | ZR | R2 | 8 |
S1 | Back | Minus | Select/Share | 9 |
S2 | Start | Options | Start/Option | 10 |
L3 | LS | LS | L3 | 11 |
R3 | RS | RS | R3 | 12 |
A1 | Guide | Home | PS | 13 |
A2 | Capture | Touchpad | 14 |
USBRetro | PCEngine | Nuon | GameCube | Xbox One |
---|---|---|---|---|
B1 | II | A | B | A |
B2 | I | C-Down | A | B |
B3 | IV (turbo II) | B | Y | X |
B4 | III (turbo I) | C-Left | X | Y |
L1 | VI | L | L | LB |
R1 | V | R | R | RB |
L2 | C-Up | L (switch Z) | LT | |
R2 | C-Right | R (switch Z) | RT | |
S1 | Select | Nuon | Z | Back |
S2 | Run | Start | Start | Start |
L3 | LS | |||
R3 | RS | |||
A1 | Guide | |||
A2 | Nuon | Z |
First, clone the pico-sdk repo to your local dev environment. Then point the PICO_SDK_PATH
environment variable to it.
cd ~/git
git clone https://github.com/raspberrypi/pico-sdk.git
cd ~/git/pico-sdk
git submodule init
git submodule update
export PICO_SDK_PATH=~/git/pico-sdk
Then the TinyUSB library within pico-sdk should be on the latest master
branch. Change to that directory and checkout master
if not already on it.
cd ~/git/pico-sdk/lib/tinyusb
git checkout master
Once you have cloned this repo to your local environment. The external submodule dependencies must be initialized and updated.
cd ~/git
git clone https://github.com/RobertDaleSmith/usbretro.git
cd ~/git/usbretro
git submodule init
git submodule update
Finally, run the specific microcontroller build script to create a src/build
directory.
cd ~/git/usbretro/src
sh build_ada_kb2040.sh
To build all the various console specific firmwares:
cd ~/git/usbretro/src/build
cmake ..
make
If you ever want to build firmware for only a single output console, then you can use make usbretro_[console]
.
make usbretro_pce
make usbretro_ngc
make usbretro_nuon
make usbretro_xb1
Join 👉 discord.usbretro.com
- Ha Thach's excellent TinyUSB library and controller example
- David Shadoff for building PCEMouse which laid the foundation
- Ryzee119 for the wonderful tusb_xinput library for X-input support
- SelvinPL for the robust lufa-hid-parser example for generic HID gamepad support
- JonnyHaystack for the awesome joybus-pio for GameCube controller output