Wireless Linux support for the original NVIDIA SHIELD Controller (2014/2015,
USB ID 0955:7210). This controller uses Wi-Fi, rather than Bluetooth.
Experimental alpha. Gamepad buttons, sticks, touchpad mouse and desktop volume/mute have been tested wirelessly while normal Wi-Fi remains connected. Controller audio input and output, and rumble, have also been confirmed working by the project maintainer on the tested setup. The installed service has been tested live. The rename upgrade preserved pairing and the service reported the controller connected again; reboot behavior and controller power-cycle reconnection still need validation. This is a community project, unaffiliated with NVIDIA.
| Feature | Status |
|---|---|
| Buttons, D-pad, sticks and shoulder controls | Tested wirelessly |
| Touchpad mouse | Tested wirelessly |
| Desktop volume and mute | Tested with WirePlumber |
| Controller and normal Wi-Fi together | Tested on Intel iwlwifi, 2.4 GHz |
| Qt status tray and pairing window | Implemented; offscreen UI check passed |
| Reconnect during the rename upgrade | Observed with saved pairing |
| Controller power-cycle reconnect and reboot startup | Live validation pending |
| Controller audio input and output | Tested and working on the maintainer's setup |
| Rumble | Tested and working on the maintainer's setup |
Download Open FatShield — .deb, .rpm, Arch package or source
Release notes · SHA-256 checksums · All releases
Releases include installable .deb, .rpm and Arch .pkg.tar.zst packages,
plus a source archive.
See package installation instructions. Packages include DKMS
sources: the kernel module is built locally for your running kernel, rather than
shipping a kernel-specific binary. Version 0.2.0-alpha.1 also renames the app
and service; the underlying kernel driver is unchanged. This remains an alpha.
- Linux with systemd, NetworkManager and a Wi-Fi adapter supporting simultaneous managed + AP interfaces on one channel.
- An existing 2.4 GHz Wi-Fi connection. The controller AP follows its channel. The service waits when normal Wi-Fi is disconnected or using 5/6 GHz.
- Python 3.10+, hostapd with WPS support, iw, DKMS, make and matching kernel headers. Use Clang/LLVM for a kernel built with Clang; otherwise use GCC.
- WirePlumber (
wpctl) for desktop volume controls. Polkit (pkexec) for graphical authorization. PySide6 and a system tray for the desktop app (KDE supported; GNOME requires a tray extension, or use the app window).
Live testing used CachyOS, an Intel iwlwifi adapter and kernel 7.3.1. The driver also builds against 6.18.55 LTS headers; LTS runtime is untested. Other adapters, distributions, controller models and multi-controller operation are not yet validated. The 2017 Bluetooth controller is outside this project. See compatibility and troubleshooting before reporting a problem.
For .deb, .rpm or Arch package installation, use the package guide.
The following instructions are for the source installer. Use one installation
method at a time; switching methods requires uninstalling the previous one while
keeping its saved pairing.
On Arch/CachyOS, install prerequisites and the header package matching your running
kernel (for example linux-cachyos-headers):
sudo pacman -S --needed python dkms hostapd iw networkmanager wireplumber polkit pyside6 base-devel clang llvmExtract the downloaded package, then enter its directory:
tar -xzf open-fatshield-0.2.0-alpha.1.tar.gz
cd open-fatshield-0.2.0-alpha.1Alternatively, get the source with Git:
git clone https://github.com/Dewopalis/Open-FatShield.git open-fatshield
cd open-fatshieldFrom either source directory, install and pair:
sudo python3 packaging/install.py
open-fatshield doctor
open-fatshield pair
open-fatshield guiRun doctor, pair and gui as your normal desktop user. Pair opens a two-minute
WPS window. Unplug the controller's USB cable and hold the NVIDIA button until
it flashes. The desktop volume helper starts automatically with this command.
For automatic startup:
open-fatshield enableThe system service starts at boot and waits for suitable normal Wi-Fi. The desktop volume helper starts when you log in. The controller network's identity and password are saved locally, so the controller should reconnect when powered on. Reconnection was observed during the rename upgrade; controller power-cycle reconnection and host reboot startup still need testing.
The Open FatShield system tray app starts when you log in. Open it now with
open-fatshield tray, or open Open FatShield from the application menu.
Its icon shows connected (green), ready (blue), waiting (amber), disconnected
(gray), or a driver fault (red). Click it to open the controller window, or
right-click for Pair, Connect, Disconnect and automatic startup controls.
Administrator authorization is requested when changing the system service.
Connect starts the service and allows a previously paired controller to reconnect; choose Pair for first-time setup. Disconnect stops the controller service. Quitting the tray leaves the controller service running. Tray startup at desktop login and controller service startup at boot are independent.
Earlier releases installed shield-controller and shield-controller.service.
Use the full installer from this release to migrate:
sudo python3 packaging/install.py
open-fatshield guiThe installer builds the new module package before stopping the legacy service,
copies saved pairing and configuration to the new locations, transfers the
service's enabled/running state, and removes the old command, launchers and DKMS
registration. A running controller is briefly disconnected during migration;
normal Wi-Fi stays managed by NetworkManager. Already-existing new configuration
and pairing files take precedence. Legacy configuration and pairing originals
remain as backups under /etc/shield-controller and /var/lib/shield-controller.
Quit any old tray instance if it does not exit during the update.
--app-only cannot migrate an older installation. No compatibility alias is
installed: use open-fatshield for commands and open-fatshield.service for
systemctl/journalctl. Custom service overrides or scripts need updating manually.
The migration has automated coverage and was tested live: the new service reported
the controller connected with saved pairing, and the renamed GUI/helper ran.
Controller power-cycle reconnection and host reboot startup remain untested.
open-fatshield status
open-fatshield status --json
open-fatshield logs
open-fatshield stop
open-fatshield disableIf normal Wi-Fi changes channel, the service recreates only its own controller AP. Normal Wi-Fi stays under NetworkManager's control. Same-radio AP use shares airtime, so throughput can change. Connection continuity beyond the original 60-second concurrent test remains to be tested.
The driver exposes normal Linux gamepad and mouse input devices. A separate desktop helper handles volume keys because some desktops ignore media keys on a gamepad. Controller audio input and output have also been tested and work on the maintainer's setup. Rumble has also been confirmed working on that setup.
Configuration is /etc/open-fatshield/config.json. The default automatically
selects a connected Wi-Fi interface and uses shield0 for the controller. Set
"interface": "wlan0" to choose a specific adapter. Restart the service after edits.
The service will not reuse an existing shield0 or a separately loaded ozwpan.
Stop the earlier experimental test before starting it.
Pairing secrets stay in root-only /var/lib/open-fatshield/network.json.
WPS opens only when you choose Pair. No packet captures or raw input logs are
recorded by the service. Avoid sharing this state file or authentication captures.
To uninstall from the same release directory:
sudo python3 packaging/install.py --uninstallConfiguration and saved pairing remain unless you also pass --purge, which
also removes legacy configuration/pairing backups.
Secure Boot may require enrolling a DKMS signing key using your distribution's
procedure before the module can load.
Report problems on GitHub Issues.
Include your controller model, distribution, kernel, Wi-Fi adapter,
open-fatshield doctor output and relevant service logs. Remove personal
network identifiers first.
make test
make
python3 packaging/install.py --destdir /tmp/shield-packageThe staging command copies package files without root privileges or system changes.
After a full installation, sudo python3 packaging/install.py --app-only refreshes
the application and launchers without rebuilding or restarting the driver. This
option requires the same driver version to be installed already. Restart the tray
app after updating it; an already-running instance keeps its previous code.
The command is open-fatshield, the system service is open-fatshield.service,
and the kernel module is ozwpan.
Contributions and hardware test reports are welcome. See CONTRIBUTING.md for development checks and the pull request process, or open an issue. DKMS rebuilds the module for kernel updates; kernel API compatibility still needs checking. See design and provenance for the driver changes, protocol findings and test boundaries.
GPL-2.0-only; see LICENSE. Based on the Linux staging OZWPAN driver and devmapal/nvidia-shield-controller-driver. Original file copyright notices are retained. New packaging and application code are also GPL-2.0-only. NVIDIA and SHIELD are trademarks of their respective owners.