Knowledge Base
Engineering Guide

Wired Wireless
Gamepad Conversion

Embedded radio options, firmware ecosystems, and engineering tradeoffs for converting a custom USB HID gamepad to wireless on PC.

Commercial adapters won't work

Every commercial adapter — Brook Wingman, 8BitDo Wireless Adapter 2, Mayflash Magic-NS, COOV — relies on VID/PID lookup tables to identify known controllers. A generic controller with an unknown vendor/product ID is silently rejected.

The 8BitDo adapter operates in the wrong direction: it receives wireless Bluetooth controllers and outputs wired USB. Brook's Wingman line converts between console ecosystems — they accept known controllers and re-present them for a target platform. The FGC 2 supports 150+ controllers, but every one is a named product with a known VID/PID.

Dead end

USB HID gamepads have no standardized report layout — button count, axis count, axis resolution, hat switches, and report IDs all vary per device. Parsing an arbitrary HID report descriptor is complex, and no commercial adapter attempts it. The only marginal exception is Mayflash Magic-NS, which may recognize common DirectInput report formats, but a truly custom HID descriptor will almost certainly fail.

Embedded Bluetooth approaches

Two fundamentally different architectures. Option A bypasses the existing controller MCU — wire buttons/sticks directly to a BLE-capable microcontroller. Option B preserves the original controller electronics and adds a USB-host-to-BLE bridge.

Recommended

Option A: Direct GPIO/ADC

Trace button matrix and analog connections on existing PCB, disconnect from original MCU, wire to ESP32 or nRF52840. Digital buttons → GPIOs with internal pull-ups. Analog sticks → ADC inputs.

LibraryESP32-BLE-Gamepad
Supports128 btn, 8 axes, 4 hats
Best MCUESP32-C3-MINI-1 (~$2)
Dev boardXIAO ESP32-C3 (~$5)
Dev time1–2 weekends
Preserves original PCB

Option B: USB Host Bridge

Use an MCU with USB Host + BLE on one chip. Reads existing USB HID output, retransmits via BLE. Requires parsing the original HID report descriptor at runtime.

Best MCUESP32-S3 (USB OTG + BLE)
Referenceskorokithakis/bluetooth-gamepad
Alt MCUnRF52840 (lower power)
CaveatESP-IDF HID host still maturing
Dev time2–4 weeks
Critical: Windows BLE reconnection bug

After power-cycling the ESP32, Windows shows the device as "connected" but no HID input works — you must unpair and re-pair every time. Root cause: Windows' BLE HID stack caches stale GATT handles after the peripheral reboots. Reported across ESP32-BLE-Gamepad issues #65, #79, #287 and NimBLE-Arduino #850. The library's ForcePairingMode and NimBLE patches help but don't fully resolve it. iOS and Android work fine. This issue alone may push you toward proprietary 2.4 GHz.

Proprietary 2.4 GHz delivers near-wired latency

This is how every serious commercial wireless controller works. A proprietary radio protocol (not Bluetooth) between controller and a small USB dongle. The dongle presents as standard USB HID — no Bluetooth stack, no pairing quirks, no Windows driver issues.

Professional choice

nRF52840 + ESB/Gazell

ARM Cortex-M4F + 2.4 GHz radio + USB 2.0 on a single chip. Supports BLE and proprietary protocols simultaneously.

ESB TX+ACK~130 µs @ 2 Mbps
LLPM interval1 ms (1000 Hz)
DonglePCA10059 (~$10)
ControllerXIAO nRF52840 (~$10)
Active draw5–15 mA
Budget alternative

nRF24L01+ (standalone)

Standalone 2.4 GHz transceiver (~$1/module) requiring an external MCU on both ends. Proven, cheap, but no USB integration.

TX cycle<500 µs @ 2 Mbps
End-to-end1–5 ms typical
Dongle MCUPro Micro / RP2040
Max payload32 bytes
CaveatNo freq hopping built-in

Nordic nRF Desktop reference design

Nordic provides a complete, production-ready wireless mouse/keyboard/dongle system in the nRF Connect SDK. Includes USB HID on the dongle via native USB, triple-mode operation (wired, BLE, proprietary 2.4 GHz), and extensive documentation. Adapting to gamepad requires changing HID report descriptors from mouse/keyboard to gamepad format.

OpenSplitDeck (945 GitHub stars, v0.3 March 2026) is a modular wireless controller using nRF52840 + ESB. It implements gamepad + mouse + keyboard HID reports, haptics/rumble, and trackpad input — directly applicable reference architecture.

Measured latency comparison

Raw averages don't capture the most important metric for gaming: consistency. BLE's high jitter is its real weakness, not just average latency.

