Generating HDL boot image for Intel projects#

This page is dedicated to the building process of boot image for supported Intel/Altera projects. One key file specific to these projects is the bootloader. It’s role is to initialize the system after the BootROM runs. It bridges the gap between the limited functionality of the BootROM and the end user application, configuring the system as needed before the larger application can run.

In the following links you can find more details on the process and the necessary components:

Necessary files for booting up an HDL project#

Warning

We do not provide any scripts to automate this process, so please read carefully and follow all the steps to obtain the boot file. We recommend using the latest version of Quartus. Te build flow is the same for the recent versions of Quartus.

To boot a system with Linux + HDL on an Intel board, you need the following files:

  • For Arria 10 SoC projects (build example):

    • <boot_mountpoint>/u-boot.img

    • <boot_mountpoint>/fit_spl_fpga.itb

    • <boot_mountpoint>/extlinux/extlinux.conf (keep the directory)

    • <boot_mountpoint>/socfpga_arria10_socdk_sdmmc.dtb

    • <boot_mountpoint>/socfpga_arria10-common/zImage

    • <boot_mountpoint>/u-boot-splx4.sfp (preloader image)

  • For Cyclone5 SoC project (build examples: Terasic C5, DE10Nano):

    • <boot_mountpoint>/u-boot.scr

    • <boot_mountpoint>/soc_system.rbf

    • <boot_mountpoint>/extlinux/extlinux.conf (keep the directory)

    • <boot_mountpoint>/socfpga_arria10-common/socfpga.dtb

    • <boot_mountpoint>/zImage

    • <boot_mountpoint>/u-boot-with-spl.sfp (preloader image)

Note

Some files, like fit_spl_fpga.itb or extlinux, were introduced later in the Intel boot flow with the U-Boot image update.

Using Kuiper Linux pre-built images#

The built and tested files can be found in our ADI Kuiper Linux release, which can be obtained from here.

Note

Make sure to always use the latest version of Kuiper Linux. If the desired project is not supported anymore, use the last version of Kuiper where it’s present.

The files need to be copied on the BOOT FAT32 partition, with the exception of the preloader image, which needs to be written to the third partition of the mounted device, and extlinux.conf, which should also be in BOOT FAT32 partition, in a folder called ‘extlinux’. That folder may not exist by default (it is deleted automatically in some cases, when the image is build, because it is empty and unused). Pay attention that extlinux.conf for Arria10 and Cyclone5 is slightly different.

Supposing your host is a Linux system, your carrier is an Arria10, the eval board/project is AD9081 and you are using the built files from the Kuiper image mounted at /mnt/BOOT, then you would:

~$
cd /mnt/BOOT
/mnt/BOOT$
cp socfpga_arria10_socdk_ad9081/u-boot.img .
/mnt/BOOT$
cp socfpga_arria10_socdk_ad9081/fit_spl_fpga.itb .
/mnt/BOOT$
mkdir -p extlinux
/mnt/BOOT$
cp socfpga_arria10_socdk_ad9081/extlinux.conf extlinux/
/mnt/BOOT$
cp socfpga_arria10_socdk_ad9081/socfpga_arria10_socdk_sdmmc.dtb .
/mnt/BOOT$
cp socfpga_arria10_common/zImage .

Writing the boot preloader partition requires special attention, first look for the device with BOOT mountpoint and annotate the third partition from the same device:

lsblk

Then, clear the partition with zeros and write the preloader image (in this example, Arria10 SoC’s ./u-boot-splx4.sfp):

$
DEV=mmcblk0p3
$
cd /mnt/BOOT/socfpga_arria10_socdk_ad9081
$
sudo dd if=/dev/zero of=/dev/$DEV oflag=sync status=progress \
    bs=$(sudo blockdev --getsize64 /dev/$DEV) count=1
1+0 records in
1+0 records out
8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.359183 s, 23.4 MB/s
$
sudo dd if=./u-boot-splx4.sfp of=/dev/$DEV oflag=sync status=progress bs=64k
1697+1 records in
1697+1 records out
868996 bytes (869 kB, 849 KiB) copied, 0.21262 s, 4.1 MB/s

