wiki:network boot

This page details to process for configuring a Zynq board to boot via Network boot (NFS+TFTP). Two guides are provided, one for generating the Petalinux project via a BSP and another via the Zynq template.

Building Images

BSP

The following instructions present a guide to building images for the Digilent Zybo Board with a Zynq-7000 using a BSP File. Petalinux 2017.4 will be needed.

Clone Github repository and revert to previous commit

$ git clone https://github.com/apollo-lhc/SM_ZYNQ_FW.git
$ cd SM_ZYNQ_FW
$ git checkout b9c9c6d718f7f98fa73ea84179564651ff3035b0 .

Build FPGA FW

$ make

Note: Output will say "Failed to build FW!", but the errors will not interfere with this build

Alter Makefile in SM_ZYNQ_FW/kernel

  • Change VIVADO_VERSION

VIVADO_VERSION = 2017.4

  • Change VIVADO_PETALINUX path

VIVADO_PETALINUX="/work/Xilinx/petalinux/"$(VIVADO_VERSION)"/settings.sh"

  • Add path to BSP file as a variable

BSP_PATH = "/work/ichand/Petalinux-Zybo-2017.4-1.bsp"

  • Change petalinux-create command to use BSP file

petalinux-create --type project --name $(ZYNQ_OS) --s $(BSP_PATH) --force

Build Petalinux Project and Configure Settings

Build the Petalinux project directory by running make in SM_ZYNQ_FW/kernel

Configure general system behavior

$ cd zynq_os
$ source /work/Xilinx/petalinux/2017.4/settings.sh
$ petalinux-config --get-hw-description ../hw --oldconfig
$ petalinux-config

This will open up a settings menu where the following settings should be adjusted

  • DTG Settings -> Kernel Bootargs
    • Disable "generate boot args automatically
    • Set "user set kernel bootargs" to console=ttyPS0,115200 earlycon clk_ignore_unused rootwait root=/dev/nfs rw ip=dhcp nfsroot=<NFS Server IP>:<RFS Directory Path>,nfsvers=3,tcp
  • u-boot Configuration
    • Set "TFTP Server IP address" to <TFTP Server IP>
  • Image Packaging Configuration
    • -> Root File System: Set to NFS
    • -> Location of NFS root directory: Set to <RFS Directory Path>
    • -> NFS Server IP Address: Set to <NFS Server IP>

Configure kernel settings $ petalinux-config -c kernel This will open up a settings menu where the following settings should be enabled

  • Networking support -> Networking Options
    • TCP/IP Networking = Enabled
    • IP: Multicasting = Enabled
    • IP: kernel level autoconfiguration = Enabled
    • IP: DHCP support = Enabled
    • IP: BOOTP support = Enabled
    • IP: RARP support = Enabled
  • File Systems -> Network File Systems
    • NFS client cupport = Enabled
    • NFS client support for NFS version 2 = Enabled
    • NFS client support for NFS version 3 = Enabled
    • NFS client support for NFSv3 ACL protocol extension = Enabled

Build Images

Rebuild the Petalinux Project with the correct configurations

Transfer config files from zynq_os to zynq_os_mods

$ cp SM_ZYNQ_FW/kernel/zynq_os/project-spec/configs/config SM_ZYNQ_FW/kernel/zynq_os_mods/configs/boot_config
$ cp SM_ZYNQ_FW/kernel/zynq_os/project-spec/configs/rootfs_config SM_ZYNQ_FW/kernel/zynq_os_mods/rootfs
$ cp SM_ZYNQ_FW/kernel/zynq_os/project-spec/meta-plnx-generated/recipes-kernel/linux/configs/plnx_kernel.cfg SM_ZYNQ_FW/kernel/zynq_os_mods/kernel/linux/linux-xlnx

Add the following line to SM_ZYNQ_FW/kernel/zynq_os_mods/kernel/linux/linux-xlnx_%.bbappend

SRC_URI += "file://plnx_kernel.cfg"

