Build a USB-to-USB Controller Adapter
What Is This?
The USB2USB adapter lets you plug any supported USB controller into one side and get a standard USB gamepad out the other. Think of it as a universal controller translator.
Why would you want this?
- Use your favorite controller everywhere — Plug a DualSense into a PC that only expects Xbox, or a Switch Pro Controller into a PS3
- Output as XInput, PS3, PS4, Switch, or keyboard/mouse — Cycle between modes with a double-click
- Remap buttons via config.joypad.ai — no software to install
- Works on actual Xbox 360 consoles — XInput mode authenticates via XSM3
This is the simplest Joypad OS build. If you go with the Feather RP2040 USB Host board, you don't even need to solder — just flash the firmware and plug things in.
Choose Your Board
You have two paths here:
Option A: Adafruit Feather RP2040 USB Host (No Soldering!)
This board has a built-in USB-A host port, so your controller plugs right in. The USB-C port connects to your PC (or console) as the output. Zero wiring.
Best for: First-timers, people who just want it to work.
Option B: Raspberry Pi Pico + USB-A Breakout (Budget Build)
The Pico is cheaper but you'll need to wire up a USB-A port yourself. Four wires, a bit of soldering. Still very beginner-friendly.
Best for: Tinkerers, budget builds, people who already have a Pico lying around.
You can also use a Waveshare RP2040-Zero ($6, USB-C, ultra-compact) — same wiring as Pico but with different GPIO pins.
Parts List
Option A — Feather USB Host (No Soldering)
| Part | Price | Link |
|---|---|---|
| Adafruit Feather RP2040 USB Host | $11.95 | Adafruit |
| USB-C data cable | ~$5 | Any data-capable USB-C cable |
That's it. Seriously.
Option B — Raspberry Pi Pico (Budget)
| Part | Price | Link |
|---|---|---|
| Raspberry Pi Pico | $4.00 | Raspberry Pi |
| USB-A female breakout board | $2.50 | Adafruit |
| Micro-USB data cable | ~$5 | Must be a data cable |
| Jumper wires or 22–26 AWG wire | ~$3 | Any electronics supplier |
| Soldering iron + solder | — | If you don't already have one |
Wiring (Option B — Pico Only)
If you're using the Feather RP2040 USB Host, skip this section entirely. The USB-A port is built in and pre-wired.
You're connecting a USB-A female breakout board to the Pico so controllers can plug in.
USB-A Connector Pinout
┌───────────────────┐
│ 1 2 3 4 │
└───────────────────┘
VBUS D- D+ GND
(5V)
Pico Wiring
| Pico Pin | USB-A Pin | Signal | Wire Color (typical) |
|---|---|---|---|
| GPIO 16 (physical pin 21) | Pin 3 | D+ | Green |
| GPIO 17 (physical pin 22) | Pin 2 | D- | White |
| VBUS (physical pin 40) | Pin 1 | 5V power | Red |
| GND (physical pin 38) | Pin 4 | Ground | Black |
Waveshare RP2040-Zero Wiring
| RP2040-Zero Pin | USB-A Pin | Signal | Wire Color |
|---|---|---|---|
| GPIO 10 | Pin 3 | D+ | Green |
| GPIO 11 | Pin 2 | D- | White |
| 5V | Pin 1 | 5V power | Red |
| GND | Pin 4 | Ground | Black |
Wiring Tips
- ⚠️ Double-check D+ and D- — swapping them is the #1 mistake and everything will silently fail
- Keep wires under 15cm (6 inches) — USB signal quality degrades with length
- A breakout board with labeled pins is much easier than cutting a USB cable
- No USB hubs — connect your controller directly (PIO-USB doesn't support hubs)
Flash the Firmware
Step 1: Download the UF2
Go to github.com/joypad-ai/joypad-os/releases and download the right file for your board:
| Board | Firmware File |
|---|---|
| Feather RP2040 USB Host | joypad_*_usb2usb_feather.uf2 |
| Raspberry Pi Pico | joypad_*_usb2usb_pico.uf2 |
| Waveshare RP2040-Zero | joypad_*_usb2usb_rp2040zero.uf2 |
Step 2: Enter Bootloader Mode
- Unplug the board from your computer
- Hold down the BOOT button on the board
- While holding BOOT, plug the USB-C (or Micro-USB) cable into your computer
- Release BOOT after plugging in
- A drive named
RPI-RP2should appear on your computer
Trouble? Make sure you're using a data cable, not a charge-only cable. Try a different USB port. On macOS, check Disk Utility if the drive doesn't show up in Finder.
Step 3: Flash
- Drag and drop the
.uf2file onto theRPI-RP2drive - Wait a moment — the drive will automatically eject
- The board reboots with the new firmware
That's it! No special software, no command line.
Testing
- Connect the adapter to your PC via the USB-C (or Micro-USB) port — this is the output side
- Plug a USB controller into the USB-A port (built-in on Feather, or your wired breakout on Pico)
- Check that the adapter is recognized:
- Windows: Open "Set up USB game controllers" (joy.cpl) — you should see "Joypad HID Gamepad"
- macOS/Linux: Open a gamepad tester in your browser
- Press buttons and move sticks — they should show up in the tester
- Check LED status:
- 🟢 Solid green = no controller connected
- 🔵 Solid blue = 1 controller connected
- 🟣 Purple = 2 controllers connected
Try Different Output Modes
Double-click the board button to cycle through USB output modes:
SInput → XInput → PS3 → PS4 → Switch → Keyboard/Mouse → SInput
Triple-click to reset back to SInput (default).
The mode is saved to flash, so it persists across power cycles.
Web Configuration
For advanced setup, connect the adapter and open config.joypad.ai in Chrome or Edge. From there you can:
- Switch output modes
- Create and edit button remapping profiles
- Monitor controller inputs in real-time
- Test rumble
- Reboot into bootloader for firmware updates
Troubleshooting
Controller Not Detected
- Check your cable — charge-only cables won't work. You need a data cable.
- Verify wiring (Pico builds) — D+ and D- are almost certainly swapped if nothing works. Double-check GPIO 16 → D+ (green) and GPIO 17 → D- (white).
- Try a different controller — some controllers may not be supported yet. Check the controller compatibility list.
- No USB hubs — PIO-USB only supports direct connections.
RPI-RP2 Drive Doesn't Appear
- Hold BOOT before connecting USB, not after.
- Try a different USB cable (data-capable).
- Try a different USB port on your computer.
- Windows: Check Device Manager for "RP2 Boot" device.
- macOS: Check Disk Utility for an unmounted drive.
Controller Connects but Input is Wrong
- You may be in the wrong output mode. Triple-click the board button to reset to SInput.
- Open config.joypad.ai to check your current mode and profile.
- Some games expect XInput — double-click to cycle to XInput mode.
Controller Disconnects or Is Flaky
- Shorten your wires (Pico builds) — USB signals degrade over distance.
- Check for cold solder joints — reheat any connections that look dull or blobby.
- High-power controllers (Xbox with rumble) may need more current. Try powering the Pico via VSYS with a separate 5V supply.
What's Next?
- BT2USB Guide — Add Bluetooth support so wireless controllers work too
- USB2GC Guide — Use your USB controller on a real GameCube
- Controller Archive — Full list of supported controllers
- Web Configurator — Customize button mappings and output modes
- Community Discord — Share your build, get help
Estimated build time: 15 minutes (Feather, no soldering) or 30–45 minutes (Pico, with wiring). Difficulty: Easy.