Tip

The snippet below can infer the device based on the BOOT partition mountpoint

~$
DEV=$(lsblk | sed -n 's/.*\(\b[s][d-z][a-z][0-9]\)\s*.*\/BOOT/\1/p' | sed 's/^\(...\).*/\1/')
~$
if [ -z "$DEV" ] ; then \
   echo BOOT not found, couldn\'t infer block device ; \
else \
   echo The preloader image partition path likely is /dev/"$DEV"3 ; \
fi

Examples of building the boot image#

This is a list of projects supported by us for each carrier. The purpose is to illustrate how to build the different files involved in the process. Each project has its own characteristics (some files may differ from one project to the other).

Note

Each project has its own Linux Kernel Image & Devicetree which needs to be built. Follow these instructions to write the file to your SD card, depending on the operating system that you use (Windows or Linux):

Proceed by cloning the repository, setting the environment to an ARM architecture cross compiler, build the configuration file, build the Kernel image, and lastly build the device tree (specific to each combination of carrier and eval board).

You may notice that in the export CROSS_COMPILE examples there is a “trailing” dash -, and the reason for this is because an export:

~$
export CROSS_COMPILE=/path/to/arm-linux-gnueabihf-

Within the Makefiles, this path becomes /path/to/arm-linux-gnueabihf-gcc (with gcc added at the end).

If your environment already has the compiler in the path (test if which arm-linux-gnueabihf-gcc returns the expected path), you can set CROSS_COMPILE to:

~$
export CROSS_COMPILE=arm-linux-gnueabihf-

The difference between arm-linux-gnueabi-gcc and arm-linux-gnueabihf-gcc is that the latter has hardware floating-point support and may not be available in your default package manager.

Caution

Pay attention to the Quartus version. Based on these versions, different u-boot branches should be checked out. In the coming examples, we used the latest Quartus version available so the corresponding u-boot branches were checked-out.

ADRV9371/Arria 10#

Building the Linux Kernel image and the Devicetree#

Linux/Cygwin/WSL

~$
git clone https://github.com/analogdevicesinc/linux.git
~$
cd linux/
~/linux$
# Set architecture and compiler
~/linux$
export ARCH=arm
~/linux$
export CROSS_COMPILE=/path/to/arm-linux-gnueabihf-
~/linux$
# Apply kconfig settings
~/linux$
make socfpga_adi_defconfig
~/linux$
# Build the kernel
~/linux$
make zImage
~/linux$
# Build the devicetree
~/linux$
make socfpga_arria10_socdk_adrv9371.dtb

Building the Hardware Design#

Clone the HDL repository, then build the project:

~$
git clone https://github.com/analogdevicesinc/hdl.git
~$
cd hdl/projects/adrv9371x/a10soc
~/hdl/projects/adrv9371x/a10soc$
make

After the design is built, the resulting SRAM Object File (.sof) file shall be converted to a Raw Binary File (.rbf).

If you skipped the last section, ensure to set the architecture and cross compiler environment variables.

Caution

Pay attention to directoy changes to where the commands are run from, and always confirm with pwd to show the current path at you terminal.

$
cd ~/hdl/projects/adrv9371x/a10soc ; pwd
~/hdl/projects/adrv9371x/a10soc
$
quartus_cpf -c --hps -o bitstream_compression=on \
    ./adrv9371x_a10soc.sof soc_system.rbf

Building the Preloader and Bootloader Image#

This flow applies starting with release 2021_R1 / Quartus Pro version 20.1. For older versions of the flow see previous versions of this page on wiki Altera SOC Quick Start Guide.

In the HDL project directory, create the software/bootloader folder and clone the u-boot-socfpga image:

$
cd ~/hdl/projects/adrv9371x/a10soc ; pwd
~/hdl/projects/adrv9371x/a10soc
$
mkdir -p software/bootloader
$
cd software/bootloader
$
git clone https://github.com/altera-opensource/u-boot-socfpga.git

Then run the qts filter and build the preloader and bootloader images:

