diff --git a/iopsys-brcm63xx-arm/base-files/lib/upgrade/platform.sh b/iopsys-brcm63xx-arm/base-files/lib/upgrade/platform.sh index 17bf6a02a07db22a063ccc953c608c8640164977..fcb0c59417c5abf299a970dcc218ade161e9b031 100644 --- a/iopsys-brcm63xx-arm/base-files/lib/upgrade/platform.sh +++ b/iopsys-brcm63xx-arm/base-files/lib/upgrade/platform.sh @@ -2,14 +2,63 @@ platform_check_image() { iopsys_check_image $1 } +platform_compare_bootloader_version() { + # FIT image has newer bootloader than on flash => bootlaoder will be updated + # FIT image has same version or older version than on flash => bootloader will not be updated + # Bootloader does not have a version => version is 0 will get updated by new FIT image with a bootloader version + # FIT image does not have a bootloader in it or is old and does not have bootloader version => fit version is 0 and bootloader will not get updated. + # Bootloader does not have version and neither has the FIT-image => will not get updated (0 == 0) + + local iopsys_bootloader_version="0" + local fit_iopsys_bootloader_version="0" + local image images + + [ -z "$1" ] && return 1 + [ "$(get_root_device_type())" != "nand" ] && return 1 + + json_init + json_load "$(strings /dev/mtd1 | awk '/938f0820-2ffb-11e7-bbc9-2f21351ee6fb:/ {$1=""; print $0}' 2> /dev/null | head -n1 | awk '{$1=$1; print}')" + json_get_vars iopsys_bootloader_version + iopsys_bootloader_version=$((iopsys_bootloader_version)) + + images="$(fdtextract -l "$1" 2> /dev/null | awk '{print $2}' | xargs)" + for image in $images; do + if fdtextract -i "$image" -a iopsys_bootloader_version "$1" > /dev/null 2>&1; then + fit_iopsys_bootloader_version="$(fdtextract -i "$image" -a iopsys_bootloader_version "$1" 2> /dev/null)" + break + fi + done + fit_iopsys_bootloader_version=$((fit_iopsys_bootloader_version)) + + if [ "$fit_iopsys_bootloader_version" -gt "$iopsys_bootloader_version" ]; then + return 1 + else + return 0 + fi +} + platform_do_upgrade() { local image="$1" local status=0 + local skip_bootloader="" + + if ! platform_compare_bootloader_version "$1"; then + UPGRADE_OPT_FORCE_LOADER_UPGRADE=1 + log "sysupgrade" "Bootloader with newer version is available in FIT-image. Enabling bootloader upgrade." + fi + + [ -z "$UPGRADE_OPT_FORCE_LOADER_UPGRADE" ] && UPGRADE_OPT_FORCE_LOADER_UPGRADE=1 + if [ "$UPGRADE_OPT_FORCE_LOADER_UPGRADE" = "0" ]; then + skip_bootloader="-s" + log "sysupgrade" "Bootloader upgrade is disabled." + else + log "sysupgrade" "Bootloader upgrade is enabled." + fi iopsys_process_upgrade_bundle "$image" pre_upgrade || status=1 set -o pipefail - [ $status -eq 0 ] && bcm_flasher "$image" 2>&1 | log "sysupgrade" || status=$? + [ $status -eq 0 ] && bcm_flasher $skip_bootloader "$image" 2>&1 | log "sysupgrade" || status=$? log "sysupgrade" "bcm_flasher returned $status." set +o pipefail