commit 6d191b73ae20d449c8daae8188b9474b84498011
parent 0cab6e9fba956b89cbf6b1b961b264b6b0a31101
Author: Daniel Barlow <dan@telent.net>
Date: Thu, 2 Mar 2023 23:01:26 +0000
add outputs.flashable - flashable firmware.bin
Diffstat:
7 files changed, 85 insertions(+), 0 deletions(-)
diff --git a/devices/gl-ar750/default.nix b/devices/gl-ar750/default.nix
@@ -91,6 +91,12 @@
defaultOutput = "tftproot";
loadAddress = "0x80060000";
entryPoint = "0x80060000";
+ flash = {
+ address = "0x9F060000";
+ size ="0xfa0000";
+ };
+ rootDevice = "1f05";
+
networkInterfaces = {
lan = interface { device = "eth0"; };
wan = interface { device = "eth1"; };
diff --git a/kernel/dtb.nix b/kernel/dtb.nix
@@ -1,18 +1,22 @@
{
stdenv
, dtc
+, lib
}:
{ dts
, includes
+, commandLine
}:let
cppDtSearchFlags = builtins.concatStringsSep " " (map (f: "-I${f}") includes);
dtcSearchFlags = builtins.concatStringsSep " " (map (f: "-i${f}") includes);
+ cmdline = lib.concatStringsSep " " commandLine;
in stdenv.mkDerivation {
name = "dtb";
phases = [ "buildPhase" ];
nativeBuildInputs = [ dtc ];
buildPhase = ''
${stdenv.cc.targetPrefix}cpp -nostdinc -x assembler-with-cpp ${cppDtSearchFlags} -undef -D__DTS__ -o dtb.tmp ${dts}
+ echo '/{ chosen { bootargs = ${builtins.toJSON cmdline}; }; };' >> dtb.tmp
dtc ${dtcSearchFlags} -I dts -O dtb -o $out dtb.tmp
test -e $out
'';
diff --git a/modules/base.nix b/modules/base.nix
@@ -75,6 +75,7 @@ in {
default = [];
example = ["ath9k" "ath10k"];
};
+ rootDevice = mkOption { };
networkInterfaces = mkOption {
type = types.attrsOf types.anything;
};
diff --git a/modules/flashable.nix b/modules/flashable.nix
@@ -0,0 +1,71 @@
+{
+ config
+, pkgs
+, lib
+, ...
+}:
+let
+ inherit (lib) mkOption types concatStringsSep;
+ inherit (config.boot) tftp;
+in {
+ options = {
+ device.flash = {
+ address = mkOption { type = types.str; };
+ size = mkOption { type = types.str; };
+ };
+ };
+ config = {
+ kernel = {
+ config = {
+ MTD_SPLIT_UIMAGE_FW = "y";
+ # ignore the commandline provided by U-Boot because it's most
+ # likely wrong
+ MIPS_CMDLINE_FROM_BOOTLOADER = lib.mkForce "n";
+ MIPS_CMDLINE_FROM_DTB = "y";
+ };
+ };
+
+ boot.commandLine = [
+ "root=${config.device.rootDevice}"
+ ];
+ outputs.firmware =
+ let o = config.outputs; in
+ pkgs.runCommand "firmware" {} ''
+ dd if=${o.uimage} of=$out bs=128k conv=sync
+ dd if=${o.squashfs} of=$out bs=128k conv=sync,nocreat,notrunc oflag=append
+ '';
+ outputs.flashable =
+ let o = config.outputs; in
+ pkgs.runCommand "flashable" {} ''
+ mkdir $out
+ cd $out
+ ln -s ${o.firmware} firmware.bin
+ ln -s ${o.squashfs} squashfs
+ ln -s ${o.kernel} vmlinux
+ ln -s ${o.manifest} manifest
+ ln -s ${o.kernel.headers} build
+ ln -s ${o.uimage} uimage
+ ln -s ${o.dtb} dtb
+ ln -s ${o.flash-scr} flash.scr
+ '';
+
+ outputs.flash-scr =
+ let
+ inherit (pkgs.lib.trivial) toHexString;
+ inherit (pkgs.lib.lists) concatStringsSep;
+ inherit (config.device) flash;
+ in
+ pkgs.buildPackages.runCommand "" {} ''
+ imageSize=$(stat -L -c %s ${config.outputs.firmware})
+ cat > $out << EOF
+ setenv serverip ${tftp.serverip}
+ setenv ipaddr ${tftp.ipaddr}
+ tftp 0x$(printf %x ${tftp.loadAddress}) result/firmware.bin
+ erase 0x$(printf %x ${flash.address}) +0x$(printf %x ${flash.size})
+ cp.b 0x$(printf %x ${tftp.loadAddress}) 0x$(printf %x ${flash.address}) \''${filesize}
+ echo command line was ${builtins.toJSON (concatStringsSep " " config.boot.commandLine)}
+ EOF
+ '';
+
+ };
+}
diff --git a/modules/outputs.nix b/modules/outputs.nix
@@ -23,6 +23,7 @@ in
inherit (config.kernel) config src extraPatchPhase;
};
dtb = (callPackage ../kernel/dtb.nix {}) {
+ inherit (config.boot) commandLine;
dts = config.boot.dts.src;
includes = config.boot.dts.includes ++ [
"${kernel.headers}/include"
diff --git a/modules/tftpboot.nix b/modules/tftpboot.nix
@@ -26,6 +26,7 @@ in {
MTD = "y";
MTD_PHRAM = "y";
MTD_CMDLINE_PARTS = "y";
+ MIPS_CMDLINE_FROM_BOOTLOADER = "y";
# one or more of the following is required to get from
# VFS: Cannot open root device "1f00" or unknown-block(31,0): error -6
diff --git a/rotuer.nix b/rotuer.nix
@@ -44,6 +44,7 @@ in rec {
imports = [
./modules/wlan.nix
./modules/tftpboot.nix
+ ./modules/flashable.nix
];
kernel = {