{ 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 ]; }; }; systemd.services.ustreamer = { enable = true; description = "uStreamer service"; unitConfig = { Type = "simple"; }; serviceConfig = { ExecStartPre = ''${pkgs.v4l-utils}/bin/v4l2-ctl \ --device=/dev/video0 \ --fix-edid-checksums \ --info-edid ''; ExecStart = ''${pkgs.unstable.ustreamer}/bin/ustreamer \ --device=/dev/video0 \ --resolution=1280x720 \ --format=uyvy \ --encoder=m2m-image \ --workers=3 \ --persistent \ --dv-timings \ --drop-same-frames=30 \ --host=0.0.0.0 \ --port=8080 ''; }; wantedBy = [ "network-online.target" ]; confinement.mode = "chroot-only"; }; environment.systemPackages = with pkgs; [ git neovim libcamera libraspberrypi raspberrypi-eeprom v4l-utils unstable.ustreamer ]; system.stateVersion = "24.05"; }