#! /bin/sh
# Copyright (C) 2008 OpenedHand Ltd.
# Contact: andrew@openedhand.com
#
# Erase the partition given in $3 (default: rootfs) and flash the contents
# of image given in $1 into the image $2.

if [ ! -r "$1" ]; then
	echo "Usage: $0 <image> <destimage> [<partition>]"
	exit -1
fi

uboot_offset=0
config_offset=64
kernel_offset=256
initfs_offset=1280
rootfs_offset=2304 # chinook

# This value should be selected for Diablo based firmwares
# It also require patching qemu to get proper size of flash partitions
# (by default qemu has Chinook split).
#rootfs_offset=3328 # diablo

if [ ! -e "$2" ]; then
        echo "foo"
	# Making an empty/erased flash image.  Need a correct echo behavior.
	dd if=/dev/zero of=$2 bs=268435456 count=0 seek=1
	bash -c 'echo -en \\0377\\0377\\0377\\0377\\0377\\0377\\0377\\0377 > .8b'
	cat .8b .8b > .16b # OOB is 16 bytes
	cat .16b .16b .16b .16b .16b .16b .16b .16b > .8sec
	cat .8sec .8sec .8sec .8sec .8sec .8sec .8sec .8sec > .64sec
	cat .64sec .64sec .64sec .64sec .64sec .64sec .64sec .64sec > .512sec
	cat .512sec .512sec .512sec .512sec > .2ksec
	cat .2ksec .2ksec .2ksec .2ksec .2ksec .2ksec .2ksec .2ksec > .16k
	cat .16k .16k .16k .16k .16k .16k .16k .16k > .128k
	# N800 NAND is 512k sectors big
	cat  .128k .128k .128k .128k >> $2
	rm -rf .8b .16b .8sec .64sec .512sec .2ksec .16k .128k
fi

if [ "$3" != "" ]; then
	case "$3" in
	config)
		partition=/dev/mtd1
		page=$config_offset
		;;
	initfs)
		partition=/dev/mtd3
		page=$initfs_offset
		;;
	rootfs)
		partition=/dev/mtd4
		page=$rootfs_offset
		;;
	*)
		echo "Unknown partition $2"
		exit -1
	esac
else
	partition=/dev/mtd4
	page=$rootfs_offset
fi

dd if=$1 of=$2 conv=notrunc bs=2048 seek=$page