Connection Avg Latency Variance Poll Rate
Wired USB (GP2040-CE, RP2040) 0.76 ms ±0.5 ms 1000 Hz
Proprietary 2.4 GHz (Nordic LLPM) ~1 ms ±0.5 ms 1000 Hz
nRF24L01+ custom link 1–3 ms ±1 ms 1000 Hz
8BitDo M30 2.4G (dongle) 3.6 ms 1.9–6.0 ms ~250 Hz
DualSense Bluetooth 3.0 ms narrow ~250 Hz
Xbox Series via BT ~15 ms moderate ~125 Hz
Generic BLE HID gamepad 8–25 ms 5.9–38+ ms 67–133 Hz

The 8BitDo M30 comparison is telling: its 2.4G dongle mode averages 3.6 ms with 6 ms worst-case, while its Bluetooth mode averages 21 ms with 38 ms worst-case — nearly 10× worse peak latency. For competitive gaming, proprietary 2.4 GHz is the only wireless option that approaches wired feel.

BT Core 6.2 introduces Shorter Connection Intervals down to 0.375 ms, demonstrated on nRF54L15 hardware. But it requires BT 6.2 support on both ends — not yet available in consumer Windows PCs.

Open-source firmware

GP2040-CE
Gold standard for wired gamepad firmware on RP2040. 14 output protocols including XInput (0.76 ms), DirectInput, Switch Pro, PS3/PS4/PS5. Web configurator, SOCD cleaning. No wireless support planned — issues #247, #1269 closed.
★ 2.1k
ESP32-BLE-Gamepad
Primary BLE gamepad library for ESP32. NimBLE-based, configurable HID descriptors, clean Arduino API. Windows reconnection bug is its Achilles heel.
★ 1.5k
Slimbox BT
Purpose-built wireless game controller firmware for nRF52840/nRF54L15 on Zephyr RTOS. Dual-mode: BLE wireless on battery, wired USB when plugged in. Sleep after 10 min inactivity, wake on button press. Pre-built UF2 binaries. Probably the most production-ready open-source wireless gamepad firmware.
jfedor2
OpenSplitDeck
Complete nRF52840 + ESB wireless gamepad with open hardware (EasyEDA) and Zephyr firmware. DS4 emulation for Steam Input, trackpad support, haptics. Best reference for proprietary 2.4 GHz.
★ 945
Joypad OS
Universal controller firmware core. Routes USB/BT/WiFi/GPIO inputs to USB/XInput/PS4/Switch/retro outputs. Targets both ESP32 and nRF52840.
joypad-ai

HID descriptors, XInput & the protocol maze

Both USB HID and Bluetooth HOGP use the same HID Report Descriptor format — the descriptor bytes are transport-agnostic. You could forward the original descriptor as-is, but in practice you must parse it to understand report sizes/IDs, adapt between USB interrupt-endpoint polling and BLE GATT notifications, and handle output reports (rumble, LEDs) in reverse. Re-implementing a clean, well-known gamepad descriptor is simpler and more reliable.

XInput is not an HID profile

Xbox controllers use proprietary protocols (XUSB for 360, GIP for One/Series) with dedicated kernel drivers. A generic BLE HID gamepad cannot present as XInput on Windows. It appears as DirectInput, which most modern games support but some XInput-only titles do not.

Workarounds: Steam Input remaps any DirectInput gamepad to XInput within Steam. ViGEmBus (open-source) creates a virtual Xbox 360 controller — the gamepad connects via BLE as DirectInput, ViGEmBus presents virtual XInput to games.

Practical gotchas

Conclusion: pick your tradeoff

No commercial adapter handles arbitrary USB HID, so this is inherently a custom engineering project. The decision reduces to a single axis.

Lowest Latency

nRF52840 + ESB / Gazell

Build with nRF52840 on both controller and a PCA10059 USB dongle. Use nRF Desktop reference design and OpenSplitDeck as firmware starting points. 1000 Hz polling, rock-solid Windows compatibility (standard USB HID to PC), battery life measured in days.

Latency1–3 ms
BOM~$20
Dev time2–4 weeks
Needs dongleYes
Simplicity / No dongle

ESP32 + BLE Gamepad

Embed an ESP32 with direct GPIO/ADC wiring (Option A). Accept 8–15 ms BLE latency, test Windows reconnection extensively with ForcePairingMode, use Steam Input or ViGEmBus for XInput translation. Or use Slimbox BT on nRF52840 for a more polished BLE experience with sleep/wake and dual-mode.

Latency8–15 ms
BOM~$8–12
Dev time1–2 weekends
Needs dongleNo