Linux userspace driver for the Flydigi Vader 5 Pro gamepad (2.4G USB dongle).
- Xbox Elite emulation with Steam paddle support (M1-M4)
- Gyro support: mouse mode or map to right stick (for games without gyro)
- Layer system with tap-hold (like QMK keyboard firmware)
- Button remap to keyboard/mouse
git clone https://github.com/BANANASJIM/flydigi-vader5.git
cd flydigi-vader5
./install/install.sh # build + udev rules + config
sudo ./build/vader5d
# Custom config
sudo ./build/vader5d -c /path/to/config.toml
# Or full install with systemd service (auto-starts via udev)
./install/install.sh installLike QMK/ZMK keyboard firmware - one button, two functions:
Press LM
│
├─── Release < 200ms ───► Tap: emit mouse_side
│
└─── Hold >= 200ms ─────► Layer activates (no tap emit)
│
Gyro → mouse
RB → left click
RT → right click
│
Release LM → Layer deactivates
Alternative activation - tap once to enable, tap again to disable:
Tap M1 ──► Layer activates (stays active)
│
Tap M1 again ──► Layer deactivates
┌─────────────────────────────────────────────────────────┐
│ Base (Normal) │
│ Xbox Elite gamepad, M1-M4 = Steam paddles │
└─────────────────────────────────────────────────────────┘
│ │
Hold LM Hold RM
▼ ▼
┌──────────────┐ ┌──────────────┐
│ aim │ │ mouse │
│ gyro + mouse │ │ stick mouse │
│ scroll + pad │ │ + arrows │
└──────────────┘ └──────────────┘
Only one layer active at a time (first activated wins)
Config: config/config.toml
emulate_elite = true # true: Xbox Elite (Steam paddles), false: standard gamepad
[gyro]
mode = "off" # off / mouse / joystick
# Hold LM for gyro aim + full mouse mode
[layer.aim]
trigger = "LM" # trigger button: A/B/X/Y/LB/RB/LT/RT/M1-M4/LM/RM/C/Z
activation = "hold" # hold (default) or toggle
tap = "mouse_side" # tap action (hold mode): KEY_*, mouse_left/right/middle/side/extra
hold_timeout = 200 # ms before layer activates (hold mode)
gyro = { mode = "mouse", sensitivity = 2.0 }
stick_left = { mode = "scroll" } # mode: gamepad / mouse / scroll
stick_right = { mode = "mouse", sensitivity = 1.0 } # mode: gamepad / mouse
dpad = { mode = "arrows" } # mode: gamepad / arrows / scroll
remap = { RB = "mouse_left", RT = "mouse_right", RM = "mouse_middle", A = "KEY_LEFTMETA" }
# Hold RM for stick mouse + arrows
[layer.mouse]
trigger = "RM"
stick_right = { mode = "mouse", sensitivity = 1.5 }
dpad = { mode = "arrows" }
remap = { A = "mouse_left", B = "mouse_right" }
# Toggle M1: tap to enable gyro, tap again to disable
[layer.gyro_toggle]
trigger = "M1"
activation = "toggle"
gyro = { mode = "mouse", sensitivity = 1.5 }See docs/configuration.md for full options.
With emulate_elite = true, Steam Input recognizes the controller as Xbox One Elite 2:
| Vader 5 | Elite | Steam Input |
|---|---|---|
| M1 | P1 | Upper Left |
| M2 | P2 | Upper Right |
| M3 | P3 | Lower Left |
| M4 | P4 | Lower Right |
# Permission denied
sudo cp install/99-vader5.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
# Check controller
lsusb | grep 37d7
# Debug tool
sudo ./build/vader5-debugThis project has evolved into padctl — a universal HID gamepad daemon supporting 12 devices across 8 vendors (Sony, Nintendo, Microsoft, Valve, 8BitDo, Flydigi, HORI, Lenovo) with the same declarative TOML config approach.
padctl includes everything from this driver plus:
- Multi-device hotplug with automatic detection
- WASM plugin system for complex protocols
- Force feedback passthrough
- Full systemd integration with install/uninstall
- Comprehensive documentation
New users should use padctl instead. This repo remains for reference.
GPL-2.0