Run make clean in SM_ZYNQ_FW/kernel/, then run make

After the build completes, BOOT.BIN, image.ub, and rootfs.tar.gz can be found in SM_ZYNQ_FW/kernel/zynq_os/images/linux

Booting Zybo

The following steps detail how to boot the Zybo using the newly generated files

Transfer the files

  • Place image.ub in the TFTP server directory
  • Place BOOT.BIN on the first partition of the SD Card
  • Extract `rootfs.tar.gz' into the NFS server directory

Boot

  • Connect to the board via UART and turn it on
  • When the prompt starts counting down, press any key to stop auto-boot
  • Run the command run netboot

Note: run netboot will likely fail as a result of the boot environment settings being incorrect. Set the following variables as shown:

$ setenv bootargs console=ttyPS0,115200 earlycon clk_ignore_unused rootwait root=/dev/nfs rw ip=dhcp nfsroot=<NFS Server IP>:<RFS Directory Path>,nfsvers=3,tcp
$ setenv serverip <TFTP Server IP>

Note: Need to add more of the U-boot settings

Zynq Template

The following instructions present a guide to building images for the Digilent Zybo Board using the Zynq template to create the project from scratch. Petalinux 2018.2 will be needed

Clone Github repository

$ git clone https://github.com/apollo-lhc/SM_ZYNQ_FW.git
$ cd SM_ZYNQ_FW

Build FPGA FW

$ make

Note: Output will say "Failed to build FW!", but the errors will not interfere with this build

Build Petalinux Project and Configure Settings

Build the Petalinux project directory by running make in SM_ZYNQ_FW/kernel

Configure general system behavior

$ cd zynq_os
$ source /work/Xilinx/petalinux/2017.4/settings.sh
$ petalinux-config --get-hw-description ../hw --oldconfig
$ petalinux-config

This will open up a settings menu where the following settings should be adjusted

  • DTG Settings -> Kernel Bootargs
    • Disable "generate boot args automatically
    • Set "user set kernel bootargs" to console=ttyPS0,115200 earlycon clk_ignore_unused rootwait root=/dev/nfs rw ip=dhcp nfsroot=<NFS Server IP>:<RFS Directory Path>,nfsvers=3,tcp
  • u-boot Configuration
    • Set "TFTP Server IP address" to <TFTP Server IP>
  • Image Packaging Configuration
    • -> Root File System: Set to NFS
    • -> Location of NFS root directory: Set to <RFS Directory Path>
    • -> NFS Server IP Address: Set to <NFS Server IP>

Configure kernel settings $ petalinux-config -c kernel This will open up a settings menu where the following settings should be enabled

  • Networking support -> Networking Options
    • TCP/IP Networking = Enabled
    • IP: Multicasting = Enabled
    • IP: kernel level autoconfiguration = Enabled
    • IP: DHCP support = Enabled
    • IP: BOOTP support = Enabled
    • IP: RARP support = Enabled
  • File Systems -> Network File Systems
    • NFS client cupport = Enabled
    • NFS client support for NFS version 2 = Enabled
    • NFS client support for NFS version 3 = Enabled
    • NFS client support for NFSv3 ACL protocol extension = Enabled

Build Images

Rebuild the Petalinux Project with the correct configurations

Transfer config files from zynq_os to zynq_os_mods

$ cp SM_ZYNQ_FW/kernel/zynq_os/project-spec/configs/config SM_ZYNQ_FW/kernel/zynq_os_mods/configs/boot_config
$ cp SM_ZYNQ_FW/kernel/zynq_os/project-spec/configs/rootfs_config SM_ZYNQ_FW/kernel/zynq_os_mods/rootfs
$ cp SM_ZYNQ_FW/kernel/zynq_os/project-spec/meta-plnx-generated/recipes-kernel/linux/configs/plnx_kernel.cfg SM_ZYNQ_FW/kernel/zynq_os_mods/kernel/linux/linux-xlnx

Add the following line to SM_ZYNQ_FW/kernel/zynq_os_mods/kernel/linux/linux-xlnx_%.bbappend

SRC_URI += "file://plnx_kernel.cfg"

Run make clean in SM_ZYNQ_FW/kernel/, then run make

After the build completes, BOOT.BIN, image.ub, and rootfs.tar.gz can be found in SM_ZYNQ_FW/kernel/zynq_os/images/linux

Apollo Blade Build

The following instructions present a guide to building images for the Apollo Blades using the Zynq template to create the project from scratch. Petalinux 2018.2 will be needed

Clone Github repository

$ git clone https://github.com/apollo-lhc/SM_ZYNQ_FW.git
$ cd SM_ZYNQ_FW

Build FPGA FW

$ make init
$ make rev2_xczu7ev

Time: ~1 hour

Configure U-Boot environment variables

Documentation for configuration of u-boot-xlnx_%.bbappend, bsp.cfg, and platform-top.h can be found here on page 99. Because u-boot autoconfig is being deprecated, this is the workaround to avoid the need for platform-auto.h.

$ cd kernel
$ mkdir ./configs/rev2_xczu7ev/u-boot
$ mkdir ./configs/rev2_xczu7ev/u-boot/files

u-boot-xlnx_%.bbappend

$ vi ./configs/rev2_xczu7ev/u-boot/u-boot-xlnx_%.bbappend

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"

SRC_URI += " \
        file://platform-top.h \
        file://bsp.cfg \
"

do_configure_append () {
        if [ "${U_BOOT_AUTO_CONFIG}" = "1" ]; then
                install ${WORKDIR}/platform-auto.h ${S}/include/configs/
                install ${WORKDIR}/platform-top.h ${S}/include/configs/
        else
                install ${WORKDIR}/platform-top.h ${S}/include/configs/
        fi
}

do_configure_append_microblaze () {
        if [ "${U_BOOT_AUTO_CONFIG}" = "1" ]; then
                install -d ${B}/source/board/xilinx/microblazegeneric/
                install ${WORKDIR}/config.mk ${B}/source/board/xilinx/microblaze-generic/
        fi
}

bsp.cfg

$ vi ./configs/rev2_xczu7ev/u-boot/files/bsp.cfg

CONFIG_SYS_CONFIG_NAME="platform-top"

platform-top.h

$ vi ./configs/rev2_xczu7ev/u-boot/files/platform-top_NFS+TFTP.h

#include <configs/xilinx_zynqmp.h>

#define pushCEES _Pragma("push_macro(\"CONFIG_EXTRA_ENV_SETTINGS\")")
#define popCEES _Pragma("pop_macro(\"CONFIG_EXTRA_ENV_SETTINGS\")")

pushCEES
#undef CONFIG_EXTRA_ENV_SETTINGS
#define CONFIG_EXTRA_ENV_SETTINGS popCEES CONFIG_EXTRA_ENV_SETTINGS \
        "bootargs=console=ttyPS0,115200 earlycon clk_ignore_unused rootwait root=/dev/nfs rw ip=dhcp nfsroot=192.168.30.2:/export/CentOS,nfsvers=3,tcp\0" \
        "autoload=no\0" \
        "netstart=0x04000000\0" \
        "kernel_img=image.ub\0" \
        "netboot=dhcp && setenv serverip 192.168.30.2 && tftpboot ${netstart} ${kernel_img} && bootm ${netstart}\0" \
        "bootcmd=run netboot\0" \
""
$ ln -s ./configs/rev2_xczu7ev/u-boot/files/platform-top_NFS+TFTP.h ./configs/rev2_xczu7ev/u-boot/files/platform-top.h

Rather than creating a symlink, you may also put your changes directly into platform-top.h, whatever best fits your workflow.

Makefile will transfer contents of ./configs/rev2_xczu7ev/u-boot directory into ${ZYNQ_OS_PROJECT_PATH}/project-spec/meta-user/recipes-bsp/u-boot

Build ZYNQ FSBL, Kernel, and File System

$ make rev2_xczu7ev

After the build completes, BOOT.BIN, boot.scr, and image.ub can be found in SM_ZYNQ_FW/kernel/zynq_os/images/linux

Configure general system behavior

Everything done within the Petalinux configuration menu should already be handled by the settings within platform-top.h. I've left these steps as they may be useful in the future, however, they are outdated and use Petalinux 2017.4 and build rev1_xc7z035.

$ cd zynq_os
$ source /work/Xilinx/petalinux/2017.4/settings.sh
$ petalinux-config --get-hw-description ../hw --oldconfig
$ petalinux-config

This will open up a settings menu where the following settings should be adjusted

  • DTG Settings -> Kernel Bootargs
    • Disable "generate boot args automatically
    • Set "user set kernel bootargs" to console=ttyPS0,115200 earlycon clk_ignore_unused rootwait root=/dev/nfs rw ip=dhcp nfsroot=<NFS Server IP>:<RFS Directory Path>,nfsvers=3,tcp
  • u-boot Configuration
    • Set "TFTP Server IP address" to <TFTP Server IP>
  • Image Packaging Configuration
    • -> Root File System: Set to NFS
    • -> Location of NFS root directory: Set to <RFS Directory Path>
    • -> NFS Server IP Address: Set to <NFS Server IP>

Configure kernel settings $ petalinux-config -c kernel This will open up a settings menu where the following settings should be enabled

  • Networking support -> Networking Options
    • TCP/IP Networking = Enabled
    • IP: Multicasting = Enabled
    • IP: kernel level autoconfiguration = Enabled
    • IP: DHCP support = Enabled
    • IP: BOOTP support = Enabled
    • IP: RARP support = Enabled
  • File Systems -> Network File Systems
    • NFS client cupport = Enabled
    • NFS client support for NFS version 2 = Enabled
    • NFS client support for NFS version 3 = Enabled
    • NFS client support for NFSv3 ACL protocol extension = Enabled

Rebuild Images

Rebuild the Petalinux Project with the correct configurations

Transfer config files from zynq_os to zynq_os_mods

$ cp SM_ZYNQ_FW/kernel/zynq_os/project-spec/configs/config SM_ZYNQ_FW/kernel/zynq_os_mods/configs/boot_config
$ cp SM_ZYNQ_FW/kernel/zynq_os/project-spec/configs/rootfs_config SM_ZYNQ_FW/kernel/zynq_os_mods/rootfs
$ cp SM_ZYNQ_FW/kernel/zynq_os/project-spec/meta-plnx-generated/recipes-kernel/linux/configs/plnx_kernel.cfg SM_ZYNQ_FW/kernel/zynq_os_mods/kernel/linux/linux-xlnx

Add the following line to SM_ZYNQ_FW/kernel/zynq_os_mods/kernel/linux/linux-xlnx_%.bbappend

SRC_URI += "file://plnx_kernel.cfg"

Run make clean in SM_ZYNQ_FW/kernel/, then run make rev1_xc7z035

After the build completes, BOOT.BIN, boot.scr, and image.ub can be found in SM_ZYNQ_FW/kernel/zynq_os/images/linux

Transfer Images

This guide is specific to Apollo202 and may or may not apply to other blades.

$ mount /dev/mmcblk1p1 /mnt

Transfer BOOT.BIN and boot.scr into /mnt

$ umount /mnt

Transfer image.ub into the TFTP server directory

Build CentOS Image

NOTE: Need to double-check process and whether you needed to run the GetReleases?.sh script and what you commented out while trying to get it to work

Starting in the SM_ZYNQ_FW directory, run the following commands:

$ make address_table
$ cd os
$ sudo make clean
$ sudo make

After the build completes, the 'image' directory will be produced and contain the file system.

Last modified 2 years ago Last modified on Feb 22, 2022, 1:50:30 PM