{ inputs, config, lib, pkgs, modulesPath, ... }: { imports = [ inputs.nixos-hardware.nixosModules.raspberry-pi-4 (modulesPath + "/installer/sd-card/sd-image-aarch64.nix") ]; boot = { kernelParams = [ "panic=0" ]; supportedFilesystems = lib.mkForce [ "f2fs" "vfat" "xfs" ]; tmp.cleanOnBoot = false; }; hardware = { raspberry-pi."4" = { apply-overlays-dtmerge.enable = true; audio.enable = false; xhci.enable = false; }; deviceTree = { enable = true; filter = "*rpi-4-*.dtb"; # From https://github.com/Electrostasy/dots/blob/3b81723feece67610a252ce754912f6769f0cd34/hosts/phobos/klipper.nix#L43-L65 overlays = let mkCompatibleDtsFile = dtbo: let drv = pkgs.runCommand "fix-dts" { nativeBuildInputs = with pkgs; [ dtc gnused ]; } '' mkdir "$out" dtc -I dtb -O dts ${dtbo} | sed -e 's/bcm2835/bcm2711/' > $out/overlay.dts ''; in "${drv}/overlay.dts"; inherit (config.boot.kernelPackages) kernel; in [ { name = "imx708.dtbo"; dtsFile = mkCompatibleDtsFile "${kernel}/dtbs/overlays/imx708.dtbo"; } { name = "vc4-kms-v3d-pi4.dtbo"; dtsFile = mkCompatibleDtsFile "${kernel}/dtbs/overlays/vc4-kms-v3d-pi4.dtbo"; } ]; }; firmware = with pkgs; [ firmwareLinuxNonfree ]; }; services.udev.extraRules = '' SUBSYSTEM=="rpivid-*", GROUP="video", MODE="0660" KERNEL=="vcsm-cma", GROUP="video", MODE="0660" SUBSYSTEM=="dma_heap", GROUP="video", MODE="0660" SUBSYSTEM=="dma_heap", KERNEL=="linux,cma", SYMLINK+="dma_heap/vidbuf_cached", OPTIONS+="link_priority=-50" ''; nixpkgs.overlays = [ (final: super: { makeModulesClosure = x: super.makeModulesClosure (x // { allowMissing = true; }); }) ]; fileSystems = { "/" = { device = "/dev/disk/by-label/NIXOS_SD"; fsType = "ext4"; options = [ "noatime" ]; }; }; }