Skip to content

About

Open FatShield: experimental Linux wireless driver and desktop tray for the original NVIDIA SHIELD Controller, alongside normal Wi-Fi.

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Open FatShield

Checks Packages License: GPL v2 Status: experimental alpha

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

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.

Requirements

  • 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.

Install

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 llvm

Extract 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.1

Alternatively, get the source with Git:

git clone https://github.com/Dewopalis/Open-FatShield.git open-fatshield
cd open-fatshield

From either source directory, install and pair:

sudo python3 packaging/install.py
open-fatshield doctor
open-fatshield pair
open-fatshield gui

Run 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 enable

The 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.

Upgrade from the original installation

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 gui

The 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.

Use and troubleshoot

open-fatshield status
open-fatshield status --json
open-fatshield logs
open-fatshield stop
open-fatshield disable

If 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 --uninstall

Configuration 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.

Development

make test
make
python3 packaging/install.py --destdir /tmp/shield-package

The 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.

License

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.

About

Open FatShield: experimental Linux wireless driver and desktop tray for the original NVIDIA SHIELD Controller, alongside normal Wi-Fi.

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages