diff --git a/nixos/modules/hardware/keyboard/zsa.nix b/nixos/modules/hardware/keyboard/zsa.nix new file mode 100644 index 00000000000..5cb09e5af49 --- /dev/null +++ b/nixos/modules/hardware/keyboard/zsa.nix @@ -0,0 +1,27 @@ +{ config, lib, pkgs, ... }: + +let + inherit (lib) mkOption mkIf types; + cfg = config.hardware.keyboard.zsa; +in +{ + # TODO: make group configurable like in https://github.com/NixOS/nixpkgs/blob/0b2b4b8c4e729535a61db56468809c5c2d3d175c/pkgs/tools/security/nitrokey-app/udev-rules.nix ? + options.hardware.keyboard.zsa = { + enable = mkOption { + type = types.bool; + default = false; + description = '' + Enables udev rules for keyboards from ZSA like the ErgoDox EZ, Planck EZ and Moonlander Mark I. + You need it when you want to flash a new configuration on the keyboard + or use their live training in the browser. + Access to the keyboard is granted to users in the "plugdev" group. + You may want to install the wally-cli package. + ''; + }; + }; + + config = mkIf cfg.enable { + services.udev.packages = [ pkgs.zsa-udev-rules ]; + users.groups.plugdev = {}; + }; +} diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 3b67a857493..ed6a493e276 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -47,6 +47,7 @@ ./hardware/digitalbitbox.nix ./hardware/device-tree.nix ./hardware/sensor/iio.nix + ./hardware/keyboard/zsa.nix ./hardware/ksm.nix ./hardware/ledger.nix ./hardware/logitech.nix diff --git a/pkgs/os-specific/linux/zsa-udev-rules/default.nix b/pkgs/os-specific/linux/zsa-udev-rules/default.nix new file mode 100644 index 00000000000..76150affe49 --- /dev/null +++ b/pkgs/os-specific/linux/zsa-udev-rules/default.nix @@ -0,0 +1,33 @@ +{ stdenv, fetchFromGitHub }: + +stdenv.mkDerivation { + pname = "zsa-udev-rules"; + version = "unstable-2020-12-16"; + + # TODO: use version and source from nixpkgs/pkgs/development/tools/wally-cli/default.nix after next release + src = fetchFromGitHub { + owner = "zsa"; + repo = "wally"; + rev = "e5dde3c700beab39fb941c6941e55535bf9b2af6"; + sha256 = "0pkybi32r1hrmpa1mc8qlzhv7xy5n5rr5ah25lbr0cipp1bda417"; + }; + + # it only installs files + dontConfigure = true; + dontBuild = true; + dontFixup = true; + + installPhase = '' + mkdir -p $out/lib/udev/rules.d + cp dist/linux64/50-oryx.rules $out/lib/udev/rules.d/ + cp dist/linux64/50-wally.rules $out/lib/udev/rules.d/ + ''; + + meta = with stdenv.lib; { + description = "udev rules for ZSA devices"; + license = licenses.mit; + maintainers = with maintainers; [ davidak ]; + platforms = platforms.linux; + homepage = "https://github.com/zsa/wally/wiki/Linux-install#2-create-a-udev-rule-file"; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index d922b97860a..ac9e4a6337e 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -16462,6 +16462,7 @@ in waffle = callPackage ../development/libraries/waffle { }; wally-cli = callPackage ../development/tools/wally-cli { }; + zsa-udev-rules = callPackage ../os-specific/linux/zsa-udev-rules { }; wavpack = callPackage ../development/libraries/wavpack { };