main
 1{den, ...}: {
 2  den.aspects.desktop.game.includes = [den.aspects.desktop.game.gamepad];
 3  den.aspects.desktop.game.gamepad = {
 4    nixos = {
 5      pkgs,
 6      lib,
 7      config,
 8      ...
 9    }: let
10      # Fix DualSense haptics until https://github.com/alsa-project/alsa-ucm-conf/issues/677 been resolved.
11      alsa-ucm-conf-dualsense-haptics = with pkgs;
12        alsa-ucm-conf.overrideAttrs {
13          # https://github.com/alsa-project/alsa-ucm-conf/issues/677#issuecomment-3759801501
14          patches = [
15            ./alsa-ucm-dualsense-haptics.patch
16          ];
17        };
18
19      kernel = config.boot.kernelPackages.kernel;
20
21      # TODO: Drop workaround after https://github.com/NixOS/nixpkgs/pull/576469 merged
22      xpad-noone = config.boot.kernelPackages.xpad-noone.overrideAttrs (old: {
23        makeFlags =
24          old.makeFlags
25          ++ [
26            "KERNEL_SRC=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build"
27            "INSTALL_MOD_PATH=${placeholder "out"}"
28            "INSTALL_MOD_DIR=kernel/drivers/xpad-noone"
29            "INSTALL_MOD_STRIP=1"
30            "DEPMOD=true"
31          ];
32        installTargets = ["modules_install"];
33        installFlags = [
34          "-C"
35          "${kernel.dev}/lib/modules/${kernel.modDirVersion}/build"
36          "M=$(PWD)"
37        ];
38        installPhase = null;
39        strictDeps = true;
40        __structuredAttrs = true;
41      });
42    in {
43      hardware = {
44        uinput.enable = true;
45        xone.enable = true;
46        xpadneo.enable = true;
47        xpad-noone.enable = false;
48      };
49
50      environment.sessionVariables.ALSA_CONFIG_UCM2 = "${alsa-ucm-conf-dualsense-haptics}/share/alsa/ucm2";
51
52      boot = {
53        extraModulePackages = [
54          config.boot.kernelPackages.xpadneo
55          xpad-noone
56        ];
57        extraModprobeConfig = ''
58          options bluetooth disable_ertm=Y
59          ${
60            # Linux 7.1-7.2 falsely hides the DualSense "PCM Playback Volume"
61            # that haptics need; 7.3 demotes the check and clears the flag.
62            let
63              kernelVersion = lib.getVersion config.boot.kernelPackages.kernel;
64            in
65              lib.optionalString
66              (lib.versionAtLeast kernelVersion "7.1" && lib.versionOlder kernelVersion "7.3")
67              "options snd_usb_audio quirk_flags=054c:0ce6:MIXER_GET_CUR_BROKEN,054c:0df2:MIXER_GET_CUR_BROKEN"
68          }
69        '';
70        kernelModules = [
71          "hid_microsoft"
72        ];
73      };
74
75      services.udev.packages = [
76        pkgs.game-devices-udev-rules
77      ];
78    };
79  };
80}