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}