{ lib, config, pkgs, ... }: let rpmsgexport = pkgs.stdenv.mkDerivation { name = "rpmsgexport"; src = pkgs.fetchFromGitHub { repo = "rpmsgexport"; owner = "andersson"; rev = "324d88d668f36c6a5e6a9c2003a050b8a5a3cd60"; hash = "sha256-k38gj+vtEE6/s+vALzW1jiuE3HdQqaGiICdAWndu6aU="; }; makeFlags = ["prefix=${placeholder "out"}"]; }; drm-framebuffer = pkgs.stdenv.mkDerivation { name = "drm-framebuffer"; src = pkgs.fetchFromGitHub { owner = "embear-engineering"; repo = "drm-framebuffer"; rev = "80e862bd13bc0f96848af1c1b24b4b0e1fe5b23c"; hash = "sha256-YBRG8FUbhwAgquzehvo5Mu+xODcWOOG1HTMtUhNq6xo="; }; nativeBuildInputs = [ pkgs.pkg-config ]; buildInputs = with pkgs; [ libdrm ]; preBuild = '' makeFlagsArray+=("CFLAGS=$($PKG_CONFIG --libs --cflags libdrm)") ''; makeFlags = [ "DESTDIR=${placeholder "out"}" "bindir=/bin" ]; }; modemFirmware = config.mobile.device.firmware.override { modem = ./local/harpia-modem; }; secrets = import ./local/secrets.nix; in { imports = [ (import ../mobile-nixos/lib/configuration.nix { device = "motorola-harpia"; }) ]; config = { mobile = { adbd.enable = true; # boot.stage-1.gui.enable = false; # beautification.splash = false; # quirks.fb-refresher.enable = lib.mkForce false; # quirks.qualcomm.msm8953-modem.enable = true; boot.stage-1.firmware = [ modemFirmware pkgs.wireless-regdb ]; }; hardware.firmware = [ modemFirmware pkgs.wireless-regdb ]; system.stateVersion = "23.11"; boot.kernelParams = [ "dyndbg=\"file drivers/base/firmware_loader/main.c +fmp\"" # "dyndbg=\"file drivers/gpu/drm/panel/msm8953-generated/panel-boe-bs052fhm-a00-6c01.c +fmp\"" # "dyndbg=\"file drivers/video/backlight/qcom-wled.c +fmp\"" ]; # according to fdisk, /dev/mmcblk0p41 is 30469887-7471104=22998783 # blocks, and if we let it get resized by whatever magic this is # (I'm assuming systemd-growfs), on the subsequent boot we'll get # an error # EXT4-fs (mmcblk0p41): bad geometry: block count 2883067 exceeds size of device (2874848 blocks) # in which neither number matches the reported size (they're both # about 10% of it). cool. boot.growPartition = lib.mkForce false; fileSystems."/" = lib.mkDefault { autoResize = lib.mkForce false; }; networking = { useDHCP = true; hostName = "biscuit"; networkmanager = { enable = false; }; useNetworkd = true; inherit (secrets) wireless; }; services.openssh.enable = true; # environment.systemPackages = [ qrtr tqftpserv ]; services.udev.extraRules = '' SUBSYSTEM!="rpmsg", GOTO="qcom_rpmsg_end" # symlink rpmsg endpoints under useful names ATTR{name}=="DATA5_CNTL", SYMLINK+="modem" # open SMD channels when the remoteproc comes up KERNEL!="rpmsg_ctrl[0-9]*", GOTO="qcom_rpmsg_end" ATTRS{rpmsg_name}!="modem|hexagon", GOTO="qcom_rpmsg_end" ACTION=="add", RUN+="${rpmsgexport}/bin/rpmsgexport /dev/$name DATA5_CNTL" LABEL="qcom_rpmsg_end" ''; environment.systemPackages = with pkgs; [ drm-framebuffer]; users.users.dan = { isNormalUser = true; uid = 1000; extraGroups = [ "wheel" "libvirtd" "docker" "dialout" ]; openssh.authorizedKeys.keys = import ../telent-nixos-config/users/dan/authorized-keys.nix; }; users.users.root.openssh.authorizedKeys.keys = import ../telent-nixos-config/users/dan/authorized-keys.nix; fileSystems."/boot" = { device = "/dev/disk/by-partlabel/system"; fsType = "ext4"; }; hardware.opengl = { enable = true; driSupport = true; }; systemd.services = { rmtfs = # the four files in here are partition images: # partlabel => filename # modemst1 => modem_fs1 # modemst2 => modem_fs2 # fsc => modem_fsc # fsg => modem_fsg let files = pkgs.runCommand "rmtfs" {} '' mkdir -p $out/lib/firmware cp ${./local/uncompressed-firmware/rmtfs}/* $out/lib/firmware ''; in { wantedBy = [ "multi-user.target" ]; serviceConfig = { # https://github.com/andersson/rmtfs/blob/7a5ae7e0a57be3e09e0256b51b9075ee6b860322/rmtfs.c#L507-L541 ExecStart = "${pkgs.rmtfs}/bin/rmtfs -s -r -o ${files}/lib/firmware"; Restart = "always"; RestartSec = "10"; }; }; }; }; }