Article cover image

How to configure an Xbox One controller with dongle to work with Linux

Author profile image
Aitor Alonso

Mar 29, 2025

5 min read

I'm a Linux user at heart, but I also like to play video games. So at the beginning of the year I decided to drop Windows 10 on my desktop, as it was about to reach its end of life for official support, and move to Manjaro Linux. One of the first things I did was to install Steam, and configure my old Xbox One controller to work with it.

I've been using an Xbox One controller with a dongle to play on Windows, and I wanted the same experience on Linux. I would just plug the dongle into my computer and start playing. The dongle I use is an old model like the one in the picture below. Microsoft released a new model later, that is less bulky. I guess these instructions will work for the new model as well, but I haven't tested it.

Xbox One controller dongle

Click on image to enlarge

Two options to configure the controller

There are two drivers out there to make the dongle work with Linux. One is xow, a mature yet old (not necessary a bad thing!) driver that has been around for a while. The other one is xone, made by the same author, but is newer and also supports Xbox Series X/S controllers and audio/led control with the controller.

I was unable to make the xone driver work with my controller, so I used the xow driver. Following now, I'll indicate how I configured the controller to work with my system (Manjaro Linux, based on Arch Linux) and play with it on Steam. If you are interested in the xone driver, you can check the installation instructions directly in the repository. I linked both of them above.

Installing and configuring the xow driver

First, we need to install the packages required by xow.

sudo pacman -S curl cabextract libusb

Now, we need to clone the repository and run the installation script.

cd /tmp
git clone https://github.com/medusalix/xow
cd xow
make BUILD=RELEASE
sudo make install

We also need to install the firmware for the controller. Once xow is installed, it also installs a script in our path to get the controller firmware. So we can execute it as follows from anywhere.

sudo xow-get-firmware.sh

Lastly, xow will also install a systemd service to handle the dongle. It should be already started, but we can ensure it by running the following command.

sudo systemctl enable xow
sudo systemctl restart xow

At this point, we should be able to plug the dongle into our computer and recognized, but we still need to pair the controller with the dongle, even if it was paired with the dongle in another computer before (or in a previous Windows installation like my case).

Connecting and pairing the controller

First, let's connect the dongle to the computer. If everything works you should see under the logs for the daemon that the dongle was initialized.

systemctl status xow
# Or alternatively for the logs only
# journalctl -u xow -f

In my case, it shows the following output:

● xow.service - Xbox One Wireless Dongle Driver
     Loaded: loaded (/etc/systemd/system/xow.service; enabled; preset: disabled)
     Active: active (running) since Sat 2025-02-01 16:05:31 CET; 2h 38min ago
 Invocation: 5704f28070f64b2eb864b645f1f9cdb9
   Main PID: 981 (xow)
      Tasks: 4 (limit: 38251)
     Memory: 1.1M (peak: 2.3M)
        CPU: 28ms
     CGroup: /system.slice/xow.service
             └─981 /usr/local/bin/xow

feb 01 16:05:31 manjaro systemd[1]: Started Xbox One Wireless Dongle Driver.
feb 01 16:05:35 manjaro xow[981]: 2025-02-01 16:05:35 INFO  - xow v0.5-36-gd335d60 ©Severin v. W.
feb 01 16:05:35 manjaro xow[981]: 2025-02-01 16:05:35 INFO  - Waiting for device...
feb 01 18:43:04 manjaro xow[981]: 2025-02-01 18:43:04 INFO  - Wireless address: XX:XX:XX:XX:XX:XX
feb 01 18:43:05 manjaro xow[981]: 2025-02-01 18:43:05 INFO  - Dongle initialized

Also, you can check the device is recognized by running lsusb. This is also a good place to start debugging if you have any issues. In my case, it shows the following (apart from other devices):

Bus 001 Device 005: ID 045e:02e6 Microsoft Corp. Xbox Wireless Adapter for Windows

If everything is working, you should be able to pair the controller with the dongle. To do this, as always, first long-press the pairing button on the dongle, see the white light of the dongle blinking. Then, long-press the pairing button on the controller. The Xbox logo should start blinking on the controller, and once the pairing is successful, the light will turn on steadily.

However, I had some problems when pairing the controller initially, let's see them, so hopefully I can save you some time if you have the same issue.

Troubleshooting

When pairing the controller, dongle light was blinking, as so the controller light was blinking too. However, the controller light was not turning on steadily after the pairing was successful and the controller was not paired.

Checking the logs for the xow service, I saw the following:

INFO  - Pairing enabled
terminate called after throwing an instance of 'InputException'
what():  Error opening device: Permission denied

The old known permissions issue in Linux. It seemed that xow didn't have the proper permissions to access the input devices. What I had to do to fix it was:

  1. First, stop the xow service.
sudo systemctl stop xow
  1. Then, copy the udev rules to the correct location. They are under the install directory of the repository.
sudo cp install/udev.rules /etc/udev/rules.d/99-xow.rules
  1. Reload the udev rules.
sudo udevadm control --reload-rules
sudo udevadm trigger
  1. Start the xow service again.
sudo systemctl start xow

And that's it. After these changes, I repeated the pairing process, and it worked like a charm this time. Hope this helps you if you have the same issue.

I hope my article has helped you, or at least, that you have enjoyed reading it. I do this for fun and I don't need money to keep the blog running. However, if you'd like to show your gratitude, you can pay for my next coffee with a one-time donation of just $1.00. Thanks!

No by AICC-BY 4.0

© Copyright 2025 Aitor Alonso.

Articles licensed under CC-BY 4.0