$
cd ~/hdl/projects/adrv9371x/a10soc/software/bootloader ; pwd
~/hdl/projects/adrv9371x/a10soc/software/bootloader
$
cd u-boot-socfpga ; pwd
~/hdl/projects/adrv9371x/a10soc/software/bootloader/u-boot-socfpga
$
git checkout rel_socfpga_v2021.07_22.02.02_pr
$
./arch/arm/mach-socfpga/qts-filter-a10.sh ../../../hps_isw_handoff/hps.xml \
   arch/arm/dts/socfpga_arria10_socdk_sdmmc_handoff.h
$
make socfpga_arria10_defconfig
$
make

Create the SPL image:

$
cd ~/hdl/projects/adrv9371x/a10soc/software/bootloader/u-boot-socfpga ; pwd
~/hdl/projects/adrv9371x/a10soc/software/bootloader/u-boot-socfpga
$
ln -s ../../../soc_system.core.rbf .
$
ln -s ../../../soc_system.periph.rbf .
$
sed -i 's/ghrd_10as066n2/soc_system/g' board/altera/arria10-socdk/fit_spl_fpga.its
$
./tools/mkimage -E -f board/altera/arria10-socdk/fit_spl_fpga.its fit_spl_fpga.itb

Last but not least, create the extlinux.conf Linux configuration file, which will be copied to /BOOT partition of the SD Card, in a folder named extlinux:

$
cd ~/hdl/projects/adrv9371x/a10soc/software/bootloader/u-boot-socfpga ; pwd
~/hdl/projects/adrv9371x/a10soc/software/bootloader/u-boot-socfpga
$
mkdir extlinux
$
printf "\
LABEL Linux Arria10 Default\n\
KERNEL ../zImage\n\
    FDT ../socfpga_arria10_socdk_sdmmc.dtb\n\
    APPEND root=/dev/mmcblk0p2 rw rootwait earlyprintk console=ttyS0,115200n8" \
    > extlinux/extlinux.conf

Configuring the SD Card#

Below are the commands to create the preloader and bootloader partition using the Kuiper Linux image as a starting point. Please check every command before running, especially configuring target device mountpoints accordingly (here as /dev/sdz with partition 1 mounted at /media/BOOT/).

Flash the SD Card with the Kuiper Linux image:

~$
time sudo dd if=./2023-12-13-ADI-Kuiper-full.img of=/dev/sdz status=progress bs=4194304
2952+0 records in
2952+0 records out
12381585408 bytes (12 GB, 12 GiB) copied, 838.353 s, 14.8 MB/s

real        14m7.938s
user        0m0.006s
sys 0m0.009s
~$
sync

Mount the /BOOT partition:

$
lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdz           8:48   1  29.1G  0 disk
├─sdz1        8:49   1     2G  0 part
├─sdz2        8:50   1  27.1G  0 part
└─sdz3        8:51   1     8M  0 part
$
mkdir -p /media/BOOT/
$
sudo mount /dev/sdz1 /media/BOOT/
$
lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdz           8:48   1  29.1G  0 disk
├─sdz1        8:49   1     2G  0 part /media/BOOT
├─sdz2        8:50   1  27.1G  0 part
└─sdz3        8:51   1     8M  0 part

Copy the built files to the /BOOT partition:

$
cd ~/hdl/projects/adrv9371x/a10soc ; pwd
~/hdl/projects/adrv9371x/a10soc
$
cp ./software/bootloader/u-boot-socfpga/u-boot.img /media/BOOT/
$
cp ./software/bootloader/u-boot-socfpga/fit_spl_fpga.itb /media/BOOT/
$
mkdir -p /media/BOOT/extlinux
$
cp ./software/bootloader/u-boot-socfpga/extlinux/extlinux.conf /media/BOOT/extlinux/
$
cp ~/linux/arch/arm/boot/dts/socfpga_arria10_socdk_sdmmc.dtb /media/BOOT/
$
cp ~/linux/arch/arm/boot/zImage /media/BOOT/

Unmount the /BOOT partition:

