Files
meta-st-stm32mp/classes/image_types-stubi.bbclass
T
Romuald JEANNE 8b4fbbadbc CLASSES: IMAGE_TYPES-STUBI: set empty UBI volume and fix
- manage empty UBI volume for multivolume UBI
Add new parameter to allow to add empty UBI volume when creating the
multivolume UBI.
User just need to provide new volume name and size.

- clean temporary file to avoid issue while deploying to image
If we keep the temporary cfg file for empty UBI volume, we have an issue
when bitbake deploy artifacts to DEPLOYDIR_IMAGE when a different image
has been already built as files have the same name.
As we're using this cfg file as a temporary step for multi-volume cfg, we
can remove them instead of deploying them.

- manage extra_space on UBI volume for bad blocks management

Change-Id: If7ef9a66fb058cdaf0d77a22ca0be70fa05fca6f
Signed-off-by: Romuald JEANNE <romuald.jeanne@st.com>
2019-10-09 10:58:31 +02:00

164 lines
8.3 KiB
Plaintext

inherit image_types
do_image_stmultiubi[depends] += "mtd-utils-native:do_populate_sysroot"
python stmultiub_environment () {
if d.getVar('MULTIUBI_BUILD'):
try:
f =open( ("%s/stmultiubi_environment" % d.getVar('T')), 'w')
for build in d.getVar('MULTIUBI_BUILD').split():
f.write( "export MKUBIFS_ARGS_%s=\"%s\"\n" % (build, d.getVar(('MKUBIFS_ARGS_' + build))) )
f.write( "export UBINIZE_ARGS_%s=\"%s\"\n" % (build, d.getVar(('UBINIZE_ARGS_' + build))) )
f.write( "export EXTRA_UBIFS_SIZE_%s=\"%s\"\n" % (build, d.getVar(('EXTRA_UBIFS_SIZE_' + build))) )
f.close()
except:
pass
}
IMAGE_PREPROCESS_COMMAND += "stmultiub_environment;"
IMAGE_CMD_stmultiubi () {
. ${T}/stmultiubi_environment
# Split MKUBIFS_ARGS_<name> and UBINIZE_ARGS_<name>
for name in ${MULTIUBI_BUILD}; do
eval local mkubifs_args=\"\$MKUBIFS_ARGS_${name}\"
eval local ubinize_args=\"\$UBINIZE_ARGS_${name}\"
multiubi_mkfs "${mkubifs_args}" "${ubinize_args}" "${name}"
cd ${IMGDEPLOYDIR}
if [ -e ubinize_${name}-${IMAGE_NAME}.cfg ]; then
# Set correct name for cfg file to allow automatic cleanup
mv ubinize_${name}-${IMAGE_NAME}.cfg ${IMAGE_NAME}_${name}.ubinize.cfg.ubi
# Create symlinks
ln -sf ${IMAGE_NAME}_${name}.ubinize.cfg.ubi ${IMAGE_LINK_NAME}_${name}.ubinize.cfg.ubi
fi
cd -
done
}
ENABLE_MULTIVOLUME_UBI ?= "1"
st_multivolume_ubifs() {
# This function depends on IMAGE_FSTYPES 'stmultiubi'
if [ "${@bb.utils.contains('IMAGE_FSTYPES', 'stmultiubi', '1', '0', d)}" != "1" ]; then
return
fi
if [ "${ENABLE_MULTIVOLUME_UBI}" != "1" ]; then
return
fi
# -----------------------------------------------------------------------------
# Define the list of volumes for the multi UBIFS with 'STM32MP_UBI_VOLUME' var.
# The format to follow is:
# STM32MP_UBI_VOLUME = "<VOL_NAME_1>:<VOL_SIZE_1>:<VOL_TYPE_1> <VOL_NAME_2>:<VOL_SIZE_2>"
# Note that:
# - 'VOL_NAME' should follow 'IMAGE_LINK_NAME' format
# - 'VOL_SIZE' is set in KiB
# - 'VOL_TYPE' is optional part and could be 'empty' to add empty UBI with name 'VOL_NAME'
# -----------------------------------------------------------------------------
# We check that user as explicitly provided multi volume UBIFS var
# and that partition images are also provided
if [ -n "${STM32MP_UBI_VOLUME}" ] && [ -n "${PARTITIONS_IMAGE}" ]; then
# We should only generate multi volume UBIFS for rootfs image and not
# any of the partition image one
for partition in ${PARTITIONS_IMAGE}; do
[ "${partition}-${DISTRO}-${MACHINE}" = "${IMAGE_LINK_NAME}" ] && return
done
. ${T}/stmultiubi_environment
# Get total volume number to handle
volume_nbr="$(echo ${STM32MP_UBI_VOLUME} | wc -w)"
for name in ${MULTIUBI_BUILD}; do
# Init extra_size for UBIFS volume size
eval local extra_size=\"\$EXTRA_UBIFS_SIZE_${name}\"
# Init var to populate 'vol_id' incrementally
volume_id=0
for ubivolume in ${STM32MP_UBI_VOLUME}; do
# Init UBI volume information
if [ -z "$(echo ${ubivolume} | grep ':')" ]; then
bbfatal "Missing ':' separator between UBI volume name and UBI volume size '${ubivolume}'"
fi
volume_name=$(echo ${ubivolume} | cut -d':' -f1)
volume_size=$(echo ${ubivolume} | cut -d':' -f2)
volume_type=$(echo ${ubivolume} | cut -d':' -f3)
bbnote "Original UBI volume size: ${volume_size}"
# Manage specific UBI volume type
if [ "${volume_type}" = "empty" ]; then
bbnote "The UBI volume type is set to 'empty' for ${volume_name}. Generate ubinize cfg file for empty UBI volume."
cfg_filename=${IMGDEPLOYDIR}/${volume_name}_${name}.ubinize.cfg.ubi
echo \[${volume_name}\] > ${cfg_filename}
echo mode=ubi >> ${cfg_filename}
echo vol_id=0 >> ${cfg_filename}
echo vol_type=dynamic >> ${cfg_filename}
echo vol_name=${volume_name} >> ${cfg_filename}
echo vol_flags=autoresize >> ${cfg_filename}
else
if [ -z "${volume_type}" ]; then
bbnote "The UBI volume type is not set. Use default configuration for ${volume_name}"
bbnote "Append ${extra_size}KiB extra space to UBIFS volume size"
volume_size=$(echo "${volume_size} + ${extra_size}" | bc)
else
bbwarn "The UBI volume type '${volume_type}' is not recognized. No specific action done for ${volume_name}"
fi
fi
bbnote "Computed UBI volume size: ${volume_size}"
# Set ubinize config file for current volume
if [ -e ${IMGDEPLOYDIR}/${volume_name}_${name}.ubinize.cfg.ubi ]; then
ubinize_cfg=${IMGDEPLOYDIR}/${volume_name}_${name}.ubinize.cfg.ubi
elif [ -e ${DEPLOY_DIR_IMAGE}/${volume_name}_${name}.ubinize.cfg.ubi ]; then
ubinize_cfg=${DEPLOY_DIR_IMAGE}/${volume_name}_${name}.ubinize.cfg.ubi
else
bbfatal "Can't find any '${name}' ubinize config file for ${volume_name} in ${IMGDEPLOYDIR} or ${DEPLOY_DIR_IMAGE} folders"
fi
# Create temporary copy of ubinize config file for update
cp ${ubinize_cfg} ${WORKDIR}/
# Update ubifs path in cfg file with DEPLOY_DIR_IMAGE to avoid issue with RM_WORK feature
if [ -e ${DEPLOY_DIR_IMAGE}/${volume_name}_${name}.ubinize.cfg.ubi ]; then
sed 's|^image=.*/\('"${volume_name}"'.*\.ubifs\)$|image='"${DEPLOY_DIR_IMAGE}"'/\1|' -i ${WORKDIR}/$(basename ${ubinize_cfg})
fi
# Update generic name in cfg file
sed 's|\[ubifs\]|\['"${volume_name}"'\]|' -i ${WORKDIR}/$(basename ${ubinize_cfg})
# Update volume id in cfg file
sed 's|vol_id=0|vol_id='"${volume_id}"'|' -i ${WORKDIR}/$(basename ${ubinize_cfg})
volume_id=$(expr ${volume_id} + 1)
# Replace 'vol_flags' entry with 'vol_size' one in cfg file except for last volume to allow proper autoresize
if [ "${volume_id}" -lt "${volume_nbr}" ]; then
sed 's|vol_flags=.*|vol_size='"${volume_size}KiB"'|' -i ${WORKDIR}/$(basename ${ubinize_cfg})
fi
# Increment volume id for next loop
# Append ubinize config file to multivolume one
cat ${WORKDIR}/$(basename ${ubinize_cfg}) >> ${IMGDEPLOYDIR}/${IMAGE_NAME}_${name}_multivolume.ubinize.cfg.ubi
# Clean temporary file
rm -f ${WORKDIR}/$(basename ${ubinize_cfg})
# Clean also temporary ubinize cfg file for empty UBI volume
[ "${volume_type}" = "empty" ] && rm -f ${cfg_filename}
done
# Generate multivolume UBI
eval local ubinize_args=\"\$UBINIZE_ARGS_${name}\"
ubinize -o ${IMGDEPLOYDIR}/${IMAGE_NAME}_${name}_multivolume${IMAGE_NAME_SUFFIX}.ubi ${ubinize_args} ${IMGDEPLOYDIR}/${IMAGE_NAME}_${name}_multivolume.ubinize.cfg.ubi
# Create own symlinks for 'named' volumes
cd ${IMGDEPLOYDIR}
if [ -e ${IMAGE_NAME}_${name}_multivolume${IMAGE_NAME_SUFFIX}.ubi ]; then
ln -sf ${IMAGE_NAME}_${name}_multivolume${IMAGE_NAME_SUFFIX}.ubi ${IMAGE_LINK_NAME}_${name}_multivolume.ubi
ln -sf ${IMAGE_NAME}_${name}_multivolume.ubinize.cfg.ubi ${IMAGE_LINK_NAME}_${name}_multivolume.ubinize.cfg.ubi
fi
cd -
# Cleanup also DEPLOY_DIR_IMAGE from any other ubi artifacts
# This avoid duplicating data in DEPLOY_DIR_IMAGE
rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}-*_${name}_multivolume${IMAGE_NAME_SUFFIX}.ubi
rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}-*_${name}_multivolume.ubinize.cfg.ubi
done
fi
}
IMAGE_POSTPROCESS_COMMAND += " st_multivolume_ubifs ;"