Skip to main content

A DualShock 4 bluetooth driver for Linux

Project description

ds4drv is a simple daemon that scans for DualShock 4 controllers via bluetooth, connects to them and creates a joystick device. This driver does NOT work via USB.


When I first got my DS4 controller I expected it work without any issues with Linux as it had been reported all over the internet that DS4 was a standard HID device and required no special drivers. This turned out not to be the case though, as when I attempted a standard pairing in Linux via bluetoothctl I only ended up with strange error messages.

I tried asking for help on the bluez mailing list but received no response. I tried to Google to find out if anyone else had succeed to use the DS4 via bluetooth, but found no success stories. I even tried to dig into the bluez code, but the error messages are very strange and doesn’t seem to describe what is going wrong at all, so I didn’t get anywhere there either.

So I tried experimenting with connecting directly to the HID channels, just like the libcwiid library do with the Wiimote, and, it worked! Since I now had access to the raw HID report, I figured I might as well write a small driver to convert them into joystick events, and here it is, ds4drv!

Hopefully someone will figure out what is broken in bluez and fix it so this hack will not be necessary, but this will at least let me play with my DS4 via bluetooth for now. :-)


  • Option to emulate the Xbox 360 controller for compatibility with Steam games
  • Setting the LED color
  • Reminding you about low battery by flashing the LED
  • Using the trackpad as a mouse


Make sure you have the dependencies:

  • Python 2.7 or 3.3
  • python-setuptools
  • hcitool (usually available in the bluez-utils or equivalent package)

Installing the latest release via pip:

$ sudo pip install ds4drv

or if you want to run the latest development code, check out the source from Github and install it with:

$ sudo python install


Simplest usage is to run it without any options:

$ ds4drv

ds4drv does not support pairing, so to connect the controller you need to start it in pairing mode every time you want to use it. This is done by holding the Share and PS button until the LED starts blinking.


ds4drv uses the kernel module uinput to create input devices in user land, but this usually requires root permissions. You can change the permissions by creating a udev rule. Put this in /etc/udev/rules.d/50-uinput.rules:

KERNEL=="uinput", MODE="0666"


You can also configure some options, this will set the LED to a bright red:

$ ds4drv --led ff0000

See ds4drv --help for a list of all the options.

Multiple controllers

ds4drv does in theory support multiple controllers (I only have one controller myself, so this is untested). You can give each controller different options like this:

$ ds4drv --led ff0000 --next-controller --led 00ff00

This will set the LED color to red on the first controller connected and green on the second.

Known issues/limitations

  • No pairing, you must start your controller in pairing mode everytime
  • The controller will never be shut off, you need to do this manually by holding the PS button until the controller shuts off


The DualShock 4 report format is not open and had to be reverse engineered. These resources have been very helpful when creating ds4drv:

Project details

Release history Release notifications

History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


This version
History Node


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
ds4drv-0.1.0.tar.gz (7.9 kB) Copy SHA256 hash SHA256 Source None Jan 7, 2014

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging CloudAMQP CloudAMQP RabbitMQ AWS AWS Cloud computing Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page