artiq-zynq/default.nix

160 lines
6.1 KiB
Nix
Raw Normal View History

2020-04-30 21:04:28 +08:00
let
2020-09-09 16:58:37 +08:00
zynq-rs = (import ./zynq-rs.nix);
pkgs = import <nixpkgs> { overlays = [ (import "${zynq-rs}/nix/mozilla-overlay.nix") ]; };
rustPlatform = (import "${zynq-rs}/nix/rust-platform.nix" { inherit pkgs; });
cargo-xbuild = (import zynq-rs).cargo-xbuild;
2020-09-09 16:58:37 +08:00
mkbootimage = import "${zynq-rs}/nix/mkbootimage.nix" { inherit pkgs; };
artiqpkgs = import <artiq-fast/default.nix> { inherit pkgs; };
vivado = import <artiq-fast/vivado.nix> { inherit pkgs; };
2020-11-14 03:17:18 +08:00
# FSBL configuration supplied by Vivado 2020.1 for these boards:
fsblTargets = ["zc702" "zc706" "zed"];
sat_variants = ["satellite" "acpki_satellite" "nist_clock_satellite" "nist_qc2_satellite"];
2021-02-15 19:52:13 +08:00
build = { target, variant, json ? null }: let
2020-11-14 03:17:18 +08:00
szl = (import zynq-rs)."${target}-szl";
fsbl = import "${zynq-rs}/nix/fsbl.nix" {
inherit pkgs;
board = target;
};
fwtype = if builtins.elem variant sat_variants then "satman" else "runtime";
2020-11-14 03:17:18 +08:00
2020-05-14 15:30:50 +08:00
firmware = rustPlatform.buildRustPackage rec {
2020-10-13 23:42:30 +08:00
# note: due to fetchCargoTarball, cargoSha256 depends on package name
2020-11-14 03:17:18 +08:00
name = "firmware";
2020-04-30 21:04:28 +08:00
src = ./src;
cargoSha256 = "sha256-H67cMdQZDnKpr91lEbmGuw4269ekvlEe6XjltLPR9rk=";
2020-04-30 21:04:28 +08:00
nativeBuildInputs = [
pkgs.gnumake
2021-02-15 19:52:13 +08:00
(pkgs.python3.withPackages(ps: (with artiqpkgs; [ ps.jsonschema migen migen-axi misoc artiq ])))
cargo-xbuild
2020-07-02 21:50:19 +08:00
pkgs.llvmPackages_9.llvm
pkgs.llvmPackages_9.clang-unwrapped
];
2020-04-30 21:04:28 +08:00
buildPhase = ''
2021-01-15 08:02:15 +08:00
export XARGO_RUST_SRC="${rustPlatform.rust.rustc}/lib/rustlib/src/rust/library"
export CLANG_EXTRA_INCLUDE_DIR="${pkgs.llvmPackages_9.clang-unwrapped.lib}/lib/clang/9.0.1/include"
2020-04-30 21:04:28 +08:00
export CARGO_HOME=$(mktemp -d cargo-home.XXX)
make TARGET=${target} GWARGS="${if json == null then "-V ${variant}" else json}" ${fwtype}
2020-04-30 21:04:28 +08:00
'';
# there's probably a better way to go around it
2020-04-30 21:04:28 +08:00
installPhase = ''
mkdir -p $out $out/nix-support
cp ../build/${fwtype}.bin $out/${fwtype}.bin
cp ../build/firmware/armv7-none-eabihf/release/${fwtype} $out/${fwtype}.elf
echo file binary-dist $out/${fwtype}.bin >> $out/nix-support/hydra-build-products
echo file binary-dist $out/${fwtype}.elf >> $out/nix-support/hydra-build-products
2020-04-30 21:04:28 +08:00
'';
doCheck = false;
2020-04-30 21:04:28 +08:00
dontFixup = true;
};
2020-11-14 03:17:18 +08:00
gateware = pkgs.runCommand "${target}-${variant}-gateware"
{
nativeBuildInputs = [
2021-02-15 19:52:13 +08:00
(pkgs.python3.withPackages(ps: (with artiqpkgs; [ ps.jsonschema migen migen-axi misoc artiq ])))
vivado
];
}
2020-04-30 21:04:28 +08:00
''
2021-02-15 19:52:13 +08:00
python ${./src/gateware}/${target}.py -g build ${if json == null then "-V ${variant}" else json}
2020-04-30 21:04:28 +08:00
mkdir -p $out $out/nix-support
cp build/top.bit $out
echo file binary-dist $out/top.bit >> $out/nix-support/hydra-build-products
'';
# SZL startup
2020-11-14 03:17:18 +08:00
jtag = pkgs.runCommand "${target}-${variant}-jtag" {}
2020-04-30 21:04:28 +08:00
''
mkdir $out
2020-11-14 03:17:18 +08:00
ln -s ${szl}/szl.elf $out
ln -s ${firmware}/${fwtype}.bin $out
2020-05-14 15:30:50 +08:00
ln -s ${gateware}/top.bit $out
2020-04-30 21:04:28 +08:00
'';
2020-11-14 03:17:18 +08:00
sd = pkgs.runCommand "${target}-${variant}-sd"
2020-05-01 11:23:00 +08:00
{
buildInputs = [ mkbootimage ];
}
''
# Do not use "long" paths in boot.bif, because embedded developers
# can't write software (mkbootimage will segfault).
bifdir=`mktemp -d`
cd $bifdir
2020-11-14 03:17:18 +08:00
ln -s ${szl}/szl.elf szl.elf
2020-09-01 09:41:02 +08:00
ln -s ${firmware}/runtime.elf runtime.elf
ln -s ${gateware}/top.bit top.bit
cat > boot.bif << EOF
2020-05-01 11:23:00 +08:00
the_ROM_image:
{
[bootloader]szl.elf
top.bit
2020-09-01 09:41:02 +08:00
runtime.elf
2020-05-01 11:23:00 +08:00
}
EOF
mkdir $out $out/nix-support
mkbootimage boot.bif $out/boot.bin
echo file binary-dist $out/boot.bin >> $out/nix-support/hydra-build-products
2020-05-01 11:23:00 +08:00
'';
# FSBL startup
2020-11-14 03:17:18 +08:00
fsbl-sd = pkgs.runCommand "${target}-${variant}-fsbl-sd"
{
buildInputs = [ mkbootimage ];
}
''
bifdir=`mktemp -d`
cd $bifdir
2020-11-14 03:17:18 +08:00
ln -s ${fsbl}/fsbl.elf fsbl.elf
ln -s ${gateware}/top.bit top.bit
ln -s ${firmware}/runtime.elf runtime.elf
cat > boot.bif << EOF
the_ROM_image:
{
[bootloader]fsbl.elf
top.bit
runtime.elf
}
EOF
mkdir $out $out/nix-support
mkbootimage boot.bif $out/boot.bin
echo file binary-dist $out/boot.bin >> $out/nix-support/hydra-build-products
'';
2020-05-14 15:30:50 +08:00
in {
2020-11-14 03:17:18 +08:00
"${target}-${variant}-firmware" = firmware;
"${target}-${variant}-gateware" = gateware;
"${target}-${variant}-jtag" = jtag;
"${target}-${variant}-sd" = sd;
} // (
if builtins.elem target fsblTargets
then {
"${target}-${variant}-fsbl-sd" = fsbl-sd;
}
else {}
);
2020-05-14 15:30:50 +08:00
in
(
2020-11-14 03:17:18 +08:00
(build { target = "zc706"; variant = "simple"; }) //
(build { target = "zc706"; variant = "master"; }) //
(build { target = "zc706"; variant = "satellite"; }) //
(build { target = "zc706"; variant = "nist_clock"; }) //
(build { target = "zc706"; variant = "nist_clock_master"; }) //
(build { target = "zc706"; variant = "nist_clock_satellite"; }) //
(build { target = "zc706"; variant = "nist_qc2"; }) //
(build { target = "zc706"; variant = "nist_qc2_master"; }) //
(build { target = "zc706"; variant = "nist_qc2_satellite"; }) //
2020-11-14 03:17:18 +08:00
(build { target = "zc706"; variant = "acpki_simple"; }) //
(build { target = "zc706"; variant = "acpki_master"; }) //
(build { target = "zc706"; variant = "acpki_satellite"; }) //
(build { target = "zc706"; variant = "acpki_nist_clock"; }) //
(build { target = "zc706"; variant = "acpki_nist_clock_master"; }) //
(build { target = "zc706"; variant = "acpki_nist_clock_satellite"; }) //
(build { target = "zc706"; variant = "acpki_nist_qc2"; }) //
(build { target = "zc706"; variant = "acpki_nist_qc2_master"; }) //
(build { target = "zc706"; variant = "acpki_nist_qc2_satellite"; }) //
2021-02-15 19:52:13 +08:00
(build { target = "kasli_soc"; variant = "demo"; json = ./demo.json; }) //
2021-08-03 17:54:44 +08:00
(build { target = "kasli_soc"; variant = "master"; json = ./kasli-soc-master.json; }) //
(build { target = "kasli_soc"; variant = "satellite"; json = ./kasli-soc-satellite.json; }) //
2020-09-09 19:22:08 +08:00
{ inherit zynq-rs; }
2020-05-14 15:30:50 +08:00
)