diff --git a/devices/gl-ar750/default.nix b/devices/gl-ar750/default.nix index c15f642..f77b448 100644 --- 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 index b53d525..f971cec 100644 --- 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 index a142b88..b9964e9 100644 --- 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 new file mode 100644 index 0000000..8def6fc --- /dev/null +++ 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 index 18e80e2..c72c9b5 100644 --- 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 index 7bd6b2f..d8e1ca2 100644 --- 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 index 17ddd47..1d74bbd 100644 --- a/rotuer.nix +++ b/rotuer.nix @@ -44,6 +44,7 @@ in rec { imports = [ ./modules/wlan.nix ./modules/tftpboot.nix + ./modules/flashable.nix ]; kernel = {