* pad2c 0.2.2: Ultimate 2C dongle in XInput mode (fixes #2) With the controller in XInput mode the receiver enumerates as 2dc8:310a with an XInput interface (ff/5d/01), a boot keyboard and a vendor HID. 0.2.1 read the first HID interrupt IN endpoint: the keyboard. - usbdesc.c picks the interface from the configuration descriptor: XInput first, from any vendor, then on an 8BitDo the first HID that is not a boot keyboard or mouse. - mapxinput.c maps the Xbox 360 input report to the DualSense layout. - usbpad.c opens the XInput OUT endpoint and sets the player LED, as a PC does. - tests/test_usb.c: the 310a descriptor from the issue, the 301c one, and the XInput map. - tools/setup-macos.sh: build on macOS with Homebrew LLVM. Tested on a PS5 Slim, 13.60: DInput (301c), switch to XInput (310a), and back, all buttons, sticks and triggers. * Notifications: "pad2c by Sub", then the controller, its mode and what happened Every notification now reads pad2c by Sub 8BitDo Ultimate 2C Wireless Controller (XInput) connected The name is read from the device's product string descriptor with a standard GET_DESCRIPTOR (USB_GET_DEVICEINFO fails on the 8BitDo dongle). The receiver names itself the same in DInput (301c) and XInput (310a), so the mode is shown beside it. - usbdesc_string(): UTF-16LE string descriptor to ASCII, with tests. - usbpad_mode(): "DInput" or "XInput". - All messages in English. Tested on the PS5: connect, disconnect, XInput and back. * Version 1.0.0; CODEOWNERS: every change needs the owner's review The XInput fix and the signed notifications are released as 1.0.0. .github/CODEOWNERS names @sub0x00001 for every file, so the main ruleset's code owner review asks for the owner on every pull request.
pad2c
Use an 8BitDo Ultimate 2C Wireless Controller on a jailbroken PS5, as a second controller next to your DualSense.
pad2c is a payload for a jailbroken PS5. It reads the 8BitDo 2.4G dongle plugged into the console's USB port and shows it to the system and to games as a virtual DualSense. No Bluetooth is involved, so it never touches your DualSense's pairing.
Screenshots
Switching the 8BitDo on and off, with pad2c running on the console:
Left: switched on; the console asks who is using the controller. Right: switched off.
Which controller
| Controller | Supported |
|---|---|
| 8BitDo Ultimate 2C Wireless Controller (the one sold for PC / Android, with a 2.4G USB dongle), through its dongle | ✅ |
| 8BitDo Ultimate 2C Bluetooth Controller (the Switch edition, no dongle) | ❌ different product |
| The Ultimate 2C Wireless over Bluetooth, without the dongle | ❌ not yet |
| Other 8BitDo 2.4G dongles | untested: run pad2c-probe.elf and open an issue with its output |
Why this controller, and why the dongle
The controller is simply the one I own: pad2c was made to play with it on my PS5, next to the DualSense. It is also a cheap way to get a second controller: a DualSense costs at least twice as much as the Ultimate 2C Wireless, which still has Hall effect sticks and triggers.
The dongle instead of Bluetooth, on purpose:
- No conflicts. The PS5 has one Bluetooth chip, and the system uses it for the DualSense. Sharing it from a payload risks taking over or unpairing the DualSense, and the chip is laid out differently from one console model to another. The dongle is a plain USB device: pad2c never touches the console's Bluetooth.
- Simpler. No pairing, no Bluetooth stack to keep alive, no reconnection logic: the dongle and the controller already talk to each other, and pad2c only reads what the dongle sends.
- Practical. Plug the dongle into a USB port and switch the controller on. That is all.
FAQ
Can I use an 8BitDo controller on a PS5? Not on a stock PS5: it only accepts its own and a few licensed controllers. On a jailbroken PS5, pad2c makes the 8BitDo Ultimate 2C appear as a DualSense.
Does it work in games, or only in the menus? In games too. Give the controller its own console user (the console asks when you press Home) and it is player 2, like a second DualSense.
Do I lose my DualSense? No. Both work at the same time. pad2c does not use Bluetooth at all.
Which firmware? Tested on 13.60 (PS5 Slim). It needs a console that already runs a payload loader such as elfldr or Payload Manager; it does not jailbreak anything itself.
Status
| Tested on | PS5 Slim (CFI-2114), firmware 13.60, elfldr 0.26, kstuff-lite 1.11, Payload Manager 0.5.2 |
| Controller | 8BitDo Ultimate 2C Wireless, 2.4G dongle, DInput (2dc8:301c) and XInput (2dc8:310a) modes |
| Works | all buttons, sticks, analog triggers, d-pad, Home = PS, console menus and games, sleep and wake, the console's "who is using this controller" screen, remembers its user, "turn off" from the console's menu |
| Not yet | vibration, light bar, motion sensors, audio |
Other firmwares and console models are untested.
The controller has two modes on its dongle, both work. It keeps the one last chosen:
- DInput (the default): with the controller on, hold B + Home until it switches off, then B + Home again until it switches on.
- XInput (seen by a PC as an Xbox controller): the same with X + Home. L4/R4 send nothing in this mode.
Notes:
- The 8BitDo has no touchpad: its extra L4 / R4 buttons press the touchpad.
- "Turn off" in the console's menu disconnects the controller from the console, as with a DualSense, and Home connects it again. The 8BitDo itself stays on until it goes to sleep by itself (the dongle's commands to switch it off are not known).
- Vibration: PS5 games send DualSense haptics as audio to the controller, and a virtual DualSense has no known way to receive them yet.
Button map
| 8BitDo | DualSense |
|---|---|
| A / B / X / Y | ✕ / ○ / □ / △ (by position) |
| LB / RB / LT / RT | L1 / R1 / L2 / R2 (analog) |
| View / Menu | Create / Options |
| Home | PS |
| L3 / R3 | L3 / R3 |
| L4 / R4 | touchpad click |
Install
- Plug the dongle into a USB port of the PS5 and switch the controller on in 2.4G mode.
- Send
pad2c-<version>.elfto your payload loader (elfldr listens on port 9021), or add it to Payload Manager and to its autoload list, so that it starts with the console. - A notification says it is running. Press Home on the 8BitDo: the console asks who is using the controller. For a second player, pick a second user (a game takes one controller per user). pad2c remembers the choice and gives the controller back to that user next time, as a DualSense does.
Files, all in /data/pad2c/:
| File | |
|---|---|
pad2c.log |
the log |
stop |
create it to stop pad2c (it also stops by itself before rest mode) |
owner |
the user the controller was last given to (delete it to forget) |
bind_user |
optional: main, other or a hexadecimal user id, to give the controller to that user at once |
How it works
src/usbpad.copens the dongle's/dev/ugenB.Anode and reads its interrupt IN endpoint. The console's own HID driver holds the interface but ignores the device. The internal Bluetooth chip (ugen0.2) is never touched.- With no controller the dongle shows up as "8BitDo IDLE". When the controller connects, the dongle enumerates again:
in DInput mode it sends HID report 1, turned into DualSense buttons by
src/map8bitdo.c; in XInput mode it becomes2dc8:310awith an Xbox 360 interface, read bysrc/mapxinput.c.src/usbdesc.cpicks the interface from the USB descriptor (XInput first, then the 8BitDo HID, never a keyboard).make testchecks both against reports and descriptors captured on consoles. When the controller sleeps, the dongle enumerates again and the open device ends. src/ps5_vpad.ccreates the virtual DualSense (scePadVirtualDevice*), finds its device id in the kernel log, gives it to a user (sceMbusBindDeviceWithUserId) and feeds it. It follows the kernel log while running: the console's choice of user is remembered, and its "turn off" (sceMbusDisconnectDevice) removes the virtual pad.src/probe.cis a read-only diagnostic payload: it dumps the USB descriptors and the reports of whatever is plugged in. Useful to add support for another USB controller.
Build
Needs ps5-payload-sdk and clang, lld and llvm. tools/setup-wsl.sh
(Linux or WSL) or tools/setup-macos.sh (Homebrew) installs them and writes ~/.ps5sdk:
. ~/.ps5sdk
make test # the button maps and the interface choice, on the PC
make # dist/pad2c-<version>.elf and dist/pad2c-probe.elf
Credits
- The virtual DualSense code (
ps5_vpad.c) and the helperslog.c,util.c,lock.c,ps5_power.candpad.hcome from AnyPad PS5 by @elmonomalvad0 (sinfiltros), GPL-3.0-or-later, adapted here. - ps5-payload-sdk by John Törnblom.
Licence
GPL-3.0-or-later. See LICENSE.
No Sony code, keys or firmware are part of this project. pad2c does not jailbreak anything: it needs a console that already runs a payload loader.

