#! /bin/bash
# Copyright (C) 2008 yajin (yajin@vm-kernel.org) - 2011 Yann Le Doare
#
# Put the u-boot,kernel and rootfs into nand flash image.
#
# bb_nandflash.sh  <u-boot-image>   <nandflashimage>  u-boot	
# bb_nandflash.sh  <kernel-image>   <nandflashimage>  kernel
# bb_nandflash.sh  <rootfs>   <nandflashimage>  rootfs
	
# We assume that rootfs image has oob info 
# while xloader u-boot and kernel image does not have oob info.

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

# Nand flash partitions
# 0x00000000-0x00040000 : "U-Boot" 
# 0x00040000-0x00060000 : "U-Boot Env" 
# 0x00060000-0x00560000 : "Kernel" 
# 0x00560000-0x10000000 : "rootfs" 

flash_page_size=512
flash_oob_size=16
flash_oob_size=0 # FIXME
flash_image_pages=131072

uboot_page_offset=0
kernel_page_offset=768
rootfs_page_offset=11008


flash_image_name=$2
xloader_image_name=$1
uboot_image_name=$1
kernel_image_name=$1
rootfs_image_name=$1

echo "flash image name:"$flash_image_name

#Mini2440 board's NAND flash is (64M bytes)
if [ ! -e "$2" ]; then
	echo $flash_image_name" does not exist.Create it!"
	echo -en \\0377\\0377\\0377\\0377\\0377\\0377\\0377\\0377 > .8b
	cat .8b .8b > .16b #OOB is 16 bytes
	cat .16b .16b >.32b
	cat .32b .32b >.64b 
	cat .64b .64b .64b .64b .64b .64b .64b .64b > .512b
	cat .512b .16b>.page  # A page is 512 bytes of data + 16bytes OOB
	cat .page .page .page .page .page .page .page .page >.8page
	cat .8page .8page .8page .8page .8page .8page .8page .8page >.block  # a block = 64 pages
	cat .block .block .block .block .block .block .block .block >.8block
	cat .8block .8block .8block .8block .8block .8block .8block .8block >.64block
	cat .64block .64block .64block .64block .64block .64block .64block .64block >.512block
	cat .512block .512block .512block .512block >$flash_image_name
	rm -rf .8b .16b .32b .64b .page .8page .64sec .block .8block .64block .512block 
fi
put_no_oob() 
{
	#echo $1
	#echo $2
	image_name=$1
	image_page_offset=$2
	image_len=`du -shb $image_name |awk '{print $1}'`
	image_pages=$[$image_len/512]

	if [ 0 -ne $[$image_len%$flash_page_size] ]; then
		image_pages=$[$image_pages+1]
	fi

	#echo $image_len
	#echo $image_pages
	i=0
	while  [ $i -lt $image_pages  ]
  do
  	#echo $i
  	out_offset=$[$image_page_offset+$i]
  	in_offset=$i
  	#echo "out_offset:"$out_offset
  	#echo "in_offset:"$in_offset
  	dd if=$image_name of=$flash_image_name conv=notrunc count=1 obs=$[$flash_page_size+$flash_oob_size] ibs=$flash_page_size  seek=$out_offset skip=$in_offset  
  	i=$[$i + 1]
	done	
}

put_uboot()
{
	echo "uboot image name:"$uboot_image_name
	put_no_oob $1 $uboot_page_offset
	echo "put u-boot into flash image done!"
}
put_kernel()
{
	echo "Linux kernel image name:"$kernel_image_name
	put_no_oob $1 $kernel_page_offset
	echo "put Linux kernel into flash image done!"
}
put_rootfs()
{
	echo "rootfs image name:"$rootfs_image_name
	put_no_oob $1 $rootfs_page_offset
	echo "put rootfs into flash image done!"
}
case "$3" in
	x-loader)
		put_xloader $1
		;;
	u-boot)
		put_uboot $1
		;;
	kernel)
		put_kernel $1
		;;
	rootfs)
		put_rootfs $1
		;;
	*)
		echo "Unknown partition $3"
		exit -1
esac











