The U-Boot boot script process was changed in Petalinux 2021.1, and modifying it now requires a recipe to overwrite the original script.
Overview
In Petalinux 2020.1, U-Boot was modified to use the U-Boot “distro boot” feature, as previously discussed in the post U-Boot changes to distro boot. In that version, the boot.scr was included in the meta-user layer and it was easily accessible for modification. In the latest 2021.1, the boot.scr script among other things, was moved to the Xilinx Yocto layer, and it requires a Yocto bbappend recipe to overwrite it.
The recipe
Yocto uses a bbappend file to modify another related recipe in what is called a BitBake append file. These files use a .bbappend file type suffix, and use the same naming convention as the recipe they modify with the .bb file suffix.
The bbappend follows the same directory structure as the original recipe, as we’ll see below. In Petalinux, the U-Boot recipe resides under <project>/components/yocto/layers/meta-xilinx/meta-xilinx-bsp/recipes-bsp/u-boot.
Below is the contents of the whole U-Boot recipe, where the u-boot-zynq-scr recipe also resides:
.
├── files
│ └── 0001-Remove-redundant-YYLOC-global-declaration.patch
├── u-boot_%.bbappend
├── u-boot-spl-zynq-init.inc
├── u-boot-xlnx_2021.1.bb
├── u-boot-xlnx-dev.bb
├── u-boot-xlnx.inc
├── u-boot-zynq-scr
│ ├── boot.cmd.generic
│ ├── boot.cmd.qspi.versal
│ ├── boot.cmd.sd.versal
│ ├── boot.cmd.sd.zynq
│ ├── boot.cmd.sd.zynqmp
│ ├── boot.cmd.ubifs
│ └── pxeboot.pxe
├── u-boot-zynq-scr.bb
└── u-boot-zynq-uenv.bb
Customizing
We will create a directory structure matching this under the meta-user layer, as follows under <project>/project-spec/meta-user/recipes-bsp/u-boot
.
├── files
│ ├── bsp.cfg
│ └── platform-top.h
├── u-boot-xlnx_%.bbappend
├── u-boot-zynq-scr
│ └── boot.cmd.generic
└── u-boot-zynq-scr.bbappend
We copied the original boot script from the Yocto recipe (i.e. boot.cmd.generic in this case) and placed it under the u-boot-zynq-scr directory just created. The contents are now available in the user area to make any custom changes.
The u-boot-zynq-scr.bbappend is a simple script that overwrites the boot script in the original recipe with the local copy, and its contents are:
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI += "file://boot.cmd.generic"
The FILEEXTRAPATHS_prepend adds local files in this recipe to the original recipe, effectively overwriting (or adding) them. THISDIR is replaced with the current directory where the .bbappend resides, and PN is the package name, which in this case is u-boot-zynq-scr. This would be the directory location where the boot.cmd.generic file is searched.
Conclusion
Modifying the boot script is useful for custom boot procedures, such as mixed boot media or to handle fallback in case the U-Boot booting process fails to load a binary. In this post, we showed how to handle a custom U-Boot boot script modification using a Yocto BitBake append process.