forked from DGNum/liminix
2e50368bd2
New rules: everything under "config" that isn't actually configuration (e.g. build products) will in future live in config.system. This is the first step.
88 lines
2.4 KiB
Nix
88 lines
2.4 KiB
Nix
{
|
|
config
|
|
, pkgs
|
|
, lib
|
|
, ...
|
|
}:
|
|
let
|
|
inherit (lib) mkOption types concatStringsSep;
|
|
inherit (config.boot) tftp;
|
|
in {
|
|
options.system.outputs = {
|
|
firmware = mkOption {
|
|
type = types.package;
|
|
internal = true; # component of flashimage
|
|
description = ''
|
|
Binary image (combining kernel, FDT, rootfs, initramfs
|
|
if needed, etc) for the target device.
|
|
'';
|
|
};
|
|
flash-scr = mkOption {
|
|
type = types.package;
|
|
internal = true; # component of flashimage
|
|
description = ''
|
|
Copy-pastable U-Boot commands to TFTP download the
|
|
image and write it to flash
|
|
'';
|
|
};
|
|
flashimage = mkOption {
|
|
type = types.package;
|
|
description = ''
|
|
Flashable image for the target device, and the script to
|
|
install it
|
|
'';
|
|
};
|
|
};
|
|
|
|
config = {
|
|
kernel = {
|
|
config = {
|
|
MTD_SPLIT_UIMAGE_FW = "y";
|
|
};
|
|
};
|
|
|
|
programs.busybox.applets = [
|
|
"flashcp"
|
|
];
|
|
|
|
system.outputs = {
|
|
firmware =
|
|
let o = config.system.outputs; in
|
|
pkgs.runCommand "firmware" {} ''
|
|
dd if=${o.uimage} of=$out bs=128k conv=sync
|
|
dd if=${o.rootfs} of=$out bs=128k conv=sync,nocreat,notrunc oflag=append
|
|
'';
|
|
flashimage =
|
|
let o = config.system.outputs; in
|
|
pkgs.runCommand "flashimage" {} ''
|
|
mkdir $out
|
|
cd $out
|
|
ln -s ${o.firmware} firmware.bin
|
|
ln -s ${o.rootfs} rootfs
|
|
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
|
|
'';
|
|
|
|
flash-scr =
|
|
let
|
|
inherit (pkgs.lib.trivial) toHexString;
|
|
inherit (config.hardware) flash;
|
|
in
|
|
pkgs.buildPackages.runCommand "" {} ''
|
|
imageSize=$(stat -L -c %s ${config.system.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}) +${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
|
|
'';
|
|
};
|
|
};
|
|
}
|