239 lines
7.5 KiB
Nix
239 lines
7.5 KiB
Nix
{ lib, config, pkgs, ... }:
|
|
|
|
let
|
|
saturn = pkgs.callPackage ./pkgs/saturn {};
|
|
|
|
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 = {
|
|
nixpkgs.overlays = [
|
|
(final: prev:
|
|
let mm = pkgs.callPackage ./pkgs/modem-manager {};
|
|
in {
|
|
wlr-randr = prev.wlr-randr.overrideAttrs(o: {
|
|
depsBuildBuild = [ final.pkgsBuildBuild.pkg-config ];
|
|
});
|
|
modemmanager-small = mm;
|
|
satellite = prev.satellite.override { modemmanager = mm; };
|
|
maps = final.callPackage ./pkgs/maps {};
|
|
})
|
|
];
|
|
|
|
mobile = {
|
|
adbd.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;
|
|
};
|
|
services.udev.extraRules = ''
|
|
ACTION!="add|change|move|bind", GOTO="mm_qcom_soc_end"
|
|
|
|
# Process only known wwan, net and rpmsg ports
|
|
SUBSYSTEM=="net", DRIVERS=="bam-dmux", GOTO="mm_qcom_soc_process"
|
|
# SUBSYSTEM=="platform", DRIVERS=="bam-dmux", GOTO="mm_qcom_soc_process"
|
|
SUBSYSTEM=="net", DRIVERS=="ipa", GOTO="mm_qcom_soc_process"
|
|
SUBSYSTEM=="wwan", DRIVERS=="qcom-q6v5-mss", GOTO="mm_qcom_soc_process"
|
|
SUBSYSTEM=="rpmsg", DRIVERS=="qcom-q6v5-mss", GOTO="mm_qcom_soc_process"
|
|
GOTO="mm_qcom_soc_end"
|
|
|
|
LABEL="mm_qcom_soc_process"
|
|
|
|
# Flag the port as being part of the SoC
|
|
ENV{ID_MM_QCOM_SOC}="1"
|
|
|
|
# #
|
|
# # Add a common physdev UID to all ports in the Qualcomm SoC, so that they
|
|
# # are all bound together to the same modem object.
|
|
# #
|
|
# # The MSM8916, MSM8974, .... Qualcomm SoCs use the combination of RPMSG/WWAN
|
|
# # based control ports plus BAM-DMUX based network ports.
|
|
# #
|
|
ENV{ID_MM_PHYSDEV_UID}="qcom-soc"
|
|
|
|
# port type hints for the rpmsgexport-ed ports
|
|
SUBSYSTEM=="rpmsg", ATTR{name}=="DATA*", ATTR{name}=="*_CNTL", ENV{ID_MM_PORT_TYPE_QMI}="1"
|
|
SUBSYSTEM=="rpmsg", ATTR{name}=="DATA*", ATTR{name}!="*_CNTL", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
|
|
|
|
# ignore every other port without explicit hints
|
|
SUBSYSTEM=="rpmsg", ENV{ID_MM_PORT_TYPE_QMI}!="1", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}!="1", ENV{ID_MM_PORT_IGNORE}="1"
|
|
|
|
# explicitly ignore ports intended for USB tethering (DATA40, DATA40_CNTL)
|
|
SUBSYSTEM=="rpmsg", ATTR{name}=="DATA40*", ENV{ID_MM_PORT_IGNORE}="1"
|
|
KERNEL=="rmnet_usb*", ENV{ID_MM_PORT_IGNORE}="1"
|
|
|
|
# flag all rpmsg ports under this plugin as candidate
|
|
# KERNEL=="rpmsg*", SUBSYSTEM=="rpmsg", ENV{ID_MM_CANDIDATE}="1"
|
|
KERNEL=="rpmsg*", SUBSYSTEM=="rpmsg", ENV{ID_MM_CANDIDATE}="1"
|
|
|
|
LABEL="mm_qcom_soc_end"
|
|
|
|
|
|
|
|
ACTION!="add|change|move|bind", GOTO="mm_candidate_end"
|
|
|
|
# # Opening bound but disconnected Bluetooth RFCOMM ttys would initiate the
|
|
# # connection. Don't do that.
|
|
|
|
KERNEL=="rfcomm*", DEVPATH=="*/virtual/*", GOTO="mm_candidate_end" # */
|
|
|
|
SUBSYSTEM=="net", ENV{ID_MM_CANDIDATE}="1"
|
|
|
|
# WWAN subsystem port handling
|
|
# - All USB devices ignored for now, only PCI devices expected
|
|
# - Only "wwan_port" device types processed (single ports); we fully ignore
|
|
# the "wwan_dev" device type (full device, not just one port)
|
|
|
|
SUBSYSTEMS=="usb", GOTO="mm_candidate_end"
|
|
SUBSYSTEM=="wwan", ENV{DEVTYPE}=="wwan_dev", GOTO="mm_candidate_end"
|
|
SUBSYSTEM=="wwan", ENV{ID_MM_CANDIDATE}="1"
|
|
|
|
LABEL="mm_candidate_end"
|
|
|
|
# unlock the gps engine
|
|
SUBSYSTEM=="wwan", ENV{DEVNAME}=="/dev/wwan0qmi0", ENV{DEVTYPE}=="wwan_port", \
|
|
RUN+="${pkgs.libqmi}/bin/qmicli -pd $env{DEVNAME} --loc-set-engine-lock=none"
|
|
|
|
'';
|
|
|
|
systemd.services.ModemManager = {
|
|
wantedBy = [ "multi-user.target" ];
|
|
serviceConfig =
|
|
let script = pkgs.writeScript "start-modem-manager" ''
|
|
#!${pkgs.bash}/bin/bash
|
|
source ${config.system.build.setEnvironment}
|
|
${pkgs.modemmanager-small}/bin/ModemManager
|
|
'';
|
|
in {
|
|
StandardInput = "journal";
|
|
StandardError = "journal";
|
|
StandardOutput = "journal";
|
|
SyslogIdentifier = "ModemManager";
|
|
ExecStart = script;
|
|
Restart = "always";
|
|
BindsTo = ["dbus.service"];
|
|
};
|
|
};
|
|
networking = {
|
|
useDHCP = true;
|
|
hostName = "biscuit";
|
|
networkmanager = { enable = false; };
|
|
useNetworkd = true;
|
|
inherit (secrets) wireless;
|
|
};
|
|
|
|
services.openssh.enable = true;
|
|
|
|
services.cage =
|
|
let wlinit = pkgs.writeScript "wlinit" ''
|
|
${pkgs.wlr-randr}/bin/wlr-randr --output DSI-1 --scale 2
|
|
exec ${saturn}/bin/saturn
|
|
'';
|
|
in {
|
|
enable = true;
|
|
program = wlinit;
|
|
user = "dan";
|
|
};
|
|
|
|
environment.systemPackages = with pkgs; [
|
|
drm-framebuffer
|
|
saturn
|
|
satellite
|
|
wlr-randr
|
|
modemmanager-small
|
|
maps
|
|
];
|
|
|
|
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";
|
|
};
|
|
};
|
|
};
|
|
|
|
};
|
|
}
|