diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..934192c --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1759381078, + "narHash": "sha256-gTrEEp5gEspIcCOx9PD8kMaF1iEmfBcTbO0Jag2QhQs=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "7df7ff7d8e00218376575f0acdcc5d66741351ee", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..7fb4142 --- /dev/null +++ b/flake.nix @@ -0,0 +1,96 @@ +{ + inputs.nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; + + outputs = { + self, + nixpkgs, + }: let + system = "x86_64-linux"; + pkgs = nixpkgs.legacyPackages.${system}; + lib = nixpkgs.lib; + in { + packages."${system}" = let + inherit (pkgs.linuxPackages_latest) kernel; + kmod = pkgs.callPackage ./nix/kmod.nix {inherit kernel;}; + in { + inherit kernel kmod; + }; + + nixosConfigurations."gamma" = let + inherit (lib) nixosSystem; + inherit (lib.modules) mkDefault; + in + nixosSystem { + system = null; + modules = [ + ({modulesPath, ...}: { + imports = [(modulesPath + "/profiles/qemu-guest.nix")]; + networking.hostName = "gamma"; + + boot = { + growPartition = false; + kernelParams = ["console=ttyAMA0,115200n8" "console=tty0"]; + consoleLogLevel = mkDefault 7; # ground control to kernel + }; + + # Empty password + # root can login without a password + users.extraUsers.root.initialHashedPassword = ""; + + # Nixpkgs options + nixpkgs.pkgs = pkgs; # discard everything else, follow flake `pkgs` + + # Packages + environment.systemPackages = [pkgs.microfetch]; + + # Bootable + fileSystems."/boot" = { + device = "/dev/vda1"; + fsType = "vfat"; + }; + + fileSystems."/" = { + device = "/dev/vda2"; + fsType = "ext4"; + }; + + boot.loader.grub = { + efiSupport = true; + efiInstallAsRemovable = true; + device = "nodev"; + }; + + # Kernel fun + boot = { + # Use kernel package defined in flake.nix + kernelPackages = pkgs.linuxPackagesFor self.packages.${system}.kernel; # exposed kernel + + # Get test module from flake outputs + extraModulePackages = [self.packages.${system}.kmod]; + + # Load module from package. + # Alternatively, `$ modprobe test` would work too + kernelModules = ["deepcool"]; + }; + + # Make it smaller + documentation = { + doc.enable = false; + man.enable = false; + nixos.enable = false; + info.enable = false; + }; + + # Get out. + programs = { + bash.completion.enable = false; + command-not-found.enable = false; + }; + + # Shut up. + system.stateVersion = "25.11"; + }) + ]; + }; + }; +} diff --git a/nix/kmod.nix b/nix/kmod.nix new file mode 100644 index 0000000..0d4dabb --- /dev/null +++ b/nix/kmod.nix @@ -0,0 +1,76 @@ +{ + lib, + stdenv, + linuxPackages_latest, + kernel ? linuxPackages_latest.kernel, + ... +}: let + pname = "deepcool"; + version = "0.1.0"; +in + stdenv.mkDerivation { + inherit pname version; + + src = let + fs = lib.fileset; + sp = ../.; + in + fs.toSource { + root = sp; + fileset = fs.unions [ + (sp + /deepcool.c) + (sp + /Makefile) + ]; + }; + + enableParallelBuilding = true; + nativeBuildInputs = kernel.moduleBuildDependencies; + hardeningDisable = ["pic" "format"]; + + env = { + KVERSION = kernel.modDirVersion; + INSTALL_MOD_PATH = builtins.placeholder "out"; + }; + + buildPhase = '' + runHook preBuild + echo "Kernel version: $KVERSION" + make -C ${kernel.dev}/lib/modules/${kernel.modDirVersion}/build \ + M=$(pwd) \ + modules + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + echo "Module Installation Path: $INSTALL_MOD_PATH" + make -C ${kernel.dev}/lib/modules/${kernel.modDirVersion}/build \ + M=$(pwd) \ + modules_install + runHook postInstall + ''; + + postInstall = '' + if [ -d $out/lib/modules/${kernel.modDirVersion}/extra ]; then + mkdir -p $out/lib/modules/${kernel.modDirVersion}/kernel/drivers/hid + find $out/lib/modules/${kernel.modDirVersion}/extra -name "*.ko*" \ + -exec mv {} $out/lib/modules/${kernel.modDirVersion}/kernel/drivers/hid/ \; + rmdir $out/lib/modules/${kernel.modDirVersion}/extra 2>/dev/null || true + fi + ''; + + passthru = { + inherit kernel; + kernelVersion = kernel.modDirVersion; + moduleName = "deepcool_digital"; + modulePath = "kernel/drivers/hid/deepcool_digital.ko"; + }; + + meta = { + description = "Linux kernel module for Deepcool Digital USB HID devices"; + license = lib.licenses.gpl2Plus; + maintainers = []; + platforms = lib.platforms.linux; + broken = lib.versionOlder kernel.version "5.10"; + }; + }