From: Pierre-Loup GOSSE Date: Fri, 21 Nov 2025 08:49:17 +0000 (+0100) Subject: u-boot: make initial environment binary image X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cf11b14a4cfc0617f45f7cdb87d1dec4aa58e765;p=thirdparty%2Fopenembedded%2Fopenembedded-core.git u-boot: make initial environment binary image Build the U-Boot initial environment binary image if UBOOT_INITIAL_ENV_BINARY is set to "1". The environment partition size (in bytes, hexadecimal or decimal) must be defined using UBOOT_INITIAL_ENV_BINARY_SIZE. If U-Boot environment redundancy is enabled, UBOOT_INITIAL_ENV_BINARY_REDUND must be set to "1". The resulting binary can be flashed using WIC at the environment offset, overriding any existing environment if present, for example: part --source rawcopy --sourceparams="file=u-boot-initial-env-sd.bin" --ondisk sda --no-table --offset 4096 Signed-off-by: Pierre-Loup GOSSE Reviewed-by: Martin Schwan Signed-off-by: Mathieu Dubois-Briand Signed-off-by: Richard Purdie --- diff --git a/meta/classes-recipe/uboot-config.bbclass b/meta/classes-recipe/uboot-config.bbclass index fd6c045142..81057b5cad 100644 --- a/meta/classes-recipe/uboot-config.bbclass +++ b/meta/classes-recipe/uboot-config.bbclass @@ -71,6 +71,14 @@ UBOOT_ENV_BINARY ?= "${UBOOT_ENV}.${UBOOT_ENV_SUFFIX}" UBOOT_ENV_IMAGE ?= "${UBOOT_ENV}-${MACHINE}-${UBOOT_VERSION}.${UBOOT_ENV_SUFFIX}" UBOOT_ENV_SYMLINK ?= "${UBOOT_ENV}-${MACHINE}.${UBOOT_ENV_SUFFIX}" +# Enable the build of the U-Boot initial env binary image. The binary size is +# required (i.e. the U-Boot partition environment size). Since the environment +# layout with multiple copies is different, set UBOOT_INITIAL_ENV_BINARY_REDUND +# to "1" if the U-Boot environment redundancy is enabled. +UBOOT_INITIAL_ENV_BINARY ?= "0" +UBOOT_INITIAL_ENV_BINARY_SIZE ?= "" +UBOOT_INITIAL_ENV_BINARY_REDUND ?= "0" + # U-Boot EXTLINUX variables. U-Boot searches for /boot/extlinux/extlinux.conf # to find EXTLINUX conf file. UBOOT_EXTLINUX_INSTALL_DIR ?= "/boot/extlinux" @@ -100,6 +108,9 @@ UBOOT_DTB_BINARY ??= "" UBOOT_FIT_CHECK_SIGN ?= "uboot-fit_check_sign" python () { + if bb.utils.to_boolean(d.getVar('UBOOT_INITIAL_ENV_BINARY')) and d.getVar('UBOOT_INITIAL_ENV_BINARY_SIZE') == "": + bb.fatal("UBOOT_INITIAL_ENV_BINARY requires setting the U-Boot partition environment size with the UBOOT_INITIAL_ENV_BINARY_SIZE variable") + ubootmachine = d.getVar("UBOOT_MACHINE") ubootconfigflags = d.getVarFlags('UBOOT_CONFIG') ubootbinary = d.getVar('UBOOT_BINARY') diff --git a/meta/recipes-bsp/u-boot/u-boot.inc b/meta/recipes-bsp/u-boot/u-boot.inc index 16c9836508..ffa9ef2d59 100644 --- a/meta/recipes-bsp/u-boot/u-boot.inc +++ b/meta/recipes-bsp/u-boot/u-boot.inc @@ -4,6 +4,7 @@ PROVIDES = "virtual/bootloader" PACKAGE_ARCH = "${MACHINE_ARCH}" DEPENDS += "${@bb.utils.contains('UBOOT_ENV_SUFFIX', 'scr', 'u-boot-mkimage-native', '', d)}" +DEPENDS += "${@ 'u-boot-mkenvimage-native' if bb.utils.to_boolean(d.getVar('UBOOT_INITIAL_ENV_BINARY')) else ''}" inherit uboot-config uboot-extlinux-config uboot-sign deploy python3native kernel-arch @@ -104,6 +105,10 @@ uboot_compile_config () { if [ -n "${UBOOT_INITIAL_ENV}" ]; then oe_runmake -C ${S} O=${B}/${builddir} u-boot-initial-env cp ${B}/${builddir}/u-boot-initial-env ${B}/${builddir}/u-boot-initial-env-${type} + if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ] ; then + uboot_compile_initial_env_binary + cp ${B}/${builddir}/u-boot-initial-env.bin ${B}/${builddir}/u-boot-initial-env-${type}.bin + fi fi } @@ -123,7 +128,18 @@ uboot_compile () { # Generate the uboot-initial-env if [ -n "${UBOOT_INITIAL_ENV}" ]; then oe_runmake -C ${S} O=${B} u-boot-initial-env + if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ] ; then + uboot_compile_initial_env_binary + fi + fi +} + +uboot_compile_initial_env_binary() { + redund="" + if [ "${UBOOT_INITIAL_ENV_BINARY_REDUND}" = "1" ] ; then + redund="-r" fi + uboot-mkenvimage -s ${UBOOT_INITIAL_ENV_BINARY_SIZE} ${redund} -o ${B}/${builddir}/u-boot-initial-env.bin ${B}/${builddir}/u-boot-initial-env } do_install () { @@ -388,9 +404,16 @@ uboot_deploy_config () { # Deploy the uboot-initial-env if [ -n "${UBOOT_INITIAL_ENV}" ]; then install -D -m 644 ${B}/${builddir}/u-boot-initial-env-${type} ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION} + if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then + install -D -m 644 ${B}/${builddir}/u-boot-initial-env-${type}.bin ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION}.bin + fi cd ${DEPLOYDIR} ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}-${MACHINE}-${type} ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}-${type} + if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then + ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}.bin + ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}-${type}.bin + fi fi } @@ -405,9 +428,16 @@ uboot_deploy () { # Deploy the uboot-initial-env if [ -n "${UBOOT_INITIAL_ENV}" ]; then install -D -m 644 ${B}/u-boot-initial-env ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION} + if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then + install -D -m 644 ${B}/u-boot-initial-env.bin ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}.bin + fi cd ${DEPLOYDIR} ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}-${MACHINE} ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION} ${UBOOT_INITIAL_ENV} + if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then + ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}-${MACHINE}.bin + ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}.bin + fi fi }