enable stored U-Boot environment

U-Boot has the ability to store its environment variables to a permanent
storage device. Whether or not it does so for any one specific device
depends on whatever settings are enabled in that specific device's
defconfig. In order to definitively configure U-Boot to be able to store
its environment into the device from which it boots, for any device
supported in this BSP, simply add the following to MACHINE_FEATURES:

	rk-u-boot-env

If enabled, there is now a second choice to make: should the build also
include the U-Boot environment in the image or not? The default environment,
as generated by U-Boot, can be included in the generated wic image. If it
is included, then flashing the image will also flash the default U-Boot
environment variables and settings, wiping out anything that might have been
there already. If it is not included then your device will either continue
using whatever environment happens to be there (if valid), or will not use any
stored environment if the stored environment has not been set or is invalid.
The variable which governs this behaviour is:

	RK_IMAGE_INCLUDES_UBOOT_ENV

By default this is set to "0", meaning that by default the image does not
contain the U-Boot environment. To enable this behaviour, enable this
variable. This variable only takes effect if rk-u-boot-env is listed in
MACHINE_FEATURES, and has no effect otherwise.

The script:

	scripts/dump-uboot-env-from-yocto-image.sh

can be used on a rockchip wic image to see the contents of the U-Boot
environment partition at build time.

Tested by booting the same image on both eMMC and SDcard with the following
devices, verifying the ability to read and write the U-Boot environment in
both U-Boot and Linux user-space, and that changes made in one are seen in the
other:
	rock-3a
	rock-5a
	rock-5b
	rock-pi-4b
	rock-pi-e
	rock64

Signed-off-by: Trevor Woerner <twoerner@gmail.com>
This commit is contained in:
Trevor Woerner 2024-04-22 12:08:32 -04:00
parent 88f2064ca2
commit 1f8a8d917b
8 changed files with 112 additions and 2 deletions

20
README
View File

@ -67,6 +67,26 @@ Notes:
in the configuration (e.g. conf/local.conf).
U-Boot Environment:
------------------
In order to configure U-Boot to be able to store its environment into the
device from which it was booted, for any device supported in this BSP,
simply add the following to MACHINE_FEATURES:
rk-u-boot-env
If enabled, to additionally have the U-Boot environment generated and
stored in the image, also enable the following variable (default: off):
RK_IMAGE_INCLUDES_UBOOT_ENV
The script:
scripts/dump-uboot-env-from-yocto-image.sh
can be used on a rockchip wic image to see the contents of the U-Boot
environment partition at build time.
Maintenance:
-----------
Please send pull requests, patches, comments, or questions to the

View File

@ -0,0 +1,4 @@
# 'rk-u-boot-env' indicates the user wants to be able to save their U-Boot
# environment back to the drive from which the device was booted
MACHINEOVERRIDES .= "${@bb.utils.contains('MACHINE_FEATURES', 'rk-u-boot-env', ':rk-u-boot-env', '', d)}"
IMAGE_INSTALL:append:rk-u-boot-env = " u-boot-fw-utils u-boot-env"

View File

@ -1,6 +1,7 @@
# common meta-rockchip wic/wks items
require conf/machine/include/rockchip-extlinux.inc
require conf/machine/include/rockchip-rk-u-boot-env.inc
SPL_BINARY ?= "idbloader.img"
@ -11,7 +12,13 @@ WKS_FILE_DEPENDS ?= " \
virtual/bootloader \
"
RK_IMAGE_INCLUDES_UBOOT_ENV ?= "no"
RK_UBOOT_ENV = " "
RK_UBOOT_ENV:rk-u-boot-env = "${@ '--source rawcopy --sourceparams=file=u-boot.env' \
if bb.utils.to_boolean(d.getVar('RK_IMAGE_INCLUDES_UBOOT_ENV'), False) else ' '}"
WICVARS:append = " \
RK_UBOOT_ENV \
SPL_BINARY \
UBOOT_SUFFIX \
"

View File

@ -16,4 +16,3 @@ UBOOT_MACHINE = "rock2_defconfig"
# image class
IMAGE_FSTYPES += "rockchip-gpt-img"
IMAGE_CLASSES += "rockchip-gpt-img"

View File

@ -0,0 +1,6 @@
CONFIG_ENV_SIZE=0x8000
CONFIG_ENV_OFFSET=0x3f8000
# CONFIG_ENV_IS_NOWHERE is not set
CONFIG_ENV_IS_IN_MMC=y
CONFIG_DM_SEQ_ALIAS=y
CONFIG_SPL_DM_SEQ_ALIAS=y

View File

