|
| 1 | +{ |
| 2 | + config, |
| 3 | + lib, |
| 4 | + modulesPath, |
| 5 | + pkgs, |
| 6 | + ... |
| 7 | +}: |
| 8 | + |
| 9 | +{ |
| 10 | + imports = [ |
| 11 | + "${modulesPath}/profiles/base.nix" |
| 12 | + "${modulesPath}/installer/sd-card/sd-image.nix" |
| 13 | + ./default.nix |
| 14 | + ]; |
| 15 | + |
| 16 | + hardware.enableAllHardware = lib.mkForce false; |
| 17 | + |
| 18 | + fileSystems."/" = lib.mkForce { |
| 19 | + device = "/dev/disk/by-partlabel/nixos-rootfs"; |
| 20 | + fsType = "ext4"; |
| 21 | + }; |
| 22 | + |
| 23 | + fileSystems."/boot" = { |
| 24 | + device = "/dev/disk/by-label/ESP"; |
| 25 | + fsType = "vfat"; |
| 26 | + options = [ |
| 27 | + "fmask=0077" |
| 28 | + "dmask=0077" |
| 29 | + ]; |
| 30 | + }; |
| 31 | + |
| 32 | + image.fileName = "${config.image.baseName}-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}-bpi-sm10.img"; |
| 33 | + |
| 34 | + sdImage = { |
| 35 | + expandOnBoot = false; |
| 36 | + firmwarePartitionOffset = 12; |
| 37 | + firmwarePartitionName = "ESP"; |
| 38 | + firmwareSize = 256; |
| 39 | + |
| 40 | + populateFirmwareCommands = |
| 41 | + let |
| 42 | + systemdBoot = "${pkgs.systemd}/lib/systemd/boot/efi/systemd-bootriscv64.efi"; |
| 43 | + kernel = "${config.system.build.kernel}/${config.system.boot.loader.kernelFile}"; |
| 44 | + initrd = "${config.system.build.initialRamdisk}/${config.system.boot.loader.initrdFile}"; |
| 45 | + dtb = "${config.hardware.deviceTree.package}/${config.hardware.deviceTree.name}"; |
| 46 | + kernelParams = lib.concatStringsSep " " config.boot.kernelParams; |
| 47 | + in |
| 48 | + '' |
| 49 | + mkdir -p firmware/EFI/BOOT firmware/EFI/systemd firmware/EFI/nixos |
| 50 | + mkdir -p firmware/loader/entries |
| 51 | +
|
| 52 | + cp ${systemdBoot} firmware/EFI/BOOT/BOOTRISCV64.EFI |
| 53 | + cp ${systemdBoot} firmware/EFI/systemd/systemd-bootriscv64.efi |
| 54 | +
|
| 55 | + cp ${kernel} firmware/EFI/nixos/kernel.efi |
| 56 | + cp ${initrd} firmware/EFI/nixos/initrd |
| 57 | + cp ${dtb} firmware/EFI/nixos/k3_com260_ifx.dtb |
| 58 | +
|
| 59 | + cat > firmware/loader/loader.conf <<EOF |
| 60 | + default nixos |
| 61 | + timeout 3 |
| 62 | + console-mode auto |
| 63 | + EOF |
| 64 | +
|
| 65 | + cat > firmware/loader/entries/nixos.conf <<EOF |
| 66 | + title NixOS |
| 67 | + linux /EFI/nixos/kernel.efi |
| 68 | + initrd /EFI/nixos/initrd |
| 69 | + devicetree /EFI/nixos/k3_com260_ifx.dtb |
| 70 | + options init=${config.system.build.toplevel}/init ${kernelParams} |
| 71 | + EOF |
| 72 | +
|
| 73 | + cat > firmware/startup.nsh <<EOF |
| 74 | + @echo -off |
| 75 | + echo Booting NixOS... |
| 76 | + for %i in 0 1 2 3 4 5 |
| 77 | + if exist FS%i:\EFI\BOOT\BOOTRISCV64.EFI then |
| 78 | + FS%i:\EFI\BOOT\BOOTRISCV64.EFI |
| 79 | + endif |
| 80 | + endfor |
| 81 | + EOF |
| 82 | + ''; |
| 83 | + populateRootCommands = ""; |
| 84 | + |
| 85 | + postBuildCommands = '' |
| 86 | + eval $(${pkgs.util-linux}/bin/partx $img -o START,SECTORS --nr 2 --pairs) |
| 87 | + ROOTFS_START=$START |
| 88 | + ROOTFS_SECTORS=$SECTORS |
| 89 | +
|
| 90 | + truncate -s '+2M' $img |
| 91 | +
|
| 92 | + ${pkgs.util-linux}/bin/sfdisk $img <<EOF |
| 93 | + label: gpt |
| 94 | + unit: sectors |
| 95 | + sector-size: 512 |
| 96 | + first-lba: 256 |
| 97 | +
|
| 98 | + start=1280, size=128, name="env", type=0FC63DAF-8483-4772-8E79-3D69D8477DE4 |
| 99 | + start=2048, size=256, name="bootinfo", type=0FC63DAF-8483-4772-8E79-3D69D8477DE4 |
| 100 | + start=3072, size=1024, name="fsbl", type=0FC63DAF-8483-4772-8E79-3D69D8477DE4 |
| 101 | + start=8192, size=6144, name="esos", type=0FC63DAF-8483-4772-8E79-3D69D8477DE4 |
| 102 | + start=14336, size=2048, name="opensbi", type=0FC63DAF-8483-4772-8E79-3D69D8477DE4 |
| 103 | + start=16384, size=8192, name="uboot", type=0FC63DAF-8483-4772-8E79-3D69D8477DE4 |
| 104 | + start=24576, size=524288, name="ESP", type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B |
| 105 | + start=$ROOTFS_START, size=$ROOTFS_SECTORS, name="nixos-rootfs", type=0FC63DAF-8483-4772-8E79-3D69D8477DE4 |
| 106 | + EOF |
| 107 | +
|
| 108 | + dd if=${config.system.build.fsbl}/bootinfo_block.bin of=$img conv=notrunc bs=1M seek=1 |
| 109 | + dd if=${config.system.build.fsbl}/FSBL.bin of=$img conv=notrunc bs=1024 seek=1536 |
| 110 | + dd if=${config.system.build.opensbi}/share/opensbi/lp64/generic/firmware/fw_dynamic.itb of=$img conv=notrunc bs=1M seek=7 |
| 111 | + dd if=${config.system.build.edk2}/edk2.itb of=$img conv=notrunc bs=1M seek=8 |
| 112 | + ''; |
| 113 | + }; |
| 114 | +} |
0 commit comments