$
sudo umount /dev/sdz1
$
lsblk
NAME        MAJ:MIN RM  SIZE  RO TYPE MOUNTPOINT
sdz           8:48  1   29.1G  0 disk
├─sdz1        8:49  1      2G  0 part
├─sdz2        8:50  1   27.1G  0 part
└─sdz3        8:51  1      8M  0 part

Flash the preloader boot partition:

$
cd ~/hdl/projects/adrv9371x/a10soc/software/bootloader/u-boot-socfpga ; pwd
~/hdl/projects/adrv9371x/a10soc/software/bootloader/u-boot-socfpga
$
sudo dd if=/dev/zero of=/dev/sdz3 oflag=sync status=progress \
    bs=$(sudo blockdev --getsize64 /dev/sdz3) count=1
1+0 records in
1+0 records out
8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.359183 s, 23.4 MB/s
$
sudo dd if=./u-boot-splx4.sfp of=/dev/sdz3
1697+1 records in
1697+1 records out
868996 bytes (869 kB, 849 KiB) copied, 0.21262 s, 4.1 MB/s

ARRADIO/Terasic C5 SoC#

  • HDL Project:

  • ADI’s Linux kernel: here

Building the Linux Kernel image and the Devicetree#

Linux/Cygwin/WSL

~$
git clone https://github.com/analogdevicesinc/linux.git
~$
cd linux/
~/linux$
# Set architecture and compiler
~/linux$
export ARCH=arm
~/linux$
export CROSS_COMPILE=/path/to/arm-linux-gnueabihf-
~/linux$
# Apply kconfig settings
~/linux$
make socfpga_adi_defconfig
~/linux$
# Build the kernel
~/linux$
make zImage
~/linux$
# Build the devicetree
~/linux$
make socfpga_cyclone5_sockit_arradio.dtb

Building the Hardware Design#

Clone the HDL repository, then build the project:

~$
git clone https://github.com/analogdevicesinc/hdl.git
~$
cd hdl/projects/arradio/c5soc
~/hdl/projects/arradio/c5soc$
make

After the design is built, the resulting SRAM Object File (.sof) file shall be converted to a Raw Binary File (.rbf).

If you skipped the last section, ensure to set the architecture and cross compiler environment variables.

Caution

Pay attention to directory changes to where the commands are run from, and always confirm with pwd to show the current path at you terminal.

$
cd ~/hdl/projects/arradio/c5soc ; pwd
~/hdl/projects/arradio/c5soc
$
quartus_cpf -c -o bitstream_compression=on --hps \
    ./arradio_c5soc.sof soc_system.rbf

Building the Preloader and Bootloader Image#

This flow applies starting with release 2021_R1 / Quartus Pro version 20.1. For older versions of the flow see previous versions of this page on wiki Altera SOC Quick Start Guide.

In HDL project directory, create the software/bootloader folder and clone the u-boot-socfpga image. Before that create a new BSP settings file:

$
cd ~/hdl/projects/arradio/c5soc ; pwd
~/hdl/projects/arradio/c5soc
$
mkdir -p software/bootloader
$
embedded_command_shell.sh bsp-create-settings --type spl \
    --bsp-dir software/bootloader \
    --preloader-settings-dir "hps_isw_handoff/system_bd_sys_hps" \
    --settings software/bootloader/settings.bsp
$
cd software/bootloader ; pwd
~/hdl/projects/arradio/c5soc/software/bootloader
$
git clone https://github.com/altera-opensource/u-boot-socfpga.git
$
git checkout socfpga_v2021.10

Then run the qts filter and build the preloader and bootloader images:

$
cd ~/hdl/projects/arradio/c5soc/software/bootloader ; pwd
~/hdl/projects/arradio/c5soc/software/bootloader
$
cd u-boot-socfpga ; pwd
~/hdl/projects/arradio/c5soc/software/bootloader/u-boot-socfpga
$
./arch/arm/mach-socfpga/qts-filter.sh cyclone5 ../../../../../board/altera/cyclone5-socdk/qts/
$
make socfpga_cyclone5_defconfig
$
make

