#!/bin/ash
#
# swap_top:
# This script swaps the position primary and backup partition of the NAND
# part in u-boot.
#
# Usage: swap_top
#
# Jeffrey Panza
#

FW_SETENV=/usr/local/bin/fw_setenv
FW_PRINTENV=/usr/local/bin/fw_printenv
TMP_TINY=/tmp/tiny-rom.bin
TINY_PART=/dev/mtd0
SPI_ERASE=/usr/bin/flash_erase
SPI_WRITE=/usr/bin/flashcp
LOG=/var/log/messages
LAST_BYTE_INDEX=65535
PRIMARY_ROOTFS=/mnt/jffs2_rootfs_primary;
BACKUP_ROOTFS=/mnt/jffs2_rootfs_backup;
MTD0_SIZE=65536

#last_byte_ascii=$(tail -c 1 /dev/mtd0)
#last_byte=$(printf '%u' "'$last_byte_ascii")
#last_byte=$((~last_byte & 0xFF))
#last_byte_ascii=$(printf "\x$(printf %x $last_byte)")

ret=0

#Delete temp tiny, if available	
if [ -f $TMP_TINY ] ; then
    rm -f $TMP_TINY
fi

#Check for the availability of tiny rom in the partition
if [ ! -f $1 ]; then
    echo "$1 not present"
    exit 126;
fi

cp $1 $TMP_TINY
bin_size=$(wc -c < $TMP_TINY)
size_to_write=$(($LAST_BYTE_INDEX - $bin_size))

for i in `seq 1 $size_to_write` ; do
    printf '\xFF' >> $TMP_TINY
done

#curr_last_byte=$(printf '%X' "'$(dd if=$TINY_PART ibs=1 skip=$LAST_BYTE_INDEX)")
curr_last_byte=$(hexdump -n 1 -s $LAST_BYTE_INDEX -e '"%_u"' $TINY_PART)

#If current primary partition is set to "top"
if [ $curr_last_byte == "ff" -o $curr_last_byte == "FF" ] ; then
    printf '\xFE' >> $TMP_TINY
    PRIMARY_ROOTFS_PARTITION=/dev/mtd9
    PRIMARY_ROOTFS_BLOCK_PARTITION=/dev/mtdblock9
    BACKUP_ROOTFS_PARTITION=/dev/mtd7
    BACKUP_ROOTFS_BLOCK_PARTITION=/dev/mtdblock7
else
    printf '\xFF' >> $TMP_TINY
    PRIMARY_ROOTFS_PARTITION=/dev/mtd7
    PRIMARY_ROOTFS_BLOCK_PARTITION=/dev/mtdblock7
    BACKUP_ROOTFS_PARTITION=/dev/mtd9
    BACKUP_ROOTFS_BLOCK_PARTITION=/dev/mtdblock9
fi

#Check file size before erasing
final_bin_size=$(wc -c < $TMP_TINY)
if [ $final_bin_size -ne $MTD0_SIZE ]
then
    echo "Tiny rom size ($final_bin_size) is not equal to mtd0 partition"
    rm -f $TMP_TINY
    exit 127;
fi	

$SPI_ERASE $TINY_PART >> $LOG 2>> $LOG
$SPI_WRITE $TMP_TINY $TINY_PART >> $LOG 2>> $LOG
if ! [ $? = 0 ] ; then
    echo "ERROR Flashing tiny rom image";
    rm -f $TMP_TINY
    exit 128;
fi

umount -f $PRIMARY_ROOTFS
umount -f $BACKUP_ROOTFS
mount -t jffs2 $PRIMARY_ROOTFS_BLOCK_PARTITION $PRIMARY_ROOTFS
mount -t jffs2 $BACKUP_ROOTFS_BLOCK_PARTITION $BACKUP_ROOTFS
mount -o remount,ro -t jffs2 $PRIMARY_ROOTFS_PARTITION $PRIMARY_ROOTFS
mount -o remount,ro -t jffs2 $BACKUP_ROOTFS_PARTITION $BACKUP_ROOTFS

final=$?
if [ $final -ne "0" ] ; then
    ret=$final
fi

#Delete temp tiny at the end of FW update
if [ -f $TMP_TINY ] ; then
	rm -f $TMP_TINY
fi

exit $ret
