From 96d31f857d4c33070d84d0fd9a5f143dbd48f4c5 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 21 Nov 2014 01:23:28 +0100 Subject: [PATCH] Add u-boot-update script, used in last release, in dedicated OpenWrt BB images --- target_util/u-boot-upgrade | 254 +++++++++++++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100755 target_util/u-boot-upgrade diff --git a/target_util/u-boot-upgrade b/target_util/u-boot-upgrade new file mode 100755 index 0000000..cb8bbdd --- /dev/null +++ b/target_util/u-boot-upgrade @@ -0,0 +1,254 @@ +#!/bin/sh + +#================================================== +# Name: u-boot-upgrade +# Purpose: Update U-Boot partition using mtd tool +# +# Author: Piotr Dymacz +# Copyright: Copyright (C) 2014 Piotr Dymacz +# Created: 2014-11-19 +#================================================== + + MTD_DEVICE="mtd0" + NEW_UBOOT_DIR="/etc/u-boot_mod" + NEW_UBOOT_FNAME= +MTD_BACKUP_FNAME="mtd0_backup.bin" + +echo_info() { + echo -e "[\e[93minfo\e[0m] $1" +} + +echo_err() { + echo -e "[\e[31merro\e[0m] $1" +} + +echo_ok() { + echo -e "[\e[92m ok \e[0m] $1" +} + +show_disclaimer() { + local answer + + echo "" + echo "=================================================================" + echo -e " \e[93mDISCLAIMER: you are using this script at your own risk!\e[0m" + echo "" + echo " The author of U-Boot modification and this script takes" + echo " no responsibility for any of the results of using them." + echo "" + echo -e " \e[31mUpdating U-Boot is a very dangerous operation" + echo -e " and may damage your device! You have been warned!\e[0m" + echo "=================================================================" + read -p " Are you sure you want to continue (type 'yes' or 'no')? " answer + + while true; do + case $answer in + yes) + echo "=================================================================" + echo "" + break + ;; + no) + exit 0 + ;; + *) + read -p " Please, type 'yes' or 'no': " answer + ;; + esac + done +} + +find_new_uboot_file() { + local answer + local filesqty + local new_ubot_md5 + + if [ ! -d $NEW_UBOOT_DIR ]; then + echo_err "Directory $NEW_UBOOT_DIR does not exist" + exit 1 + fi + + cd $NEW_UBOOT_DIR 2>/dev/null + if [ $? -ne 0 ]; then + echo_err "Could not change directory to $NEW_UBOOT_DIR" + exit 1 + fi + + filesqty=`ls -1 | grep "\.bin" | wc -l` + + if [ $filesqty -eq 0 ]; then + echo_err "Could not find any binary file in $NEW_UBOOT_DIR" + exit 1 + fi + + if [ $filesqty -gt 1 ]; then + echo_err "Found more than one binary file in $NEW_UBOOT_DIR" + exit 1 + fi + + NEW_UBOOT_FNAME=`ls -1 | grep "\.bin"` + new_ubot_md5="`basename $NEW_UBOOT_FNAME .bin`.md5" + + if [ ! -e $new_ubot_md5 ]; then + echo_err "Checksum file $new_ubot_md5 does not exist" + exit 1 + fi + + echo_ok "Found U-Boot image file: $NEW_UBOOT_FNAME" + read -p " Do you want to use this file (type 'yes' or 'no')? " answer + + while true; do + case $answer in + yes) + break + ;; + no) + exit 0 + ;; + *) + read -p " Please, type 'yes' or 'no': " answer + ;; + esac + done + + md5sum -cs $new_ubot_md5 &>/dev/null + if [ $? -ne 0 ]; then + echo_err "MD5 checksum of new U-Boot image file is wrong" + exit 1 + fi + + echo_ok "MD5 checksum of new U-Boot image file is correct" +} + +backup_mtd_zero() { + local answer + + if [ ! -c /dev/$MTD_DEVICE ]; then + echo_err "Device /dev/$MTD_DEVICE does not exist" + exit 1 + fi + + cd /tmp 2>/dev/null + if [ $? -ne 0 ]; then + echo_err "Could not change directory to /tmp" + exit 1 + fi + + if [ -e $MTD_BACKUP_FNAME ]; then + rm -f $MTD_BACKUP_FNAME 2>/dev/null + fi + + dd if=/dev/$MTD_DEVICE of=$MTD_BACKUP_FNAME &>/dev/null + if [ $? -ne 0 ]; then + echo_err "Could not backup /dev/$MTD_DEVICE" + exit 1 + fi + + echo_ok "Backup of /dev/$MTD_DEVICE successfully created" + read -p " Do you want to store backup in $NEW_UBOOT_DIR/backup/ (recommended, type 'yes' or 'no')? " answer + + while true; do + case $answer in + yes) + cp -f $MTD_BACKUP_FNAME $NEW_UBOOT_DIR/backup/$MTD_BACKUP_FNAME &>/dev/null + if [ $? -ne 0 ]; then + echo_err "Could not copy backup file $MTD_BACKUP_FNAME to $NEW_UBOOT_DIR/backup/" + exit 1 + fi + + echo_ok "Backup of /dev/$MTD_DEVICE successfully copied to $NEW_UBOOT_DIR/backup/" + break + ;; + no) + break + ;; + *) + read -p " Please, type 'yes' or 'no': " answer + ;; + esac + done +} + +combine_images() { + local new_size + local old_size + + new_size=`wc -c $NEW_UBOOT_DIR/$NEW_UBOOT_FNAME | awk '{print $1}'` + old_size=`wc -c /tmp/$MTD_BACKUP_FNAME | awk '{print $1}'` + + if [ "x$old_size" = "x" ] || \ + [ "x$new_size" = "x" ]; then + echo_err "Could not get size of new U-Boot image and/or backup file" + exit 1 + fi + + # Allow to use only images not bigger than mtd0 size + if [ $new_size -gt $old_size ]; then + echo_err "New U-Boot image size ($new_size bytes) is bigger than $MTD_DEVICE partition size ($old_size bytes)" + exit 1 + fi + + dd if=$NEW_UBOOT_DIR/$NEW_UBOOT_FNAME of=/tmp/$MTD_BACKUP_FNAME conv=notrunc &>/dev/null + if [ $? -ne 0 ]; then + echo_err "Could not combine new U-Boot image with backup file" + exit 1 + fi + + echo_ok "New U-Boot image successfully combined with backup file" +} + +write_new_image() { + local answer + local verify_result + + echo_info "New U-Boot image is ready to be written into FLASH" + read -p " Are you sure you want to continue (type 'yes' or 'no')? " answer + + while true; do + case $answer in + yes) + break + ;; + no) + exit 0 + ;; + *) + read -p " Please, type 'yes' or 'no': " answer + ;; + esac + done + + # Erase mtd0 and write new image... + mtd -e /dev/$MTD_DEVICE write /tmp/$MTD_BACKUP_FNAME /dev/$MTD_DEVICE &>/dev/null + if [ $? -ne 0 ]; then + echo_err "FATAL ERROR: could not write new U-Boot image into FLASH" + echo_err "DO NOT RESET YOUR DEVICE NOW AND TRY AGAIN!" + exit 1 + fi + + echo_ok "New U-Boot image successfully witten info FLASH" + + # Verify MD5 of mtd0 and prepared image + verify_result=`mtd verify /tmp/$MTD_BACKUP_FNAME /dev/$MTD_DEVICE 2>&1 | grep "Success"` + if [ "x$verify_result" = "x" ]; then + echo_err "FATAL ERROR: MD5 checksum of $MTD_DEVICE and new U-Boot image are not equal" + echo_err "DO NOT RESET YOUR DEVICE NOW AND TRY AGAIN!" + exit 1 + fi + + echo_ok "MD5 checksum of $MTD_DEVICE and new U-Boot image are equal" + + echo_info "Done!" +} + +#====================== +# Execution begins here +#====================== + +show_disclaimer +find_new_uboot_file +backup_mtd_zero +combine_images +write_new_image + +exit 0 -- 2.25.1