aboutsummaryrefslogtreecommitdiff
path: root/nixos/modules
diff options
context:
space:
mode:
Diffstat (limited to 'nixos/modules')
-rw-r--r--nixos/modules/turris-omnialeds.nix152
1 files changed, 152 insertions, 0 deletions
diff --git a/nixos/modules/turris-omnialeds.nix b/nixos/modules/turris-omnialeds.nix
new file mode 100644
index 0000000..8063eb6
--- /dev/null
+++ b/nixos/modules/turris-omnialeds.nix
@@ -0,0 +1,152 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.turris.omnialeds;
+
+ ledConfig = {name, trigger ? "none", netdevName ? null, color}: {
+ enabled = mkOption {
+ type = types.bool;
+ default = true;
+ description = "If LED should be enabled at all";
+ };
+ brightness = mkOption {
+ type = types.ints.u8;
+ default = 255;
+ description = "Set brightness intensity";
+ };
+ color = let
+ clr = c: mkOption {
+ type = types.ints.u8;
+ default = color.${c};
+ description = "Set intensity for the color ${c}";
+ };
+ in {
+ red = clr "red";
+ green = clr "green";
+ blue = clr "blue";
+ };
+ trigger = mkOption {
+ type = types.str;
+ default = trigger;
+ description = "Trigger for the LED";
+ };
+ # netdev trigger
+ netdevName = mkOption {
+ type = with types; nullOr str;
+ default = netdevName;
+ description = ''
+ Name of the network device to trigger when trigger is set to `netdev`
+ '';
+ };
+ };
+ lanConfig = i: ledConfig {
+ name = "lan${toString i}";
+ trigger = "netdev";
+ netdevName = "lan${toString i}";
+ color = {
+ red = 255; green = 255; blue = 0;
+ };
+ };
+ wlanConfig = i: ledConfig {
+ name = "wlan${toString i}";
+ color = {
+ red = 0; green = 255; blue = 255;
+ };
+ };
+ indicatorConfig = i: ledConfig {
+ name = "indicator${toString i}";
+ color = {
+ red = 0; green = 255; blue = 255;
+ };
+ };
+
+ ledSetup = sysname: lcfg: ''
+ echo ${toString lcfg.brightness} > /sys/class/leds/rgb:${sysname}/brightness
+ echo ${toString lcfg.color.red} ${toString lcfg.color.green} ${toString lcfg.color.blue} > /sys/class/leds/rgb:${sysname}/multi_intensity
+ echo ${lcfg.trigger} > /sys/class/leds/rgb:${sysname}/trigger
+ ${optionalString (lcfg.trigger == "netdev") "echo '${lcfg.netdevName}' > /sys/class/leds/rgb:${sysname}/device_name"}
+ '';
+
+in {
+
+ options = {
+ turris.omnialeds = {
+ enabled = mkOption {
+ type = types.bool;
+ default = true;
+ description = "If Omnia LEDs setup should be enabled or not.";
+ };
+ brightness = mkOption {
+ type = with types; nullOr (ints.between 0 100);
+ default = null;
+ description = "Global brightness (overrides brightness set by the front button)";
+ };
+ power = ledConfig {
+ name = "power";
+ trigger = "heartbeat";
+ color = {
+ red = 0; green = 255; blue = 0;
+ };
+ };
+ wan = ledConfig {
+ name = "wan";
+ trigger = "netdev";
+ netdevName = "eth2";
+ color = {
+ red = 0; green = 255; blue = 0;
+ };
+ };
+ lan0 = lanConfig 0;
+ lan1 = lanConfig 1;
+ lan2 = lanConfig 2;
+ lan3 = lanConfig 3;
+ lan4 = lanConfig 4;
+ wlan1 = wlanConfig 1;
+ wlan2 = wlanConfig 2;
+ wlan3 = wlanConfig 3;
+ indicator1 = indicatorConfig 1;
+ indicator2 = indicatorConfig 2;
+ extraCommands = mkOption {
+ type = types.lines;
+ default = "";
+ description = "Extra commands executed to setup LEDs";
+ };
+ };
+ };
+
+ config = mkIf (config.turris.board == "omnia" && cfg.enabled) {
+
+ # TODO modprobe triggers only if required
+ boot.kernelModules = [
+ "ledtrig_tty" "ledtrig_activity" "ledtrig_pattern" "ledtrig_netdev"
+ "ledtrig_usbport"
+ ];
+
+ systemd.services."omnia-leds" = {
+ script = ''
+ ${optionalString (cfg.brightness != null)
+ "echo ${toString cfg.brightness} > /sys/devices/platform/soc/soc:internal-regs/f1011000.i2c/i2c-0/i2c-1/1-002b/brightness"}
+ ${ledSetup "power" cfg.power}
+ ${ledSetup "wan" cfg.wan}
+ ${ledSetup "lan-0" cfg.lan0}
+ ${ledSetup "lan-1" cfg.lan1}
+ ${ledSetup "lan-2" cfg.lan2}
+ ${ledSetup "lan-3" cfg.lan3}
+ ${ledSetup "lan-4" cfg.lan4}
+ ${ledSetup "wlan-1" cfg.wlan1}
+ ${ledSetup "wlan-2" cfg.wlan2}
+ ${ledSetup "wlan-3" cfg.wlan3}
+ ${ledSetup "indicator-1" cfg.indicator1}
+ ${ledSetup "indicator-2" cfg.indicator2}
+
+ # Extra commands
+ ${cfg.extraCommands}
+ '';
+ wantedBy = [ "multi-user.target" ];
+ };
+
+ };
+}