Make u-boot.scr file - this file shall be copied to /BOOT partition of the SD Card:

$
cd ~/hdl/projects/arradio/c5soc/software/bootloader/u-boot-socfpga ; pwd
~/hdl/projects/arradio/c5soc/software/bootloader/u-boot-socfpga
$
echo "load mmc 0:1 \${loadaddr} soc_system.rbf;" > u-boot.txt
$
echo "fpga load 0 \${loadaddr} \$filesize;" >> u-boot.txt
$
./tools/mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Cyclone V script" -d u-boot.txt u-boot.scr

Last but not least, create the extlinux.conf Linux configuration file, which will be copied to /BOOT partition of the SD Card, in a folder named extlinux:

$
cd ~/hdl/projects/arradio/c5soc/software/bootloader/u-boot-socfpga ; pwd
~/hdl/projects/arradio/c5soc/software/bootloader/u-boot-socfpga
$
mkdir extlinux
$
printf "\
LABEL Linux C5 SoC Default\n\
KERNEL ../zImage\n\
    FDT ../socfpga.dtb\n\
    APPEND root=/dev/mmcblk0p2 rw rootwait earlyprintk console=ttyS0,115200n8" \
    > extlinux/extlinux.conf

Jumper setup#

Here is the jumper configuration for ARRADIO/C5SoC to boot the image from the SD Card:

Jumper

Position

CLOCKSEL0

2-3

CLOCKSEL1

2-3

BOOTSEL0

2-3

BOOTSEL1

2-3

BOOTSEL2

1-2

MSEL0

0

MSEL1

1

MSEL2

0

MSEL3

1

MSEL4

0

CODEC_SEL

0

And set JP2 to 2.5V or 1.8V.

Configuring the SD Card#

Below are the commands to create the preloader and bootloader partition using the Kuiper Linux image as a starting point. Please check every command before running, especially configuring target device mountpoints accordingly (here as /dev/sdz with partition 1 mounted at /media/BOOT/).

Flash the SD Card with the Kuiper Linux image:

~$
time sudo dd if=./2023-12-13-ADI-Kuiper-full.img of=/dev/sdz status=progress bs=4194304
2952+0 records in
2952+0 records out
12381585408 bytes (12 GB, 12 GiB) copied, 838.353 s, 14.8 MB/s

real        14m7.938s
user        0m0.006s
sys 0m0.009s
~$
sync

Mount the /BOOT partition:

$
lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdz           8:48   1  29.1G  0 disk
├─sdz1        8:49   1     2G  0 part
├─sdz2        8:50   1  27.1G  0 part
└─sdz3        8:51   1     8M  0 part
$
mkdir -p /media/BOOT/
$
sudo mount /dev/sdz1 /media/BOOT/
$
lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdz           8:48   1  29.1G  0 disk
├─sdz1        8:49   1     2G  0 part /media/BOOT
├─sdz2        8:50   1  27.1G  0 part
└─sdz3        8:51   1     8M  0 part

Copy the built files to the /BOOT partition:

$
cd ~/hdl/projects/arradio/c5soc ; pwd
~/hdl/projects/arradio/c5soc
$
cp ./software/bootloader/u-boot-socfpga/u-boot.scr /media/BOOT/
$
cp soc_system.rbf /media/BOOT/
$
mkdir -p /media/BOOT/extlinux
$
cp ./software/bootloader/u-boot-socfpga/extlinux/extlinux.conf /media/BOOT/extlinux/
$
cp ~/linux/arch/arm/boot/dts/socfpga_cyclone5_sockit_arradio.dtb /media/BOOT/socfpga.dtb
$
cp ~/linux/arch/arm/boot/zImage /media/BOOT/

Unmount the /BOOT partition:

$
sudo umount /dev/sdz1
$
lsblk
NAME        MAJ:MIN RM  SIZE  RO TYPE MOUNTPOINT
sdz           8:48  1   29.1G  0 disk
├─sdz1        8:49  1      2G  0 part
├─sdz2        8:50  1   27.1G  0 part
└─sdz3        8:51  1      8M  0 part

