linuxOS_AP06/device/rockchip/common/scripts/mk-updateimg.sh
2025-06-03 12:28:32 +08:00

248 lines
5.5 KiB
Bash
Executable File

#!/bin/bash -e
RK_PACK_TOOL_DIR="$RK_SDK_DIR/tools/linux/Linux_Pack_Firmware/rockdev"
gen_package_file()
{
TYPE="${1:-update}"
PARAMETER="${2:-parameter.txt}"
PKG_FILE="${3:-package-file}"
if [ ! -r "$PARAMETER" ]; then
error "Unable to parse $PARAMETER"
exit 1
fi
{
echo -e "# NAME\tPATH"
echo -e "package-file\tpackage-file"
echo -e "parameter\tparameter.txt"
} > "$PKG_FILE"
if [ "$TYPE" = template -o -r MiniLoaderAll.bin ]; then
echo -e "bootloader\tMiniLoaderAll.bin" >> "$PKG_FILE"
fi
for part in $(rk_partition_parse_names "$PARAMETER"); do
if echo $part | grep -q "_b$"; then
# Not packing *_b partition for A/B OTA
if echo "$TYPE" | grep -wq "ab-ota"; then
continue
fi
fi
case $part in
backup)
echo -e "backup\tRESERVED" >> "$PKG_FILE"
continue
;;
system|system_[ab]) IMAGE=rootfs.img ;;
*_a) IMAGE="${part%_a}.img" ;;
*_b) IMAGE="${part%_b}.img" ;;
*) IMAGE="$part.img" ;;
esac
if [ "$TYPE" = template -o -r "$IMAGE" ]; then
echo -e "$part\t$IMAGE" >> "$PKG_FILE"
fi
done
}
do_build_updateimg()
{
check_config RK_UPDATE || false
TYPE="update${1:+-$1}"
OUT_DIR="$RK_OUTDIR/$TYPE"
IMAGE_DIR="$OUT_DIR/Image"
TARGET="$RK_FIRMWARE_DIR/$TYPE.img"
case "$TYPE" in
*ota*) PKG_FILE="$RK_OTA_PACKAGE_FILE" ;;
*) PKG_FILE="$RK_PACKAGE_FILE" ;;
esac
# Make sure that the basic firmwares are ready
if [ ! -r "$RK_FIRMWARE_DIR/parameter.txt" ]; then
notice "Basic firmwares are not ready, building it..."
RK_UPDATE= "$RK_SCRIPTS_DIR/mk-firmware.sh"
fi
# Make sure that the loader is ready
if [ ! -r "$RK_FIRMWARE_DIR/MiniLoaderAll.bin" ]; then
notice "Loader is not ready, building it..."
"$RK_SCRIPTS_DIR/mk-loader.sh"
fi
message "=========================================="
message " Start packing $TYPE image"
message "=========================================="
if [ "$RK_AB_UPDATE" ] && \
! rk_partition_parse_names | grep -qE "_a\>|_b\>"; then
warning "RK_AB_UPDATE enabled, without having A/B partitions!"
fi
rm -rf "$TARGET" "$OUT_DIR"
mkdir -p "$IMAGE_DIR"
cd "$IMAGE_DIR"
# Prepare images
ln -rsf "$RK_FIRMWARE_DIR"/* .
rm -f update.img
# Prepare package-file
if [ "$PKG_FILE" ]; then
PKG_FILE="$RK_CHIP_DIR/$PKG_FILE"
if [ ! -r "$PKG_FILE" ]; then
error "$PKG_FILE not exists!"
exit 1
fi
ln -rsf "$PKG_FILE" package-file
else
notice "Generating package-file for $TYPE:"
gen_package_file $TYPE
cat package-file
fi
notice "Packing $TARGET for $TYPE..."
if [ ! -r MiniLoaderAll.bin ]; then
error "MiniLoaderAll.bin is missing"
exit 1
fi
TAG=RK$(dd if=MiniLoaderAll.bin bs=1 count=4 skip=21 status=none | rev)
"$RK_PACK_TOOL_DIR/afptool" -pack ./ update.raw.img
"$RK_PACK_TOOL_DIR/rkImageMaker" -$TAG MiniLoaderAll.bin \
update.raw.img update.img -os_type:androidos \
${RK_UPDATE_STORAGE:+-storage:$RK_UPDATE_STORAGE}
ln -rsf "$IMAGE_DIR/package-file" "$OUT_DIR"
ln -rsf "$IMAGE_DIR/update.img" "$OUT_DIR"
ln -rsf "$IMAGE_DIR/update.img" "$TARGET"
if echo "$TYPE" | grep -wq "ab"; then
ln -sf "$(basename "$TARGET")" \
"$RK_FIRMWARE_DIR/${TYPE/-ab/}.img"
fi
case "$TYPE" in
*ota*) EDIT_CMD="edit-ota-package-file" ;;
*) EDIT_CMD="edit-package-file" ;;
esac
notice "\nRun 'make $EDIT_CMD' if you want to change the package-file.\n"
}
build_updateimg()
{
if [ "$RK_AB_UPDATE" ]; then
notice "Making A/B update image..."
do_build_updateimg ab
else
notice "Making update image..."
do_build_updateimg
fi
finish_build
}
build_ota_updateimg()
{
if [ "$RK_AB_UPDATE" ]; then
notice "Making A/B update image for OTA..."
do_build_updateimg ab-ota
else
notice "Making update image for OTA..."
do_build_updateimg ota
fi
finish_build
}
# Hooks
usage_hook()
{
usage_oneline "edit-package-file" "edit package-file"
usage_oneline "edit-ota-package-file" "edit package-file for OTA"
usage_oneline "updateimg" "build update image"
usage_oneline "ota-updateimg" "build update image for OTA"
}
clean_hook()
{
rm -rf "$RK_OUTDIR/*update*"
rm -rf "$RK_FIRMWARE_DIR/*update.img"
}
INIT_CMDS="edit-package-file edit-ota-package-file"
init_hook()
{
case "$1" in
edit-package-file)
BASE_CFG=RK_PACKAGE_FILE
PKG_FILE=package-file
;;
edit-ota-package-file)
BASE_CFG=RK_OTA_PACKAGE_FILE
PKG_FILE=ota-package-file
;;
*) return 0 ;;
esac
load_config $BASE_CFG
if ! check_config $BASE_CFG &>/dev/null; then
sed -i '/$BASE_CFG/d' "$RK_CONFIG"
echo "${BASE_CFG}_CUSTOM=y" >> "$RK_CONFIG"
echo "$BASE_CFG=\"$PKG_FILE\"" >> "$RK_CONFIG"
"$RK_SCRIPTS_DIR/mk-config.sh" olddefconfig &>/dev/null
"$RK_SCRIPTS_DIR/mk-config.sh" savedefconfig &>/dev/null
fi
}
PRE_BUILD_CMDS="edit-package-file edit-ota-package-file"
pre_build_hook()
{
case "$1" in
edit-package-file)
check_config RK_PACKAGE_FILE || false
PKG_FILE="$RK_CHIP_DIR/$RK_PACKAGE_FILE" ;;
edit-ota-package-file)
check_config RK_OTA_PACKAGE_FILE || false
PKG_FILE="$RK_CHIP_DIR/$RK_OTA_PACKAGE_FILE"
;;
*) return 0 ;;
esac
PKG_FILE="$(realpath -m "$PKG_FILE")"
if [ ! -r "$PKG_FILE" ]; then
notice "Generating template $PKG_FILE"
gen_package_file template \
"$RK_CHIP_DIR/$RK_PARAMETER" "$PKG_FILE"
fi
eval ${EDITOR:-vi} "$PKG_FILE"
finish_build $@
}
POST_BUILD_CMDS="updateimg ota-updateimg"
post_build_hook()
{
case "$1" in
updateimg) build_updateimg ;;
ota-updateimg) build_ota_updateimg ;;
*) usage ;;
esac
}
source "${RK_BUILD_HELPER:-$(dirname "$(realpath "$0")")/build-helper}"
case "$@" in
edit-*package-file)
init_hook $@
pre_build_hook $@
;;
*) post_build_hook ${@:-updateimg} ;;
esac