diff --git a/flake.lock b/flake.lock index dda589b..0c70b65 100644 --- a/flake.lock +++ b/flake.lock @@ -365,6 +365,40 @@ "type": "github" } }, + "libcamera-src": { + "flake": false, + "locked": { + "lastModified": 1718617480, + "narHash": "sha256-qqEMJzMotybf1nJp1dsz3zc910Qj0TmqCm1CwuSb1VY=", + "owner": "raspberrypi", + "repo": "libcamera", + "rev": "6ddd79b5bdbedc1f61007aed35391f1559f9e29a", + "type": "github" + }, + "original": { + "owner": "raspberrypi", + "repo": "libcamera", + "rev": "6ddd79b5bdbedc1f61007aed35391f1559f9e29a", + "type": "github" + } + }, + "libpisp-src": { + "flake": false, + "locked": { + "lastModified": 1718613892, + "narHash": "sha256-V/d4RrXoq8HNc8r/Kr1gH3E7YTZzfIdgbaJtq/Xi7uQ=", + "owner": "raspberrypi", + "repo": "libpisp", + "rev": "b567f04556801ca350331ed21a1ae3eef4675c23", + "type": "github" + }, + "original": { + "owner": "raspberrypi", + "ref": "v1.0.6", + "repo": "libpisp", + "type": "github" + } + }, "nix-darwin": { "inputs": { "nixpkgs": [ @@ -503,6 +537,22 @@ "type": "indirect" } }, + "nixpkgs_4": { + "locked": { + "lastModified": 1722651103, + "narHash": "sha256-IRiJA0NVAoyaZeKZluwfb2DoTpBAj+FLI0KfybBeDU0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a633d89c6dc9a2a8aae11813a62d7c58b2c0cc51", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, "nixvim": { "inputs": { "devshell": "devshell", @@ -554,6 +604,33 @@ "type": "github" } }, + "raspberry-pi-nix": { + "inputs": { + "libcamera-src": "libcamera-src", + "libpisp-src": "libpisp-src", + "nixpkgs": "nixpkgs_4", + "rpi-bluez-firmware-src": "rpi-bluez-firmware-src", + "rpi-firmware-nonfree-src": "rpi-firmware-nonfree-src", + "rpi-firmware-src": "rpi-firmware-src", + "rpi-linux-6_10_0-rc5-src": "rpi-linux-6_10_0-rc5-src", + "rpi-linux-6_6_31-src": "rpi-linux-6_6_31-src", + "rpicam-apps-src": "rpicam-apps-src", + "u-boot-src": "u-boot-src" + }, + "locked": { + "lastModified": 1722525809, + "narHash": "sha256-LTCbMSKbSHvKubfXolss39UeTKDIoP9wWTyXV/tDPHU=", + "owner": "nix-community", + "repo": "raspberry-pi-nix", + "rev": "35bb455fdeb495043a94433f67e05fa88980cdad", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "raspberry-pi-nix", + "type": "github" + } + }, "root": { "inputs": { "agenix": "agenix", @@ -569,10 +646,113 @@ "nixpkgs-unstable": "nixpkgs-unstable", "nixvim": "nixvim", "plasma-manager": "plasma-manager", + "raspberry-pi-nix": "raspberry-pi-nix", "secrets": "secrets", "thunderbird-gnome-theme": "thunderbird-gnome-theme" } }, + "rpi-bluez-firmware-src": { + "flake": false, + "locked": { + "lastModified": 1708969706, + "narHash": "sha256-KakKnOBeWxh0exu44beZ7cbr5ni4RA9vkWYb9sGMb8Q=", + "owner": "RPi-Distro", + "repo": "bluez-firmware", + "rev": "78d6a07730e2d20c035899521ab67726dc028e1c", + "type": "github" + }, + "original": { + "owner": "RPi-Distro", + "ref": "bookworm", + "repo": "bluez-firmware", + "type": "github" + } + }, + "rpi-firmware-nonfree-src": { + "flake": false, + "locked": { + "lastModified": 1708967191, + "narHash": "sha256-BGq0+cr+xBRwQM/LqiQuRWuZpQsKM5jfcrNCqWMuVzM=", + "owner": "RPi-Distro", + "repo": "firmware-nonfree", + "rev": "223ccf3a3ddb11b3ea829749fbbba4d65b380897", + "type": "github" + }, + "original": { + "owner": "RPi-Distro", + "ref": "bookworm", + "repo": "firmware-nonfree", + "type": "github" + } + }, + "rpi-firmware-src": { + "flake": false, + "locked": { + "lastModified": 1716978780, + "narHash": "sha256-KsCo7ZG6vKstxRyFljZtbQvnDSqiAPdUza32xTY/tlA=", + "owner": "raspberrypi", + "repo": "firmware", + "rev": "3590de0c181d433af368a95f15bc480bdaff8b47", + "type": "github" + }, + "original": { + "owner": "raspberrypi", + "ref": "1.20240529", + "repo": "firmware", + "type": "github" + } + }, + "rpi-linux-6_10_0-rc5-src": { + "flake": false, + "locked": { + "lastModified": 1719265450, + "narHash": "sha256-xd/Pz/uZFYW9hJIFKryWDE9Aks6f2EIvEDCmfk0C70c=", + "owner": "raspberrypi", + "repo": "linux", + "rev": "f61d3aca8045e70d64b55f7b98f083738f639ad2", + "type": "github" + }, + "original": { + "owner": "raspberrypi", + "ref": "rpi-6.10.y", + "repo": "linux", + "type": "github" + } + }, + "rpi-linux-6_6_31-src": { + "flake": false, + "locked": { + "lastModified": 1716545726, + "narHash": "sha256-UWUTeCpEN7dlFSQjog6S3HyEWCCnaqiUqV5KxCjYink=", + "owner": "raspberrypi", + "repo": "linux", + "rev": "c1432b4bae5b6582f4d32ba381459f33c34d1424", + "type": "github" + }, + "original": { + "owner": "raspberrypi", + "ref": "stable_20240529", + "repo": "linux", + "type": "github" + } + }, + "rpicam-apps-src": { + "flake": false, + "locked": { + "lastModified": 1717081637, + "narHash": "sha256-s4zJh6r3VhiquO54KWZ78dVCH1BmlphY9zEB9BidNyo=", + "owner": "raspberrypi", + "repo": "rpicam-apps", + "rev": "49344f2a8d1817558d4e6463032fcf11be618b38", + "type": "github" + }, + "original": { + "owner": "raspberrypi", + "ref": "v1.5.0", + "repo": "rpicam-apps", + "type": "github" + } + }, "secrets": { "flake": false, "locked": { @@ -671,6 +851,19 @@ "type": "github" } }, + "u-boot-src": { + "flake": false, + "locked": { + "lastModified": 1712055538, + "narHash": "sha256-IlaDdjKq/Pq2orzcU959h93WXRZfvKBGDO/MFw9mZMg=", + "type": "tarball", + "url": "https://ftp.denx.de/pub/u-boot/u-boot-2024.04.tar.bz2" + }, + "original": { + "type": "tarball", + "url": "https://ftp.denx.de/pub/u-boot/u-boot-2024.04.tar.bz2" + } + }, "utils": { "inputs": { "systems": "systems_2" diff --git a/flake.nix b/flake.nix index fe7a2da..e182efb 100644 --- a/flake.nix +++ b/flake.nix @@ -41,6 +41,9 @@ inputs.nixpkgs.follows = "nixpkgs"; inputs.home-manager.follows = "home-manager"; }; + raspberry-pi-nix = { + url = "github:nix-community/raspberry-pi-nix"; + }; secrets = { url = "git+ssh://git@git.vimium.com/jordan/nix-secrets.git"; flake = false; @@ -114,7 +117,7 @@ mail = mkNixosSystem { system = "x86_64-linux"; name = "mail"; }; odyssey = mkNixosSystem { system = "x86_64-linux"; name = "odyssey"; }; pi = mkNixosSystem { system = "aarch64-linux"; name = "pi"; extraModules = [ nixos-hardware.nixosModules.raspberry-pi-4 ]; }; - skycam = mkNixosSystem { system = "aarch64-linux"; name = "skycam"; extraModules = [ nixos-hardware.nixosModules.raspberry-pi-4 ]; }; + skycam = mkNixosSystem { system = "aarch64-linux"; name = "skycam"; extraModules = [ inputs.raspberry-pi-nix.nixosModules.raspberry-pi ]; }; vps1 = mkNixosSystem { system = "x86_64-linux"; name = "vps1"; }; }; diff --git a/hosts/common.nix b/hosts/common.nix index 6fe3fe9..100cc55 100644 --- a/hosts/common.nix +++ b/hosts/common.nix @@ -52,10 +52,12 @@ auto-optimise-store = true; substituters = [ "http://odyssey.mesh.vimium.net" + "https://nix-community.cachix.org" "https://cache.nixos.org" ]; trusted-public-keys = [ "odyssey.mesh.vimium.net:ZhQhjscPWjoN4rlZwoMELznEiBnZ9O26iyGA27ibilQ=" + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" ]; }; gc = { diff --git a/hosts/skycam/default.nix b/hosts/skycam/default.nix index 31c542b..bea0112 100644 --- a/hosts/skycam/default.nix +++ b/hosts/skycam/default.nix @@ -6,49 +6,7 @@ ../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" - ''; + raspberry-pi-nix.board = "bcm2711"; networking = { hostId = "731d1660"; @@ -68,12 +26,10 @@ services.openssh.settings.PermitRootLogin = lib.mkForce "prohibit-password"; environment.systemPackages = with pkgs; [ - camera-streamer git neovim libraspberrypi raspberrypi-eeprom - rpicam-apps v4l-utils unstable.ustreamer ]; diff --git a/hosts/skycam/hardware-configuration.nix b/hosts/skycam/hardware-configuration.nix index 65f519a..20155b8 100644 --- a/hosts/skycam/hardware-configuration.nix +++ b/hosts/skycam/hardware-configuration.nix @@ -1,24 +1,6 @@ { config, lib, modulesPath, ... }: { - imports = [ - (modulesPath + "/installer/sd-card/sd-image-aarch64.nix") - ]; - - boot = { - kernelModules = [ "bcm2835-v4l2" ]; - kernelParams = [ "cma=512M" ]; - supportedFilesystems = lib.mkForce [ "f2fs" "vfat xfs" ]; - tmp.cleanOnBoot = true; - }; - - nixpkgs.overlays = [ - (final: super: { - makeModulesClosure = x: - super.makeModulesClosure (x // { allowMissing = true; }); - }) - ]; - fileSystems = { "/" = { device = "/dev/disk/by-label/NIXOS_SD"; diff --git a/modules/options.nix b/modules/options.nix index 0ab1d70..014ea98 100644 --- a/modules/options.nix +++ b/modules/options.nix @@ -36,7 +36,7 @@ with lib; in { inherit name; isNormalUser = true; - extraGroups = [ "networkmanager" "wheel" "lxd" ]; + extraGroups = [ "networkmanager" "wheel" "lxd" "video" ]; description = "Jordan Holt"; useDefaultShell = true; openssh.authorizedKeys.keys = [ diff --git a/overlays/0001-Always-installed.patch b/overlays/0001-Always-installed.patch new file mode 100644 index 0000000..42b275a --- /dev/null +++ b/overlays/0001-Always-installed.patch @@ -0,0 +1,32 @@ +From ff76624c4407c6132cd4068e6ce065a7b429351f Mon Sep 17 00:00:00 2001 +From: Jordan Holt +Date: Sun, 4 Aug 2024 15:46:04 +0100 +Subject: [PATCH] Always installed + +--- + src/libcamera/source_paths.cpp | 9 --------- + 1 file changed, 9 deletions(-) + +diff --git a/src/libcamera/source_paths.cpp b/src/libcamera/source_paths.cpp +index 1af5386a..3fc7d044 100644 +--- a/src/libcamera/source_paths.cpp ++++ b/src/libcamera/source_paths.cpp +@@ -39,15 +39,6 @@ namespace { + */ + bool isLibcameraInstalled() + { +- /* +- * DT_RUNPATH (DT_RPATH when the linker uses old dtags) is removed on +- * install. +- */ +- for (const ElfW(Dyn) *dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn) { +- if (dyn->d_tag == DT_RUNPATH || dyn->d_tag == DT_RPATH) +- return false; +- } +- + return true; + } + +-- +2.44.1 + diff --git a/overlays/libcamera.nix b/overlays/libcamera.nix new file mode 100644 index 0000000..4ed9aa3 --- /dev/null +++ b/overlays/libcamera.nix @@ -0,0 +1,48 @@ +{ libcamera-src +, libpisp-src +, ... +}: +final: prev: +{ + libpisp = final.stdenv.mkDerivation { + name = "libpisp"; + version = "1.0.6"; + src = libpisp-src; + nativeBuildInputs = with final; [ pkg-config meson ninja ]; + buildInputs = with final; [ nlohmann_json boost ]; + # Meson is no longer able to pick up Boost automatically. + # https://github.com/NixOS/nixpkgs/issues/86131 + BOOST_INCLUDEDIR = "${prev.lib.getDev final.boost}/include"; + BOOST_LIBRARYDIR = "${prev.lib.getLib final.boost}/lib"; + }; + + libcamera = prev.libcamera.overrideAttrs (old: { + version = "0.2.0"; + src = libcamera-src; + buildInputs = old.buildInputs ++ (with final; [ + libpisp openssl libtiff + (python3.withPackages (ps: with ps; [ + python3-gnutls pybind11 pyyaml ply + ])) + libglibutil gst_all_1.gst-plugins-base + ]); + patches = [ ./0001-Always-installed.patch ]; + postPatch = '' + patchShebangs utils/ + patchShebangs src/py/ + ''; + mesonFlags = [ + "--buildtype=release" + "-Dpipelines=rpi/vc4,rpi/pisp" + "-Dipas=rpi/vc4,rpi/pisp" + "-Dv4l2=true" + "-Dgstreamer=enabled" + "-Dtest=false" + "-Dlc-compliance=disabled" + "-Dcam=disabled" + "-Dqcam=disabled" + "-Ddocumentation=enabled" + "-Dpycamera=enabled" + ]; + }); +}