Flash the preloader boot partition:

$
cd ~/hdl/projects/arradio/c5soc/software/bootloader/u-boot-socfpga ; pwd
~/hdl/projects/arradio/c5soc/software/bootloader/u-boot-socfpga
$
sudo dd if=/dev/zero of=/dev/sdz3 oflag=sync status=progress \
    bs=$(sudo blockdev --getsize64 /dev/sdz3) count=1
1+0 records in
1+0 records out
8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.359183 s, 23.4 MB/s
$
sudo dd if=./u-boot-with-spl.sfp of=/dev/sdz3
1697+1 records in
1697+1 records out
868996 bytes (869 kB, 849 KiB) copied, 0.21262 s, 4.1 MB/s

CN0540/DE10Nano#

  • HDL Project:

  • ADI’s Linux kernel: here

Building the Linux Kernel image and the Devicetree#

Linux/Cygwin/WSL

~$
git clone https://github.com/analogdevicesinc/linux.git
~$
cd linux/
~/linux$
# Set architecture and compiler
~/linux$
export ARCH=arm
~/linux$
export CROSS_COMPILE=/path/to/arm-linux-gnueabihf-
~/linux$
# Apply kconfig settings
~/linux$
make socfpga_adi_defconfig
~/linux$
# Build the kernel
~/linux$
make zImage
~/linux$
# Build the devicetree
~/linux$
make socfpga_cyclone5_de10_nano_cn0540.dtb

Building the Hardware Design#

Clone the HDL repository, then build the project:

~$
git clone https://github.com/analogdevicesinc/hdl.git
~$
cd hdl/projects/cn0540/de10nano
~/hdl/projects/cn0540/de10nano$
make

After the design is built, the resulting SRAM Object File (.sof) file shall be converted to a Raw Binary File (.rbf).

If you skipped the last section, ensure to set the architecture and cross compiler environment variables.

Caution

Pay attention to directory changes to where the commands are run from, and always confirm with pwd to show the current path at you terminal.

$
cd ~/hdl/projects/cn0540/de10nano ; pwd
~/hdl/projects/cn0540/de10nano
$
quartus_cpf -c -o bitstream_compression=on \
    ./cn0540_de10nano.sof soc_system.rbf

Building the Preloader and Bootloader Image#

This flow applies starting with release 2021_R1 / Quartus Pro version 20.1. For older versions of the flow see previous versions of this page on wiki Altera SOC Quick Start Guide.

In HDL project directory, create the software/bootloader folder and clone the u-boot-socfpga image. Before that create a new BSP settings file:

$
cd ~/hdl/projects/cn0540/de10nano ; pwd
~/hdl/projects/cn0540/de10nano
$
mkdir -p software/bootloader
$
embedded_command_shell.sh bsp-create-settings --type spl \
    --bsp-dir software/bootloader \
    --preloader-settings-dir "hps_isw_handoff/system_bd_sys_hps" \
    --settings software/bootloader/settings.bsp
$
cd software/bootloader ; pwd
~/hdl/projects/cn0540/de10nano/software/bootloader
$
git clone https://github.com/altera-opensource/u-boot-socfpga.git
$
git checkout socfpga_v2021.10

Then run the qts filter and build the preloader and bootloader images:

$
cd ~/hdl/projects/cn0540/de10nano/software/bootloader ; pwd
~/hdl/projects/cn0540/de10nano/software/bootloader
$
cd u-boot-socfpga ; pwd
~/hdl/projects/cn0540/de10nano/software/bootloader/u-boot-socfpga
$
./arch/arm/mach-socfpga/qts-filter.sh cyclone5 ../../../../../board/altera/cyclone5-socdk/qts/
$
make socfpga_cyclone5_defconfig
$
make

Make u-boot.scr file - this file shall be copied to /BOOT partition of the SD Card:

