🔧

Build a USB-to-SNES Controller Adapter

Medium45–90 minutes💰 $34–54🧩 5 parts

🛒 Don't want to build? Buy a ready-made adapter and support Joypad.

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

  1. Disconnect the board
  2. Hold BOOT on the KB2040
  3. While holding, plug the USB-C cable into your computer
  4. Release BOOT
  5. RPI-RP2 drive appears

Flash

  1. Drag and drop the .uf2 file onto the RPI-RP2 drive
  2. Drive auto-ejects — firmware is flashed
  3. Done!

Step 5: Test It

Basic Test (Without SNES)

  1. Plug the adapter into your PC via USB-C
  2. Plug a USB controller into the USB-A port
  3. Open config.joypad.ai in Chrome
  4. You should see the controller in the input monitor
  5. Press buttons and verify they register

On the SNES

  1. Power off the SNES
  2. Plug the adapter into a controller port (the SNES cable end)
  3. Plug a USB controller into the adapter's USB-A port
  4. Power on the SNES
  5. 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

  1. Hold Select for 2 seconds
  2. Press D-Pad Up/Down to cycle profiles
  3. LED flashes to confirm
  4. 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?


Estimated build time: 45–90 minutes (includes soldering). Difficulty: Medium.

More Build Guides

Need help with this build?

Join our community for build support. Get help on Discord →