Controller not detected on Linux
When Linux won't detect your Xbox, PlayStation or other gamepad, it's usually the cable/Bluetooth pairing, a driver, or the browser/game not reading it. Try these, then test every button live.
Step-by-step fix
-
Use a known-good data USB cable (not charge-only), or re-pair over Bluetooth. Press the controller's pair/sync button.
-
Run the CheckMyMic controller test and press a button — buttons and sticks should light up.
-
On Linux, make sure the controller driver is installed (Xbox pads are plug-and-play; PlayStation pads may need Steam Input or DS4 tooling).
-
Test the analog sticks for drift in the tester, and the triggers/bumpers.
-
Restart Linux and reconnect.
Frequently asked questions
My controller charges but isn't detected on Linux.
Charge-only cables are common — swap to a data cable, or pair over Bluetooth. Then press a button and watch the controller test: once Linux really has the pad, it also appears in its Bluetooth/USB device list, which is the quickest way to tell a cable problem from a driver problem.
How do I check for stick drift on Linux?
Open the controller test on Linux and don't touch the sticks — if the on-screen sticks move on their own, you have drift. Mild drift can be masked with a bigger in-game deadzone; drift that keeps growing is the stick module wearing out.
Still not detected on Linux after every step — what's left?
Test the pad on another device: pair it to a phone or a second computer and open the CheckMyMic controller test there. Detected elsewhere means this machine's Bluetooth, USB port or driver; dead everywhere means the controller itself. Remember the tester only sees a pad after you press a button — that's how the Gamepad API works, not a fault.
Which drivers do controllers need on Linux?
Xbox pads use the in-kernel xpad driver (xpadneo adds better Bluetooth support for Xbox One/Series pads), and DualShock/DualSense use hid-playstation — all present on modern kernels. To watch raw input, use evtest or jstest-gtk; if events flow there but the browser sees nothing, press a button first, as the Gamepad API requires it.