Build a USB-to-SNES Controller Adapter
⚠️ Coming Soon — USB2SNES firmware is currently in development and has not been released yet. This guide is published early so you can gather parts and prepare. We'll update it when the firmware is available for download.
What Is This?
USB2SNES lets you use any modern USB controller (Xbox, PlayStation, Switch, 8BitDo, etc.) on a real Super Nintendo console. Plug your favorite USB controller into the adapter, plug the adapter into a SNES controller port, and play.
Why would you want this?
- Use a modern controller on your SNES — better ergonomics, wireless options (via USB dongles)
- 3 button mapping profiles — Default, Fighting, and Platformer layouts
- Profile switching on the fly — Hold Select + D-Pad to cycle profiles
- Copilot mode — merge multiple USB controllers into one SNES input
- Analog stick to D-pad — left stick is automatically converted to digital D-pad input
The SNES has 8 buttons (A, B, X, Y, L, R, Start, Select) plus a D-pad — no analog sticks. The adapter maps modern controller inputs to these buttons using configurable profiles.
Parts List
| Part | Price | Where to Buy |
|---|---|---|
| Adafruit KB2040 | $8.95 | Adafruit |
| USB-A female breakout board | $2.50 | Adafruit |
| SNES controller extension cable | $5–8 | Amazon / AliExpress |
| 22–26 AWG wire | $3–5 | Any electronics supplier |
| Soldering iron + solder | $15–30 | If you don't have one |
| USB-C data cable | ~$5 | For flashing firmware |
Total: ~$25–35 (less if you already have a soldering iron and wire).
Step 1: Prepare the SNES Cable
Cut one end off a SNES controller extension cable. You'll solder the loose wires to your KB2040.
SNES Controller Port Pinout
Looking at the controller plug (from the cable end):
┌──┬──┬──┬──┬──┬──┬──┐
│ 1│ 2│ 3│ 4│ 5│ 6│ 7│
└──┴──┴──┴──┴──┴──┴──┘
| Pin | Signal | Description |
|---|---|---|
| 1 | +5V | Power from console |
| 2 | Clock | Clock signal from console |
| 3 | Latch | Latch signal from console |
| 4 | Data | Serial data to console (active low) |
| 5 | N/C | Not connected |
| 6 | N/C | Not connected (IOBit on some controllers) |
| 7 | GND | Ground |
Strip about 5mm of insulation from each wire. Use a multimeter in continuity mode to identify which wire is which — SNES cables aren't always color-coded consistently.
Step 2: Wire the SNES Connection
KB2040 → SNES Controller Port
| KB2040 Pin | SNES Cable Pin | Signal | Notes |
|---|---|---|---|
| GPIO 7 | Pin 4 | DATA | Serial data out to console (PIO-driven) |
| GPIO 9 | Pin 3 | LATCH | Latch input from console |
| GPIO 10 | Pin 2 | CLOCK | Clock input from console |
| GPIO 6 | Pin 1 | 3.3V Detect | Console power detection (via voltage divider or direct 3.3V) |
| RAW/5V | Pin 1 | 5V Power | Powers the adapter from the SNES |
| GND | Pin 7 | Ground | Common ground |
Important: LATCH and CLOCK must be on consecutive GPIO pins (GPIO 9 and GPIO 10) for the PIO state machine to work correctly.
Auto-bootloader: When the adapter is powered from USB (not from the SNES), GPIO 6 won't detect console power, and the firmware automatically enters bootloader mode for easy flashing. No need to hold the BOOT button!
Step 3: Wire the USB Host Port
Connect a USB-A breakout board to the KB2040 for controller input. This is the same USB host wiring used in other Joypad adapters.
USB-A Connector Pinout
┌───────────────────┐
│ 1 2 3 4 │
└───────────────────┘
VBUS D- D+ GND
(5V)
KB2040 → USB-A Host
| KB2040 Pin | USB-A Pin | Signal | Wire Color (typical) |
|---|---|---|---|
| GPIO 16 | Pin 3 | D+ | Green |
| GPIO 17 | Pin 2 | D- | White |
| RAW/5V | Pin 1 | VBUS (5V) | Red |
| GND | Pin 4 | Ground | Black |
Wiring Tips
- ⚠️ D+ and D- are the #1 mistake — if your USB controller isn't detected, these are almost certainly swapped
- Keep USB wires under 15cm (6 inches)
- No USB hubs — PIO-USB only supports direct controller connections
- A USB-A breakout board with labeled pins is much easier than cutting a cable
Step 4: Flash the Firmware
⚠️ Firmware not yet released. USB2SNES is in active development. Check github.com/joypad-ai/joypad-os/releases for availability.
Download the UF2
When available, download the right file for your board from the releases page:
| Board | Firmware File |
|---|---|
| KB2040 | joypad_*_usb2snes_kb2040.uf2 |
Enter Bootloader Mode
Option A (automatic): If the adapter isn't plugged into a SNES, just connect it to your computer via USB-C — it enters bootloader mode automatically.
Option B (manual):
- Disconnect the board
- Hold BOOT on the KB2040
- While holding, plug the USB-C cable into your computer
- Release BOOT
RPI-RP2drive appears
Flash
- Drag and drop the
.uf2file onto theRPI-RP2drive - Drive auto-ejects — firmware is flashed
- Done!
Step 5: Test It
Basic Test (Without SNES)
- Plug the adapter into your PC via USB-C
- Plug a USB controller into the USB-A port
- Open config.joypad.ai in Chrome
- You should see the controller in the input monitor
- Press buttons and verify they register
On the SNES
- Power off the SNES
- Plug the adapter into a controller port (the SNES cable end)
- Plug a USB controller into the adapter's USB-A port
- Power on the SNES
- Navigate menus and test in a game
LED Status
- 🟣 Purple breathing = no controller connected (SNES theme color)
- 🟣 Solid purple = controller connected (Player 1)
- 🔵 Blue = Player 2 connected
Button Mapping Profiles
USB2SNES has 3 built-in button mapping profiles optimized for different game genres:
How to Switch Profiles
- Hold Select for 2 seconds
- Press D-Pad Up/Down to cycle profiles
- LED flashes to confirm
- Profile saves to flash — persists across power cycles
Default Profile
Standard SNES mapping — good for most games.
| Your Controller | SNES Button |
|---|---|
| Cross / B | B |
| Circle / A | A |
| Square / X | Y |
| Triangle / Y | X |
| L1 / LB | L |
| R1 / RB | R |
| L2 / LT | L |
| R2 / RT | R |
| Select / Back | Select |
| Start | Start |
| Left Stick | D-pad |
Fighting Profile
Optimized for Street Fighter II and other 6-button fighters.
| Your Controller | SNES Button |
|---|---|
| Cross / B | B (light kick) |
| Circle / A | A (medium kick) |
| Square / X | Y (light punch) |
| Triangle / Y | X (medium punch) |
| L1 / LB | L (heavy punch) |
| R1 / RB | R (heavy kick) |
| Select | Disabled (used for profile switching) |
Platformer Profile
Optimized for Super Mario World, Donkey Kong Country, etc. Triggers mapped to Y (run) for ergonomic run+jump.
| Your Controller | SNES Button |
|---|---|
| Cross / B | B (jump) |
| Circle / A | A (spin jump) |
| Square / X | Y (run) |
| Triangle / Y | X (run alt) |
| L2 / LT | Y (run — left trigger) |
| R2 / RT | Y (run — right trigger) |
Troubleshooting
SNES Doesn't Detect the Adapter
- Check your SNES cable wiring — especially DATA on GPIO 7, LATCH on GPIO 9, CLOCK on GPIO 10
- Make sure 5V and GND are connected from the SNES controller port
- Verify the 3.3V detect connection on GPIO 6
- Try a different controller port on the SNES
USB Controller Not Detected
- D+ and D- swapped is the #1 cause — verify GPIO 16 → D+ (green) and GPIO 17 → D- (white)
- Make sure VBUS is providing 5V to the USB-A connector
- Try a different controller
- Check the controller compatibility list
Buttons Feel Wrong
- You might be on the wrong profile — Hold Select + D-Pad to cycle through Default, Fighting, and Platformer
- The default profile maps Cross→B and Circle→A — this follows SNES positional layout
Adapter Goes Into Bootloader When Plugged Into SNES
- Check the GPIO 6 → Pin 1 (5V) connection — this pin detects console power
- Without this connection, the firmware thinks it's USB-only and enters bootloader mode
RPI-RP2 Drive Doesn't Appear
- Hold BOOT before connecting USB
- Try a different cable (data-capable)
- Try a different USB port
What's Next?
- USB2NES Guide — Same concept for the NES
- USB2GC Guide — Use your USB controller on a GameCube
- USB2USB Guide — Simpler build for USB-to-USB
- Controller Archive — Full compatibility list
- Community Discord — Share your build, get help
Estimated build time: 45–90 minutes (includes soldering). Difficulty: Medium.