nixos-riscv/flake.nix
2023-02-16 13:26:46 +01:00

190 lines
7.1 KiB
Nix

{
inputs = {
nixpkgs.url = "github:matthewcroughan/nixpkgs/mc/riscv-testing";
# VisionFive ("v1")
vendor-kernel = {
url = "github:starfive-tech/linux";
flake = false;
};
jh7100_ddrinit = {
url = "https://github.com/starfive-tech/JH7100_ddrinit/releases/download/ddrinit-2133-211102/ddrinit-2133-211102.bin.out";
flake = false;
};
jh7100_secondBoot = {
url = "https://github.com/starfive-tech/JH7100_secondBoot/releases/download/bootloader-211102_VisionFive_JH7100/bootloader-JH7100-211102.bin.out";
flake = false;
};
jh7100_recovery_binary = {
url = "https://github.com/starfive-tech/bootloader_recovery/releases/download/JH7100_recovery_binary/jh7100_recovery_boot.bin";
flake = false;
};
jh71xx-tools = {
url = "github:xypron/jh71xx-tools";
flake = false;
};
# VisionFive 2
jh7110-kernel = {
# url = "github:starfive-tech/linux/50a831018ed997c9fb3b603574176b221a28aa12"; # JH7110_VisionFive2_devel via VisionFive2 project submodule about two revisions back.
url = "github:starfive-tech/linux/JH7110_VisionFive2_devel";
flake = false;
};
jh7110_recovery_binary = {
url = "https://github.com/starfive-tech/Tools/blob/bc6dc7e33e0c2466db0476b5043f0f77842f98f0/recovery/jh7110-recovery-20221205.bin?raw=true";
flake = false;
};
# Should be possible to build from https://github.com/starfive-tech/VisionFive2
jh7110_u-boot-spl-bin = {
url = https://github.com/starfive-tech/VisionFive2/releases/download/VF2_v2.8.0/u-boot-spl.bin.normal.out;
flake = false;
};
jh7110_u-boot-bin = {
url = https://github.com/starfive-tech/VisionFive2/releases/download/VF2_v2.8.0/visionfive2_fw_payload.img;
flake = false;
};
};
outputs = inputs@{ self, nixpkgs, jh71xx-tools, jh7100_recovery_binary, jh7100_secondBoot, jh7100_ddrinit, vendor-kernel, ... }:
let
inherit (nixpkgs) lib;
system = "x86_64-linux";
pkgs = import nixpkgs { inherit system; overlays = [ self.overlay ]; };
modules = [
{ nixpkgs.overlays = [ self.overlay ]; }
"${nixpkgs}/nixos/modules/installer/sd-card/sd-image-riscv64-visionfive-installer.nix"
./base.nix
./configuration.nix
];
# Pass arguments to a module inside a function inside a file, while preserving
# the file name behavior of the module system.
importApply =
modulePath: staticArgs:
lib.setDefaultModuleLocation modulePath (import modulePath staticArgs);
in
{
overlay = final: prev: {
linuxPackages_visionfive = final.linuxPackagesFor ((final.callPackage ./kernel.nix { inherit vendor-kernel; }).override { patches = []; });
};
legacyPackages.${system} =
{
inherit (pkgs.pkgsCross.riscv64.linux) linuxPackages_visionfive;
};
apps.${system} = {
flashBootloader =
let
expectScript = pkgs.writeScript "expect-visionfive.sh" ''
#!${pkgs.expect}/bin/expect -f
set timeout -1
spawn ${pkgs.picocom}/bin/picocom [lindex $argv 0] -b 115200 -s "${pkgs.lrzsz}/bin/sz -X"
expect "Terminal ready"
send_user "\n### Apply power to the VisionFive Board ###\n"
expect "bootloader"
expect "DDR"
send "\r"
expect "0:update uboot"
expect "select the function:"
send "0\r"
expect "send file by xmodem"
expect "CC"
send "\x01\x13"
expect "*** file:"
send "${pkgs.pkgsCross.riscv64.firmware-visionfive}/opensbi_u-boot_visionfive.bin"
send "\r"
expect "Transfer complete"
'';
program = pkgs.writeShellScript "flash-visionfive.sh" ''
if $(groups | grep --quiet --word-regexp "dialout"); then
echo "User is in dialout group, flashing to board without sudo"
${expectScript} $1
else
echo "User is not in dialout group, flashing to board with sudo"
sudo ${expectScript} $1
fi
'';
in
{
type = "app";
program = "${program}";
};
flashOriginal =
let
flashScript = pkgs.writeScript "jh7100-recover-visionfive.sh" ''
set -x
${pkgs.lib.getExe self.packages.${system}.jh7100-recover} \
-D $1 \
-r ${jh7100_recovery_binary} \
-b ${jh7100_secondBoot} \
-d ${jh7100_ddrinit}
'';
program = pkgs.writeShellScript "flash-visionfive.sh" ''
if $(groups | grep --quiet --word-regexp "dialout"); then
echo "User is in dialout group, flashing to board without sudo"
${flashScript} $1
else
echo "User is not in dialout group, flashing to board with sudo"
sudo ${flashScript} $1
fi
'';
in
{
type = "app";
program = "${program}";
};
} // import ./visionfive2/commands.nix { inherit inputs pkgs; };
packages.${system} = {
jh7100-recover = pkgs.writeCBin "jh7100-recover" (builtins.readFile "${jh71xx-tools}/jh7100-recover.c");
};
images = {
visionfive-cross = self.nixosConfigurations.visionfive-cross.config.system.build.sdImage;
visionfive-native = self.nixosConfigurations.visionfive-native.config.system.build.sdImage;
visionfive2-cross = self.nixosConfigurations.visionfive2-cross.config.system.build.sdImage;
visionfive2-native = self.nixosConfigurations.visionfive2-native.config.system.build.sdImage;
};
nixosModules = {
visionfive2-sd-image = importApply ./visionfive2/sd-image.nix { inherit inputs importApply; };
visionfive2-kernel = importApply ./visionfive2/kernel/nixos-module.nix { inherit inputs importApply; };
};
nixosConfigurations =
let
visionfive2-example-modules = [
./base.nix
./configuration.nix
self.nixosModules.visionfive2-sd-image
];
in
{
visionfive-cross = nixpkgs.lib.nixosSystem {
system = "${system}";
modules = modules ++ [
{
nixpkgs.crossSystem = {
system = "riscv64-linux";
};
}
];
};
visionfive-native = nixpkgs.lib.nixosSystem {
system = "riscv64-linux";
modules = modules;
};
visionfive2-cross = nixpkgs.lib.nixosSystem {
system = "${system}";
modules = visionfive2-example-modules ++ [
{
nixpkgs.crossSystem = {
system = "riscv64-linux";
};
}
];
};
visionfive2-native = nixpkgs.lib.nixosSystem {
system = "riscv64-linux";
modules = visionfive2-example-modules;
};
};
};
}