ESP32-S3 HID Bridge
Firmware that turns an ESP32-S3 into USB gamepads, keyboard, and mouse for Sunshine.
Community project, not affiliated with LizardByte, Espressif, Microsoft, Sony, or Nintendo.
Sunshine sends input to the board over USB serial. The board presents it as standard USB devices. It has two slots: keyboard and mouse share one, and each gamepad takes one. At most one gamepad can be Xbox.
Flash
- Use Chrome or Edge on a desktop.
- Connect the board's native USB port with a data cable.
- If no port shows up, hold BOOT while plugging in.
- Click Install and select the port.
- Replug the board when done.
Not supported: octal-flash boards (e.g. DevKitC-1 N32R8V) and boards whose only USB port is a CH340/CP2102 serial chip.
Boards
Any ESP32-S3 board with native USB and quad flash, for example:
| Board | Flash | Links |
|---|---|---|
| Seeed Studio XIAO ESP32S3 | 8 MB | store |
| Waveshare ESP32-S3-Zero | 4 MB | store · docs |
| LilyGO T-Dongle-S3 | 16 MB | store · wiki |
| Adafruit QT Py ESP32-S3 | 4 MB | store |
Espressif ESP32-S3-DevKitC-1 (use the USB port) | 8–16 MB | sellers · docs |
Sunshine
- Install a build from the esp32-bridge branch.
- Plug in the board, then start Sunshine. It selects ESP32-S3 USB Bridge automatically (Configuration → Input → Gamepad Backend).
- On first connection the LED blinks fast. Press BOOT to pair.
Pairing
The board only accepts input from paired programs (up to four). Changes below must be confirmed with BOOT. Holding BOOT for 10 seconds removes all pairings.
Close Sunshine first; the serial port can only be open in one program.
| Host | Key id |
|---|
Troubleshooting
| Problem | Fix |
|---|---|
| No port when flashing | Hold BOOT while plugging in; try another cable. |
| Sunshine doesn't use the board | Plug it in before starting Sunshine; check the gamepad backend setting. |
| Log says the board is not paired | Press BOOT while the LED blinks fast. With four pairings, remove one above. |
| Connect reports "update the firmware" | Flash firmware 0.2.0 or later. |
| Pads drop for a second when a client joins | Expected: device changes re-enumerate the board. |
| Second gamepad missing | Both slots are in use. |