A GoldHEN plugin that enables Xbox and Nintendo Switch USB controllers on jailbroken PS4 consoles.
Xbox controllers work as Player 2 in local multiplayer games! DS4 remains Player 1.
Xbox Controllers:
- Xbox 360 wired USB controller
- Xbox One wired USB controller
- Xbox Series X|S wired USB controller
- Xbox Elite controllers (wired)
Nintendo Switch Controllers (PDP):
- PDP Rock Candy Wired Controller
- PDP Faceoff Wired Pro Controller
- PDP Faceoff Deluxe Wired Pro Controller
- PDP Wired Fight Pad Pro
Note for Xbox One/Series controllers: The controller must be off (Xbox button not lit) when launching the game. The plugin will detect and initialize it. If the controller is already on, unplug and replug it, or turn it off before starting the game.
- Full button mapping (A/B/X/Y, bumpers, triggers, sticks, D-pad)
- Responsive input (1ms polling, 2ms timeout)
- Local multiplayer - Xbox controller as Player 2, DS4 as Player 1
- Auto-detection of controller type
- Rumble/vibration output
- Wireless/Bluetooth Xbox controllers
- Jailbroken PS4 (tested on 9.00)
- GoldHEN 2.3 or newer
- Supported wired USB controller (Xbox 360/One/Series or PDP Switch controller)
- A real DS4 controller (for system menu and Player 1)
- Connect to PS4 via FTP (port 2121)
- Upload
xbox_controller.prxto/data/GoldHEN/plugins/ - Create or edit
/data/GoldHEN/plugins.ini:[default] /data/GoldHEN/plugins/xbox_controller.prx - Launch a game - plugin loads automatically
To disable: Remove the plugin line from plugins.ini
For local multiplayer to work:
- Create a second PS4 user profile (Settings > Users > Create User)
- Log in both users before launching the game:
- Your main profile (Player 1 - DS4)
- Second profile (Player 2 - Xbox controller)
- Launch the game
- You should see "Xbox 360 connected!" and "Xbox Player 2 ready!" notifications
- Both controllers now work independently!
Important: Both users must be logged in at the PS4 system level. The plugin automatically detects and assigns the Xbox controller to the second user.
For games where Player 2 joins by pressing Start:
- Create your Player 2 character on the second profile first - Launch the game as the second user and create a character before attempting co-op
- The game may freeze if you try to create a new character while joining in-game
- Once the character exists, you can drop in normally by pressing Start on the Xbox controller
| Xbox | DualShock 4 |
|---|---|
| A | Cross (X) |
| B | Circle |
| X | Square |
| Y | Triangle |
| LB | L1 |
| RB | R1 |
| LT | L2 |
| RT | R2 |
| Back | Share |
| Start | Options |
| Guide | PS Button |
| L3 | L3 |
| R3 | R3 |
| Switch | DualShock 4 |
|---|---|
| A | Circle |
| B | Cross (X) |
| X | Triangle |
| Y | Square |
| L | L1 |
| R | R1 |
| ZL | L2 |
| ZR | R2 |
| - | Share |
| + | Options |
| Home | PS Button |
| L3 | L3 |
| R3 | R3 |
Note: Switch controllers use positional mapping (A is in Circle position, B is in Cross position).
- No touchpad (third-party controllers have none)
- No motion controls (no gyro/accelerometer)
- No lightbar feedback
- No controller audio
- Requires DS4 for system menu
- Switch controller triggers are digital only (full press or nothing)
Requires:
- OpenOrbis PS4 Toolchain
- GoldHEN Plugins SDK
export OO_PS4_TOOLCHAIN=/path/to/openorbis
makeOutput: bin/xbox_controller.prx
This plugin hooks multiple PS4 system functions:
scePadOpen/scePadClose- Virtual controller registrationscePadRead/scePadReadState- Input injectionscePadGetControllerInformation- Controller statussceUserServiceGetLoginUserIdList- User injection for multiplayer- Reads Xbox controller via
sceUsbdUSB API - Translates Xbox HID reports to DS4 OrbisPadData format
Some games (like Minecraft Bedrock) require PSN sign-in for local multiplayer even though no online features are used. A future update will add PSN availability spoofing.
Target functions to hook (from libSceNpManager):
sceNpCheckNpAvailability()- Check if PSN is availablesceNpCheckNpAvailabilityA(userId)- Async version with user IDsceNpGetState()- Get current PSN statesceNpHasSignedUp()- Check if user has PSN accountsceNpManagerIntGetSigninState()- Internal sign-in state
Approach:
- Load
libSceNpManager.sprx - Hook availability/state functions to return "signed in" status
- May need to fake account data (OnlineId, AccountId) for some games
Reference:
- PS4 Offline Account Activator - Activates accounts offline (save data only)
- Some games have community patches that remove PSN checks entirely
MIT License
Discord: sinfulstoic
- GoldHEN team for the plugin SDK and gamepad_helper reference
- OpenOrbis team for the PS4 toolchain
- remotePad plugin for virtual controller architecture inspiration