add outputs.flashable - flashable firmware.bin
This commit is contained in:
parent
0cab6e9fba
commit
6d191b73ae
7 changed files with 85 additions and 0 deletions
|
@ -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"; };
|
||||
|
|
|
@ -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
|
||||
'';
|
||||
|
|
|
@ -75,6 +75,7 @@ in {
|
|||
default = [];
|
||||
example = ["ath9k" "ath10k"];
|
||||
};
|
||||
rootDevice = mkOption { };
|
||||
networkInterfaces = mkOption {
|
||||
type = types.attrsOf types.anything;
|
||||
};
|
||||
|
|
71
modules/flashable.nix
Normal file
71
modules/flashable.nix
Normal file
|
@ -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
|
||||
'';
|
||||
|
||||
};
|
||||
}
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -44,6 +44,7 @@ in rec {
|
|||
imports = [
|
||||
./modules/wlan.nix
|
||||
./modules/tftpboot.nix
|
||||
./modules/flashable.nix
|
||||
];
|
||||
|
||||
kernel = {
|
||||
|
|
Loading…
Reference in a new issue