Skip to content

Universal controller firmware core for adapters and custom controllers.

License

Notifications You must be signed in to change notification settings

joypad-ai/joypad-os

Repository files navigation

Joypad OS

Joypad OS

Universal controller firmware foundation for adapters, controllers, and input systems.

Joypad OS is a modular, high-performance firmware platform for building controller adapters, custom controllers, and input/output bridges across USB, Bluetooth, and native game console protocols.

Formerly known as USBRetro, this project now serves as the foundational firmware layer of the Joypad ecosystem — a universal platform for extending how controllers work, connect, and evolve.

Joypad OS focuses on real-time controller I/O, protocol translation, and flexible routing, making it easy to build everything from classic console adapters to next-generation, assistive, and AI-augmented input devices.


What Joypad OS Enables

  • Universal input/output translation — Convert USB HID devices into native console protocols and vice versa.
  • Modular firmware apps — Build specific bridges like usb2usb, usb2gc, snes2usb, passthrough adapters, merged inputs, and hybrid devices — all on a shared core.
  • Flexible routing & passthrough — Support multi-output controllers, input merging, chaining devices, and advanced mods.
  • Hardware-agnostic foundation — Designed to run across RP2040 today, with future portability to ESP32 and nRF platforms.
  • Foundation for accessibility & assistive play — Enables custom controllers and input extensions for gamers with diverse needs.

Joypad OS is the real-time nervous system of the Joypad platform.


Supported Outputs

Output Features Documentation
USB Device HID Gamepad, XInput, Xbox OG, Xbox One, XAC, PS3, PS4, PS Classic, Switch Docs
PCEngine / TurboGrafx-16 Multitap (5 players), Mouse, 2/3/6-button Docs
GameCube / Wii Profiles, Rumble, Keyboard mode Docs
Sega Dreamcast VMU emulation, Rumble, Profiles Docs
Nuon DVD Players Controller, Spinner (Tempest 3000), IGR Docs
3DO Interactive Multiplayer 8 players, Mouse, Extension passthrough Docs
Neo Geo / SuperGun Profiles, 1L6B layouts Docs
Casio Loopy 4 players (experimental) Docs

Supported Input Devices

USB Controllers:

  • Xbox (OG/360/One/Series X|S, 360 Wireless Adapter)
  • PlayStation (Classic/DS3/DS4/DualSense)
  • Nintendo (Switch Pro, Switch 2 Pro, NSO GameCube, GameCube adapter)
  • 8BitDo (PCE 2.4g, M30, BT Adapters)
  • Hori (Horipad, Pokken Tournament)
  • Logitech Wingman
  • Sega Astro City Mini
  • Google Stadia
  • Raphnet adapters (PCEngine, etc.)
  • Generic HID gamepads

Bluetooth Controllers (via USB dongle or Pico W):

  • PlayStation (DS3/DS4/DualSense)
  • Nintendo (Switch Pro, Switch 2 Pro, Wii U Pro, Wiimote)
  • Xbox (One/Series Bluetooth models)
  • Google Stadia

Peripherals:

  • USB Bluetooth dongles (connect BT controllers via USB host)
  • USB Keyboards (full HID support)
  • USB Mice (PCEngine mouse, Nuon spinner, 3DO mouse)
  • USB Hubs (up to 8 devices for 3DO)

Complete hardware compatibility list


For Users: Updating Firmware

Quick Flash

  1. Download latest .uf2 from Releases
  2. Enter bootloader:
    • USB-2-PCE / NUON / 3DO: Hold BOOT + connect USB-C
    • GC USB: Just connect USB-C (no button)
  3. Drag .uf2 file to RPI-RP2 drive
  4. Done! Drive auto-ejects when complete

Full installation guide


For Developers: Building Firmware

Quick Start

# Install ARM toolchain (macOS)
brew install --cask gcc-arm-embedded cmake git

# Clone and initialize
git clone https://github.com/joypad-ai/joypad-os.git
cd joypad-os && make init

# Build specific product
make usb2pce_kb2040   # PCEngine adapter
make usb2gc_kb2040    # GameCube adapter
make usb2dc_kb2040    # Dreamcast adapter
make usb2nuon_kb2040  # Nuon adapter

Build Commands

make init          # Initialize submodules (one-time setup)
make all           # Build all products
make clean         # Clean build artifacts

# Console adapters (USB/BT input)
make usb2pce_kb2040       # PCEngine (KB2040)
make usb2gc_kb2040        # GameCube (KB2040)
make usb2gc_rp2040zero    # GameCube (RP2040-Zero)
make usb2dc_kb2040        # Dreamcast (KB2040)
make usb2nuon_kb2040      # Nuon (KB2040)
make usb2loopy_kb2040     # Casio Loopy (KB2040)
make usb23do_rp2040zero   # 3DO (RP2040-Zero)

# Native controller adapters
make n642dc_kb2040        # N64 → Dreamcast (KB2040)
make n642usb_kb2040       # N64 → USB (KB2040)
make snes2usb_kb2040      # SNES → USB (KB2040)
make snes23do_rp2040zero  # SNES → 3DO (RP2040-Zero)

# USB/BT passthrough
make usb2usb_feather      # USB → USB (Feather USB Host)
make usb2usb_rp2040zero   # USB → USB (RP2040-Zero)
make usb2usb_rp2350usba   # USB → USB (Waveshare RP2350-USB-A)
make bt2usb_pico_w        # Bluetooth → USB (Pico W)

Output firmware files appear in releases/ directory.

Complete build guide


Documentation

USB Output & Web Config

Console-Specific Guides


Architecture

Joypad OS uses a modular architecture:

  • RP2040 - Dual-core ARM Cortex-M0+ microcontroller
  • TinyUSB - USB host stack for polling USB devices
  • PIO - Programmable I/O for timing-critical console protocols
  • Dual-Core: Core 0 handles USB input, Core 1 runs console output
  • Router - Flexible input→output routing (SIMPLE/MERGE/BROADCAST)
  • Apps - Per-product configuration (router, profiles, features)

See CLAUDE.md for detailed architecture


Community & Support


Acknowledgements


License

Joypad OS is licensed under the Apache-2.0 License.

The Joypad name and branding are trademarks of Joypad Inc.