diff options
-rw-r--r-- | .SRCINFO | 20 | ||||
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | 50_xbox-generic-controller.rules | 1 | ||||
-rw-r--r-- | PKGBUILD | 28 | ||||
-rw-r--r-- | README.md | 59 | ||||
-rwxr-xr-x | fixcontroller.py | 12 | ||||
-rw-r--r-- | xbox-generic-controller.conf | 1 |
7 files changed, 123 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 000000000000..8d6115411f59 --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,20 @@ +pkgbase = xbox-generic-controller + pkgdesc = Fix for generic XBox-like USB gamepads that are recognized but not functional + pkgver = 0.1.0 + pkgrel = 1 + url = https://gitlab.com/ryanobeirne/xbox-generic-controller + arch = any + license = MIT + depends = systemd + depends = python>=3 + depends = python-pyusb + depends = xboxdrv + source = xbox-generic-controller.conf + source = 50_xbox-generic-controller.rules + source = fixcontroller.py + sha256sums = bdc54ef5b9728751f89f08039c69141f7515b9df723cbda1df0239c5109d249b + sha256sums = ecb8c515f1b88fe4986eec098bd6863c459c39fd569d759884936e39d22d586b + sha256sums = e9f41812137b2cdcf60bc47cc59a5ef5f23e3c467fa6f841b5d20f9abe30797a + +pkgname = xbox-generic-controller + diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000000..e9648f0f4308 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +pkg/ +src/ diff --git a/50_xbox-generic-controller.rules b/50_xbox-generic-controller.rules new file mode 100644 index 000000000000..8bdaa1f69d48 --- /dev/null +++ b/50_xbox-generic-controller.rules @@ -0,0 +1 @@ +ATTRS{idVendor}=="045e", ATTRS{idProduct}=="028e", RUN+="/usr/bin/fixcontroller.py" diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..aa1608506f3d --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,28 @@ +# Maintainer: Ryan O'Beirne <ryanobeirne@gmail.com> + +pkgname=xbox-generic-controller +pkgver=0.1.0 +pkgrel=1 +pkgdesc="Fix for generic XBox-like USB gamepads that are recognized but not functional" +arch=("any") +url="https://gitlab.com/ryanobeirne/xbox-generic-controller" +license=('MIT') +depends=("systemd" "python>=3" "python-pyusb" "xboxdrv") + +source=( + $pkgname.conf + 50_$pkgname.rules + fixcontroller.py +) + +sha256sums=( + bdc54ef5b9728751f89f08039c69141f7515b9df723cbda1df0239c5109d249b + ecb8c515f1b88fe4986eec098bd6863c459c39fd569d759884936e39d22d586b + e9f41812137b2cdcf60bc47cc59a5ef5f23e3c467fa6f841b5d20f9abe30797a +) + +package() { + install -D "${source[0]}" "$pkgdir/etc/modprobe.d/${source[0]##*/}" + install -D "${source[1]}" "$pkgdir/etc/udev/rules.d/${source[1]##*/}" + install -D "${source[2]}" "$pkgdir/usr/bin/${source[2]##*/}" +} diff --git a/README.md b/README.md new file mode 100644 index 000000000000..1141fc4ffb2a --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +# xbox-generic-controller + +### Fix for generic XBox-like USB gamepads that are recognized but not functional. + +This is an AUR wrapper for the [python script by dnmodder](https://gist.github.com/dnmodder/de2df973323b7c6acf45f40dc66e8db3) using a udev rule to run the script automatically when plugged in and blacklisting the `xpad` kernel module. + +# Will this work for my controller? + +If you have a generic XBox USB controller with vendorid:productid `045e:0283`, then probably yes. Plug in your controller, then run this to find out: + +``` +$ lsusb +``` + +I haven't tested this anywhere but my own laptop, so please [open an issue or submit a pull request](https://gitlab.com/ryanobeirne/xbox-generic-controller) if you have any problems. + +# Install + +## ArchLinux + +### Using pacman + +``` +$ git clone https://gitlab.com/ryanobeirne/xbox-generic-controller +$ cd xbox-generic-controller +$ makepkg -si +``` + +### Using yay + +``` +$ yay -S xbox-generic-controller +``` + +You may need to reboot or run: + +``` +# udevadm control --reload +``` + +# Dependencies + +`xboxdrv` + +- A userspace driver for xbox controllers + +`python3` + +- The magic is in the [python script by dnmodder](https://gist.github.com/dnmodder/de2df973323b7c6acf45f40dc66e8db3). + +`python-pyusb` + +- A python USB library + +`systemd` + +- Uses a udev rule to run a script when the controller is plugged in + + diff --git a/fixcontroller.py b/fixcontroller.py new file mode 100755 index 000000000000..24e48edaf301 --- /dev/null +++ b/fixcontroller.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 + +# https://gist.github.com/dnmodder/de2df973323b7c6acf45f40dc66e8db3 + +import usb.core + +dev = usb.core.find(idVendor=0x045e, idProduct=0x028e) + +if dev is None: + raise ValueError('Device not found') +else: + dev.ctrl_transfer(0xc1, 0x01, 0x0100, 0x00, 0x14) diff --git a/xbox-generic-controller.conf b/xbox-generic-controller.conf new file mode 100644 index 000000000000..76f498f1dcfe --- /dev/null +++ b/xbox-generic-controller.conf @@ -0,0 +1 @@ +blacklist xpad |