$
cd ~/hdl/projects/arradio/c5soc/software/bootloader/u-boot-socfpga ; pwd
~/hdl/projects/arradio/c5soc/software/bootloader/u-boot-socfpga
$
echo "load mmc 0:1 \${loadaddr} soc_system.rbf;" > u-boot.txt
$
echo "fpga load 0 \${loadaddr} \$filesize;" >> u-boot.txt
$
./tools/mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Cyclone V script" -d u-boot.txt u-boot.scr

Last but not least, create the extlinux.conf Linux configuration file, which will be copied to /BOOT partition of the SD Card, in a folder named extlinux:

$
cd ~/hdl/projects/cn0540/de10nano/software/bootloader/u-boot-socfpga ; pwd
~/hdl/projects/cn0540/de10nano/software/bootloader/u-boot-socfpga
$
mkdir extlinux
$
printf "\
LABEL Linux DE10Nano Default\n\
KERNEL ../zImage\n\
    FDT ../socfpga.dtb\n\
    APPEND root=/dev/mmcblk0p2 rw rootwait earlyprintk console=ttyS0,115200n8" \
    > extlinux/extlinux.conf

Configuring the SD Card#

Below is the commands to create the preloader and bootloader partition using the Kuiper Linux image as a starting point. Please check every command before running, especially configuring target device mountpoints accordingly (here as /dev/sdz with partition 1 mounted at /media/BOOT/).

Flash the SD Card with the Kuiper Linux image:

~$
time sudo dd if=./2023-12-13-ADI-Kuiper-full.img of=/dev/sdz status=progress bs=4194304
2952+0 records in
2952+0 records out
12381585408 bytes (12 GB, 12 GiB) copied, 838.353 s, 14.8 MB/s

real        14m7.938s
user        0m0.006s
sys 0m0.009s
~$
sync

Mount the /BOOT partition:

$
lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdz           8:48   1  29.1G  0 disk
├─sdz1        8:49   1     2G  0 part
├─sdz2        8:50   1  27.1G  0 part
└─sdz3        8:51   1     8M  0 part
$
mkdir -p /media/BOOT/
$
sudo mount /dev/sdz1 /media/BOOT/
$
lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdz           8:48   1  29.1G  0 disk
├─sdz1        8:49   1     2G  0 part /media/BOOT
├─sdz2        8:50   1  27.1G  0 part
└─sdz3        8:51   1     8M  0 part

Copy the built files to the /BOOT partition:

$
cd ~/hdl/projects/cn0540/de10nano ; pwd
~/hdl/projects/cn0540/de10nano
$
cp ./software/bootloader/u-boot-socfpga/u-boot.scr /media/BOOT/
$
cp soc_system.rbf /media/BOOT/
$
mkdir -p /media/BOOT/extlinux
$
cp ./software/bootloader/u-boot-socfpga/extlinux/extlinux.conf /media/BOOT/extlinux/
$
cp ~/linux/arch/arm/boot/dts/socfpga_cyclone5_de10_nano_cn0540.dtb /media/BOOT/socfpga.dtb
$
cp ~/linux/arch/arm/boot/zImage /media/BOOT/

Unmount the /BOOT partition:

$
sudo umount /dev/sdz1
$
lsblk
NAME        MAJ:MIN RM  SIZE  RO TYPE MOUNTPOINT
sdz           8:48  1   29.1G  0 disk
├─sdz1        8:49  1      2G  0 part
├─sdz2        8:50  1   27.1G  0 part
└─sdz3        8:51  1      8M  0 part

Flash the preloader boot partition:

$
cd ~/hdl/projects/cn0540/de10nano/software/bootloader/u-boot-socfpga ; pwd
~/hdl/projects/cn0540/de10nano/software/bootloader/u-boot-socfpga
$
sudo dd if=/dev/zero of=/dev/sdz3 oflag=sync status=progress \
    bs=$(sudo blockdev --getsize64 /dev/sdz3) count=1
1+0 records in
1+0 records out
8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.359183 s, 23.4 MB/s
$
sudo dd if=./u-boot-with-spl.sfp of=/dev/sdz3
1697+1 records in
1697+1 records out
868996 bytes (869 kB, 849 KiB) copied, 0.21262 s, 4.1 MB/s
$
sync