@ -1,7 +1,13 @@
FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
SRC_URI:append:rk-u-boot-env = " file://rockchip-enable-environment-mmc.cfg"
SRCREV:rk-u-boot-env = "cdfcc37428e06f4730ab9a17cc084eeb7676ea1a"
# various machines require the pyelftools library for parsing dtb files
DEPENDS:append = " python3-pyelftools-native"
DEPENDS:append:rk3308 = " u-boot-tools-native"
DEPENDS:append:rock-pi-4 = " gnutls-native"
DEPENDS:append:rk-u-boot-env = " u-boot-mkenvimage-native"
EXTRA_OEMAKE:append:px30 = " BL31=${DEPLOY_DIR_IMAGE}/bl31-px30.elf"
EXTRA_OEMAKE:append:rk3308 = " \
@ -34,3 +40,42 @@ do_compile:append:rock2-square () {
cp ${B}/spl/${SPL_BINARY} ${B}
fi
}
python rk_no_env() {
if bb.utils.contains('MACHINE_FEATURES', 'rk-u-boot-env', True, False, d):
bb.warn("the rk-u-boot-env MACHINE_FEATURE is not supported for this build")
}
rk_generate_env() {
if [ ! -f "${B}/.config" ]; then
echo "U-Boot .config not found, can't determine environment size"
return 1
fi
cat ${B}/.config | grep "^CONFIG_ENV_SIZE=" > /dev/null
if [ $? -ne 0 ]; then
echo "can not find CONFIG_ENV_SIZE value in U-Boot .config"
return 1
fi
UBOOT_ENV_SIZE="$(cat ${B}/.config | grep "^CONFIG_ENV_SIZE=" | cut -d'=' -f2)"
# linux user-space U-Boot env config file
echo "/dev/disk/by-partlabel/uboot_env 0x0000 ${UBOOT_ENV_SIZE}" > ${WORKDIR}/fw_env.config
# convert text-based environment to binary suitable for image
if [ "${@bb.utils.to_boolean(d.getVar('RK_IMAGE_INCLUDES_UBOOT_ENV'), False)}" = "True" ]; then
if [ ! -f ${B}/u-boot-initial-env ]; then
echo "initial, text-formatted U-Boot environment file \"${B}/u-boot-initial-env\" not found"
return 1
fi
mkenvimage -s ${UBOOT_ENV_SIZE} ${B}/u-boot-initial-env -o ${WORKDIR}/u-boot.env
fi
}
do_compile[postfuncs] += "${@'rk_generate_env' if 'rk-u-boot-env' in d.getVar('MACHINEOVERRIDES').split(':') else 'rk_no_env'}"
do_deploy:append:rk-u-boot-env() {
if [ -f ${WORKDIR}/u-boot.env -a "${@bb.utils.to_boolean(d.getVar('RK_IMAGE_INCLUDES_UBOOT_ENV'),False)}" = "True" ]; then
install -d ${DEPLOYDIR}
install -m 0644 ${WORKDIR}/u-boot.env ${DEPLOYDIR}
fi
}

View File

@ -0,0 +1,29 @@
#/bin/bash
# SPDX-License-Identifier: OSL-3.0
#
# a program that can take a wic file and dump out the contents
# of the U-Boot environment in canonical hex+ascii format
# (assuming the "rockchip" layout specified in this layer's wic file)
# check for programs
check_pgm() {
$1 --help > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "required program \"$1\" not found"
exit 1
fi
}
check_pgm dd
check_pgm hexdump
if [ $# -ne 1 ]; then
echo "required param missing: yocto wic image"
exit 1
fi
if [ ! -f "$1" ]; then
echo "specified file \"$1\" not found"
exit 1
fi
SKIP=$(( 8128 * 512 ))
dd if="$1" ibs=1 skip=$SKIP count=32k 2> /dev/null | hexdump -C

View File

@ -22,7 +22,7 @@ part loader1 --offset 64s --fixed-size 3552K --fstype=none --part-name load
part v_storage --offset 7168s --fixed-size 256K --fstype=none --part-name v_storage
part reserved --offset 7680s --fixed-size 192K --fstype=none --part-name reserved
part reserved1 --offset 8064s --fixed-size 32K --fstype=none --part-name reserved1
part uboot_env --offset 8128s --fixed-size 32K --fstype=none --part-name uboot_env
part uboot_env --offset 8128s --fixed-size 32K --fstype=none --part-name uboot_env ${RK_UBOOT_ENV}
part reserved2 --offset 8192s --fixed-size 4096K --fstype=none --part-name reserved2
part loader2 --offset 16384s --fixed-size 4096K --fstype=none --part-name loader2 --source rawcopy --sourceparams="file=u-boot.${UBOOT_SUFFIX}"
part atf --offset 24576s --fixed-size 4096K --fstype=none --part-name atf