{ config, pkgs, ... }: { imports = [ ./hardware-configuration.nix ../server.nix ]; 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 wireless-regdb ]; }; services.udev.extraRules = '' SUBSYSTEM="dma_heap", GROUP="video", MODE="0600" ''; networking = { hostId = "731d1660"; firewall = { enable = true; allowedTCPPorts = [ 8080 ]; allowedUDPPorts = [ 8080 ]; }; }; environment.systemPackages = with pkgs; [ camera-streamer git neovim libraspberrypi raspberrypi-eeprom rpicam-apps v4l-utils unstable.ustreamer ]; system.stateVersion = "24.05"; }