Kaynağa Gözat

feat(odin+udev): rules to link pwm fans for hddfancontrol

Zander Hawke 9 ay önce
ebeveyn
işleme
e3e1db9c80

+ 25 - 29
hosts/odin/system/default.nix

@@ -1,5 +1,6 @@
 { config
 , inputs
+, pkgs
 , ...
 }:
 {
@@ -35,14 +36,6 @@
       "net.core.default_qdisc" = "cake";
     };
 
-    initrd.services.udev.rules = ''
-      ACTION=="add", SUBSYSTEM=="hwmon", DEVPATH=="/devices/platform/*/hwmon/hwmon*", \
-      MODE="0660", GROUP="plugdev", \
-      RUN+="/bin/sh -c 'for pwm in $(find /sys%p -name \"pwm[0-9]*\" | sort); do \
-          num=$(echo \"$pwm\" | sed -n \"s/.*pwm\([0-9]\+\).*/\1/p\"); \
-          ln -sf \"$pwm\" \"/dev/pwm$num\"; \
-      done'"
-    '';
   };
 
   hardware.fancontrol = {
@@ -62,27 +55,30 @@
     '';
   };
 
-  services.hddfancontrol.enable = true;
-  services.hddfancontrol.settings = {
-    harddrives =
-      let
-        devices = config.disko.devices.disk;
-      in
-      {
-        disks = [
-          devices.parity1.device
-          devices.data1.device
-          devices.data2.device
-        ];
-        pwmPaths = [
-          "/sys/class/hwmon/hwmon[[:print:]]*/pwm1:20:0"
-          "/sys/class/hwmon/hwmon[[:print:]]*/pwm4:80:60"
-        ];
-        logVerbosity = "DEBUG";
-        extraArgs = [
-          "--min-fan-speed-prct=0"
-        ];
-      };
+  services = {
+    udev.packages = [ pkgs.nct6775-pwm-udev-package ];
+    hddfancontrol.enable = true;
+    hddfancontrol.settings = {
+      harddrives =
+        let
+          devices = config.disko.devices.disk;
+        in
+        {
+          disks = [
+            devices.parity1.device
+            devices.data1.device
+            devices.data2.device
+          ];
+          pwmPaths = [
+            "/run/hwmon/pwm1:20:0"
+            "/run/hwmon/pwm4:80:60"
+          ];
+          logVerbosity = "DEBUG";
+          extraArgs = [
+            "--min-fan-speed-prct=0"
+          ];
+        };
+    };
   };
 
   # Btrfs maintenance

+ 1 - 0
packages/default.nix

@@ -1,6 +1,7 @@
 { pkgs ? (import <nixpkgs>) { } }: {
   aerospace-tmux-focus = pkgs.callPackage ./aerospace-tmux-focus.nix { };
   hello = pkgs.callPackage ./hello.nix { };
+  nct6775-pwm-udev-package = pkgs.callPackage ./nct6775-pwm-udev-package.nix { };
   opencode-nvim = pkgs.callPackage ./opencode-nvim.nix { };
   photo-cli = pkgs.callPackage ./photo-cli.nix { };
   quick-setup = pkgs.callPackage ./quick-setup.nix { };

+ 47 - 0
packages/nct6775-pwm-udev-package.nix

@@ -0,0 +1,47 @@
+{ pkgs }:
+
+pkgs.stdenv.mkDerivation {
+  pname = "nct6775-pwm-udev-rules";
+  version = "1.0";
+
+  dontUnpack = true;
+  dontBuild = true;
+
+  linkScript = pkgs.writeShellScript "link-nct6775-pwm" ''
+    echo "NCT6775 udev rule triggered at $(date): devpath=$1" >> /tmp/udev-nct-debug.log
+    # Input: DEVPATH from udev (e.g., /devices/platform/nct6775.656/hwmon/hwmon3)
+    DEVPATH="$1"
+    HWMON_PATH="/sys$DEVPATH"
+    SYMLINK_DIR="/run/hwmon"
+
+    # Ensure the symlink directory exists
+    mkdir -p "$SYMLINK_DIR" || { echo "Failed to create $SYMLINK_DIR"; exit 1; }
+
+    # Create symlinks for all attributes in the hwmon directory
+    for attr in "$HWMON_PATH"/*; do
+      if [ -e "$attr" ]; then
+        attr_name=$(basename "$attr")
+        echo "Linking $attr_name -> $SYMLINK_DIR/$attr_name" >> /tmp/udev-nct-debug.log
+        ln -sf "$attr" "$SYMLINK_DIR/$attr_name" || echo "Failed to create symlink for $attr_name"
+      else
+        echo "No attributes found in $HWMON_PATH"
+      fi
+    done
+
+    ls -la /sys/hwmon/ >> /tmp/udev-nct-debug.log 2>/dev/null || true
+  '';
+
+  installPhase = ''
+    mkdir -p $out/etc/udev/rules.d
+    cat > $out/etc/udev/rules.d/99-nct6775-pwm.rules << EOF
+    # Create constant paths for NCT6775 PWM controls
+    SUBSYSTEM=="hwmon", KERNEL=="hwmon[0-9]*", RUN+="$linkScript %p"
+    EOF
+  '';
+
+  meta = with pkgs.lib; {
+    description = "Udev rules for NCT6775 PWM device symlinks";
+    license = licenses.mit;
+    platforms = platforms.linux;
+  };
+}