Skip to content

Instantly share code, notes, and snippets.

@andir
Created December 23, 2025 13:20
Show Gist options
  • Select an option

  • Save andir/db3ea533ed6331c30aee834e874cb66d to your computer and use it in GitHub Desktop.

Select an option

Save andir/db3ea533ed6331c30aee834e874cb66d to your computer and use it in GitHub Desktop.
{ pkgs, system, inputs, lib, ... }:
let
targetPkgs = import inputs.unstable { inherit system; crossSystem = "aarch64-linux"; config.allowUnfree = true; };
in
lib.makeScope targetPkgs.newScope (self: with self; {
armTrustedFirmware = (targetPkgs.buildArmTrustedFirmware rec {
extraMakeFlags = [ "bl31" ];
platform = "rk3568";
extraMeta.platforms = [ "aarch64-linux" ];
filesToInstall = [ "build/${platform}/release/bl31/bl31.elf" ];
platformCanUseHDCPBlob = true;
}).overrideAttrs ({ patches ? [ ], ... }: {
#patches = patches ++ [
# (
# let
# raw = targetPkgs.fetchurl {
# url = "https://review.trustedfirmware.org/changes/TF-A%2Ftrusted-firmware-a~16952/revisions/16/patch?download";
# sha256 = "sha256-fxH63QxOdBwsNX+p4olIfNtH9ecLnl2IMPOWpdW7lRg=";
# };
# in
# targetPkgs.runCommand "rk3568.patch" { inherit raw; } ''
# base64 -d < $raw > $out
# ''
# )
#];
});
uboot = callPackage ./r5s-uboot.nix { };
nixos = targetPkgs.nixos {
imports = [
(targetPkgs.path + "/nixos/modules/installer/sd-card/sd-image-aarch64-new-kernel-no-zfs-installer.nix")
({ pkgs, config, ... }: {
sdImage = {
populateFirmwareCommands = lib.mkForce "";
postBuildCommands = ''
dd if=${uboot}/idbloader.img bs=4K of=$img seek=8 conv=notrunc
dd if=${uboot}/u-boot.itb bs=4K of=$img seek=2048 conv=notrunc
'';
populateRootCommands =
let
dtb = pkgs.runCommand "rk3567-nanopi-r5s.dtb"
rec {
nativeBuildInputs = [ pkgs.dtc pkgs.stdenv.cc ];
kernelSrc = toString
(pkgs.runCommand "kernel-src-${config.boot.kernelPackages.kernel.version}"
{
src = config.boot.kernelPackages.kernel.src;
} ''
mkdir -p $out
tar -xvf $src -C $out
'') + "/linux-${config.boot.kernelPackages.kernel.version}";
} ''
echo $PATH
${pkgs.stdenv.cc.targetPrefix}gcc -I "$kernelSrc/include" -E -nostdinc -undef -D__DTS__ -x assembler-with-cpp -o "rk3568-nanopi-r5s-top.dts" "$kernelSrc/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dts"
dtc -I dts -O dtb -b0 -Wno-interrupt_provider -Wno-unique_unit_address -Wno-unit_address_vs_reg -Wno-avoid_unnecessary_addr_size -Wno-alias_paths -Wno-graph_child_address -Wno-simple_bus_reg -o $out rk3568-nanopi-r5s-top.dts
'';
in
''
mkdir -p files/boot
cp ${dtb} files/boot/rk3568-nanopi-r5s.dtb
'';
};
})
({ pkgs, ... }: {
boot.loader = {
grub.enable = lib.mkDefault false;
generic-extlinux-compatible = {
enable = lib.mkDefault true;
useGenerationDeviceTree = true;
};
};
environment.systemPackages = [
(pkgs.writeScriptBin "install-uboot" ''
set -ex
${pkgs.coreutils}/bin/dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=1024
${pkgs.coreutils}/bin/dd bs=4K seek=8 if=${uboot}/idbloader.img of=/dev/mmcblk0 conv=notrunc
${pkgs.coreutils}/bin/dd bs=4K seek=2048 if=${uboot}/u-boot.itb of=/dev/mmcblk0 conv=notrunc
'')
];
hardware.deviceTree.name = lib.mkDefault "../../rk3568-nanopi-r5s.dtb";
#boot.kernelPackages = lib.mkForce pkgs.linuxPackages_6_5;
boot.kernelParams = lib.mkBefore [
# "console=tty1"
"console=ttyS2,1500000"
"earlycon=uart8250,mmio32,0xfe660000"
];
boot.kernelPatches = [
{
name = "rockchip-config.patch";
patch = null;
extraConfig = ''
PCIE_ROCKCHIP_EP y
PCIE_ROCKCHIP_DW_HOST y
ROCKCHIP_VOP2 y
LED_TRIGGER_PHY y
USB_LED_TRIG y
LEDS_BRIGHTNESS_HW_CHANGED y
LEDS_TRIGGER_MTD y
'';
}
];
boot.initrd.availableKernelModules = [
## Rockchip
## Storage
"sdhci_of_dwcmshc"
"dw_mmc_rockchip"
"analogix_dp"
"io-domain"
"rockchip_saradc"
"rockchip_thermal"
"rockchipdrm"
"rockchip-rga"
"pcie_rockchip_host"
"phy-rockchip-pcie"
"phy_rockchip_snps_pcie3"
"phy_rockchip_naneng_combphy"
"phy_rockchip_inno_usb2"
"dwmac_rk"
"dw_wdt"
"dw_hdmi"
"dw_hdmi_cec"
"dw_hdmi_i2s_audio"
"dw_mipi_dsi"
];
# Most Rockchip CPUs (especially with hybrid cores) work best with "schedutil"
powerManagement.cpuFreqGovernor = "schedutil";
# Let's blacklist the Rockchips RTC module so that the
# battery-powered HYM8563 (rtc_hym8563 kernel module) will be used
# by default
boot.blacklistedKernelModules = [ "rtc_rk808" ];
})
];
};
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment