configuration.nix (5500B)
1 { lib, config, pkgs, ... }: 2 3 let 4 local_config = if (builtins.pathExists ./local/module.nix) 5 then ./local/module.nix 6 else null; 7 saturn = pkgs.callPackage ./pkgs/saturn {}; 8 9 drm-framebuffer = pkgs.stdenv.mkDerivation { 10 name = "drm-framebuffer"; 11 src = pkgs.fetchFromGitHub { 12 owner = "embear-engineering"; 13 repo = "drm-framebuffer"; 14 rev = "80e862bd13bc0f96848af1c1b24b4b0e1fe5b23c"; 15 hash = "sha256-YBRG8FUbhwAgquzehvo5Mu+xODcWOOG1HTMtUhNq6xo="; 16 }; 17 nativeBuildInputs = [ pkgs.pkg-config ]; 18 buildInputs = with pkgs; [ libdrm ]; 19 preBuild = '' 20 makeFlagsArray+=("CFLAGS=$($PKG_CONFIG --libs --cflags libdrm)") 21 ''; 22 makeFlags = [ "DESTDIR=${placeholder "out"}" "bindir=/bin" ]; 23 }; 24 25 modemFirmware = config.mobile.device.firmware.override { 26 modem = ./local/harpia-modem; 27 }; 28 secrets = import ./local/secrets.nix; 29 in { 30 imports = [ 31 (import ../mobile-nixos/lib/configuration.nix { device = "motorola-harpia"; }) 32 ] ++ lib.optional (local_config != null) local_config; 33 34 35 config = { 36 nixpkgs.overlays = [ 37 (final: prev: { 38 wlr-randr = prev.wlr-randr.overrideAttrs(o: { 39 depsBuildBuild = [ final.pkgsBuildBuild.pkg-config ]; 40 }); 41 maps = final.callPackage ./pkgs/maps {}; 42 qmi-nmea = final.callPackage ./pkgs/qmi-nmea {}; 43 }) 44 ]; 45 mobile = { 46 adbd.enable = false; 47 boot.stage-1.firmware = [ 48 modemFirmware 49 pkgs.wireless-regdb 50 ]; 51 }; 52 hardware.firmware = [ 53 modemFirmware 54 pkgs.wireless-regdb 55 ]; 56 system.stateVersion = "23.11"; 57 58 boot.kernelParams = [ 59 # "dyndbg=\"file drivers/base/firmware_loader/main.c +fmp\"" 60 # "dyndbg=\"file drivers/gpu/drm/panel/msm8953-generated/panel-boe-bs052fhm-a00-6c01.c +fmp\"" 61 # "dyndbg=\"file drivers/video/backlight/qcom-wled.c +fmp\"" 62 ]; 63 64 fileSystems."/boot" = { 65 device = "/dev/disk/by-label/nixos-boot"; 66 fsType = "ext2"; 67 }; 68 69 # according to fdisk, /dev/mmcblk0p41 is 30469887-7471104=22998783 70 # blocks, and if we let it get resized by whatever magic this is 71 # (I'm assuming systemd-growfs), on the subsequent boot we'll get 72 # an error 73 74 # EXT4-fs (mmcblk0p41): bad geometry: block count 2883067 exceeds size of device (2874848 blocks) 75 76 # in which neither number matches the reported size (they're both 77 # about 10% of it). cool. 78 79 boot.growPartition = lib.mkForce false; 80 81 services.udev.extraRules = '' 82 # unlock the gps engine 83 SUBSYSTEM=="wwan", ENV{DEVNAME}=="/dev/wwan0qmi0", ENV{DEVTYPE}=="wwan_port", \ 84 RUN+="${pkgs.libqmi}/bin/qmicli -pd $env{DEVNAME} --loc-set-engine-lock=none" 85 ''; 86 87 networking = { 88 interfaces.wlan0.useDHCP = true; 89 hostName = "biscuit"; 90 networkmanager = { 91 enable = true; 92 unmanaged = ["wlan0"]; 93 }; 94 useNetworkd = true; 95 # requires nixpkgs 0deadd5baf (Dec 2024) 96 modemmanager.enable = true; 97 inherit (secrets) wireless; 98 }; 99 100 services.openssh.enable = true; 101 102 services.cage = 103 let wlinit = pkgs.writeScript "wlinit" '' 104 ${pkgs.wlr-randr}/bin/wlr-randr --output DSI-1 --scale 2 105 exec ${saturn}/bin/saturn 106 ''; 107 in { 108 enable = true; 109 program = wlinit; 110 user = "dan"; 111 }; 112 systemd.services.cage-tty1 = { 113 conflicts = [ "getty@tty1.service" ]; 114 }; 115 systemd.services."getty@tty1.service" = { 116 enable = false; 117 wantedBy = lib.mkForce []; # Ensures it isn't pulled in by other services 118 }; 119 environment.systemPackages = with pkgs; [ 120 drm-framebuffer 121 satellite 122 wlr-randr 123 maps 124 qmi-nmea 125 ]; 126 environment.sessionVariables = { 127 GSK_RENDERER = "cairo"; # gl is crashing with Satellite app 128 }; 129 130 131 users.users.dan = { 132 isNormalUser = true; 133 uid = 1000; 134 extraGroups = [ "wheel" "libvirtd" "docker" "dialout" ]; 135 openssh.authorizedKeys.keys = import ../telent-nixos-config/users/dan/authorized-keys.nix; 136 }; 137 138 users.users.root.openssh.authorizedKeys.keys = import ../telent-nixos-config/users/dan/authorized-keys.nix; 139 140 hardware.opengl = { 141 # enable = true; driSupport = true; 142 }; 143 hardware.bluetooth.enable = true; 144 145 systemd.services = { 146 nmea-share = { 147 wantedBy = [ "multi-user.target" ]; 148 serviceConfig = { 149 ExecStart = '' 150 ${pkgs.socat}/bin/socat exec:"${pkgs.qmi-nmea}/bin/qmi-nmea /dev/wwan0qmi0",pty unix-listen:/var/run/gnss-share.sock,fork,umask=0000,mode=0755 151 ''; 152 Restart = "always"; 153 RestartSec = "2"; 154 }; 155 }; 156 rmtfs = 157 # the four files in here are partition images: 158 # partlabel => filename 159 # modemst1 => modem_fs1 160 # modemst2 => modem_fs2 161 # fsc => modem_fsc 162 # fsg => modem_fsg 163 164 let files = pkgs.runCommand "rmtfs" {} '' 165 mkdir -p $out/lib/firmware 166 cp ${./local/uncompressed-firmware/rmtfs}/* $out/lib/firmware 167 ''; 168 in { 169 wantedBy = [ "multi-user.target" ]; 170 serviceConfig = { 171 # https://github.com/andersson/rmtfs/blob/7a5ae7e0a57be3e09e0256b51b9075ee6b860322/rmtfs.c#L507-L541 172 ExecStart = "${pkgs.rmtfs}/bin/rmtfs -s -r -o ${files}/lib/firmware"; 173 Restart = "always"; 174 RestartSec = "10"; 175 }; 176 }; 177 }; 178 179 }; 180 }