#!/bin/sh
TOPDIR=`pwd`

[ -f ${TOPDIR}/.config ] || {
	echo "Please execute ./change_model [model] to select a model first"
	exit 0
}

# Model
cat ${TOPDIR}/.config | grep CONFIG_PACKAGE_V3900=y > /dev/null
RETURN_VALUE=$?
if [ "$RETURN_VALUE" = "0" ]
then
	echo "Model=V3900"
	CONFIG_FILE=config-V3900
	MACHINE_TYPE_FW=39000
	MACHINE_TYPE_FW_RST=39010
	MACHINE_TYPE_BL=39001
	BUILD_FW_NAME=V3K9.all
	BUILD_FW_NAME_RST=V3K9.rst
	BUILD_BL_NAME=V3K9BL.all
fi
cat ${TOPDIR}/.config | grep CONFIG_PACKAGE_V2960=y > /dev/null
RETURN_VALUE=$?
if [ "$RETURN_VALUE" = "0" ]
then
	echo "Model=V2960"
	CONFIG_FILE=config-V2960
	MACHINE_TYPE_FW=X2000
	MACHINE_TYPE_FW_RST=X2010	
	MACHINE_TYPE_FW_CX2=X2100
	MACHINE_TYPE_BL=X2001
	BUILD_FW_NAME=V2960.all
	BUILD_FW_NAME_RST=V2960.rst	
	BUILD_FW_NAME_CX2=V2960.cx2
	BUILD_BL_NAME=V2960BL.all
fi
cat ${TOPDIR}/.config | grep CONFIG_PACKAGE_V300B=y > /dev/null
RETURN_VALUE=$?
if [ "$RETURN_VALUE" = "0" ]
then
	echo "Model=V300B"
	CONFIG_FILE=config-V300B
	MACHINE_TYPE_FW=V3000
	MACHINE_TYPE_FW_RST=V3010
	MACHINE_TYPE_FW_CV3=V3100
	MACHINE_TYPE_BL=V3001
	BUILD_FW_NAME=V300B.all
	BUILD_FW_NAME_RST=V300B.rst
	BUILD_FW_NAME_CV3=V300B.cv3
	BUILD_BL_NAME=V300BBL.all
fi
if [ "$CONFIG_FILE" = "" ]
then
	echo "No model selected, please check .config file or execute ./change_model [model] again."
	exit 0
fi

# Set ubifs environment settings
if [ -f ${TOPDIR}/ubifs_args.ini ]
then
	rm -f ${TOPDIR}/ubifs_args_local.ini
	#[ -f ${TOPDIR}/ubifs_args_local.ini ] || {
		cp ${TOPDIR}/ubifs_args.ini ${TOPDIR}/ubifs_args_local.ini
		echo "image=${TOPDIR}/build_dir/linux-2.6-comcerto1000/root.ubifs-zlib" >> ${TOPDIR}/ubifs_args_local.ini
	#}
fi

# Build firmware image
make $1 $2 $3 FORCE=1 V=99 || exit

# copy fs file to bin if exist
if [ -f ${TOPDIR}/build_dir/linux-2.6-comcerto1000/root.jffs2-128k ]
then
	cp ${TOPDIR}/build_dir/linux-2.6-comcerto1000/root.jffs2-128k ${TOPDIR}/bin/root.jffs2-128k
fi
if [ -f ${TOPDIR}/build_dir/linux-2.6-comcerto1000/config.jffs2-128k ]
then
	cp ${TOPDIR}/build_dir/linux-2.6-comcerto1000/config.jffs2-128k ${TOPDIR}/bin/config.jffs2-128k
fi
if [ -f ${TOPDIR}/build_dir/linux-2.6-comcerto1000/root.ubifs-ubinized ]
then
	cp ${TOPDIR}/build_dir/linux-2.6-comcerto1000/root.ubifs-ubinized ${TOPDIR}/bin/root.ubifs-ubinized
fi
#if [ -f ${TOPDIR}/build_dir/linux-2.6-comcerto1000/root.squashfs ]
#then
#	cp ${TOPDIR}/build_dir/linux-2.6-comcerto1000/root.squashfs ${TOPDIR}/bin/root.squashfs
#fi

# Create .all file, insert CRC32 and MD5 checksum in header
if [ -f ${TOPDIR}/bin/root.ubifs-ubinized ]
then
	echo $MACHINE_TYPE_FW > ${TOPDIR}/bin/machine_type
	rm -rf ${TOPDIR}/bin/V3K9_unchecked.all
	cat ${TOPDIR}/bin/machine_type ${TOPDIR}/bin/root.ubifs-ubinized >${TOPDIR}/bin/V3K9_unchecked.all

	CHECK_SUM_MD5=
		eval `md5sum ${TOPDIR}/bin/V3K9_unchecked.all |
		awk '{
		print "CHECK_SUM_MD5=" $1}'`
	CHECK_SUM_CRC32=
		eval `${TOPDIR}/staging_dir/host/bin/mkcrc32 ${TOPDIR}/bin/V3K9_unchecked.all |
		awk '{
		print "CHECK_SUM_CRC32=" $1}'`

	echo $CHECK_SUM_MD5 > ${TOPDIR}/bin/checksum_md5
	echo $CHECK_SUM_CRC32 > ${TOPDIR}/bin/checksum_crc32

	rm -f ${TOPDIR}/bin/${BUILD_FW_NAME}
	cat ${TOPDIR}/bin/checksum_md5 ${TOPDIR}/bin/checksum_crc32 ${TOPDIR}/bin/V3K9_unchecked.all >${TOPDIR}/bin/${BUILD_FW_NAME}
	
	# .rst firmware
	echo $MACHINE_TYPE_FW_RST > ${TOPDIR}/bin/machine_type
	rm -rf ${TOPDIR}/bin/V3K9_unchecked.all
	cat ${TOPDIR}/bin/machine_type ${TOPDIR}/bin/root.ubifs-ubinized >${TOPDIR}/bin/V3K9_unchecked.all

	CHECK_SUM_MD5=
		eval `md5sum ${TOPDIR}/bin/V3K9_unchecked.all |
		awk '{
		print "CHECK_SUM_MD5=" $1}'`
	CHECK_SUM_CRC32=
		eval `${TOPDIR}/staging_dir/host/bin/mkcrc32 ${TOPDIR}/bin/V3K9_unchecked.all |
		awk '{
		print "CHECK_SUM_CRC32=" $1}'`

	echo $CHECK_SUM_MD5 > ${TOPDIR}/bin/checksum_md5
	echo $CHECK_SUM_CRC32 > ${TOPDIR}/bin/checksum_crc32

	rm -f ${TOPDIR}/bin/${BUILD_FW_NAME_RST}
	cat ${TOPDIR}/bin/checksum_md5 ${TOPDIR}/bin/checksum_crc32 ${TOPDIR}/bin/V3K9_unchecked.all >${TOPDIR}/bin/${BUILD_FW_NAME_RST}
	
	# .cx2 firmware
	cat ${TOPDIR}/.config | grep CONFIG_PACKAGE_V2960=y > /dev/null
	RETURN_VALUE=$?
	if [ "$RETURN_VALUE" = "0" ]
	then
		echo $MACHINE_TYPE_FW_CX2 > ${TOPDIR}/bin/machine_type
		rm -rf ${TOPDIR}/bin/V3K9_unchecked.all
		cat ${TOPDIR}/bin/machine_type ${TOPDIR}/bin/root.ubifs-ubinized >${TOPDIR}/bin/V3K9_unchecked.all

		CHECK_SUM_MD5=
			eval `md5sum ${TOPDIR}/bin/V3K9_unchecked.all |
			awk '{
			print "CHECK_SUM_MD5=" $1}'`
		CHECK_SUM_CRC32=
			eval `${TOPDIR}/staging_dir/host/bin/mkcrc32 ${TOPDIR}/bin/V3K9_unchecked.all |
			awk '{
			print "CHECK_SUM_CRC32=" $1}'`

		echo $CHECK_SUM_MD5 > ${TOPDIR}/bin/checksum_md5
		echo $CHECK_SUM_CRC32 > ${TOPDIR}/bin/checksum_crc32

		rm -f ${TOPDIR}/bin/${BUILD_FW_NAME_CX2}
		cat ${TOPDIR}/bin/checksum_md5 ${TOPDIR}/bin/checksum_crc32 ${TOPDIR}/bin/V3K9_unchecked.all >${TOPDIR}/bin/${BUILD_FW_NAME_CX2}
	fi	
	# .cv3 firmware
	cat ${TOPDIR}/.config | grep CONFIG_PACKAGE_V300B=y > /dev/null
	RETURN_VALUE=$?
	if [ "$RETURN_VALUE" = "0" ]
	then
		echo $MACHINE_TYPE_FW_CV3 > ${TOPDIR}/bin/machine_type
		rm -rf ${TOPDIR}/bin/V3K9_unchecked.all
		cat ${TOPDIR}/bin/machine_type ${TOPDIR}/bin/root.ubifs-ubinized >${TOPDIR}/bin/V3K9_unchecked.all

		CHECK_SUM_MD5=
			eval `md5sum ${TOPDIR}/bin/V3K9_unchecked.all |
			awk '{
			print "CHECK_SUM_MD5=" $1}'`
		CHECK_SUM_CRC32=
			eval `${TOPDIR}/staging_dir/host/bin/mkcrc32 ${TOPDIR}/bin/V3K9_unchecked.all |
			awk '{
			print "CHECK_SUM_CRC32=" $1}'`

		echo $CHECK_SUM_MD5 > ${TOPDIR}/bin/checksum_md5
		echo $CHECK_SUM_CRC32 > ${TOPDIR}/bin/checksum_crc32

		rm -f ${TOPDIR}/bin/${BUILD_FW_NAME_CV3}
		cat ${TOPDIR}/bin/checksum_md5 ${TOPDIR}/bin/checksum_crc32 ${TOPDIR}/bin/V3K9_unchecked.all >${TOPDIR}/bin/${BUILD_FW_NAME_CV3}
	fi	
fi

# Create .all bootloader, insert CRC32 and MD5 checksum in header
if [ -f ${TOPDIR}/bin/u-boot.bin ]
then
	echo $MACHINE_TYPE_BL > ${TOPDIR}/bin/bootloader_type
	rm -rf ${TOPDIR}/bin/V3K9BL_unchecked.all
	cat ${TOPDIR}/bin/bootloader_type ${TOPDIR}/bin/u-boot.bin >${TOPDIR}/bin/V3K9BL_unchecked.all

	CHECK_SUM_MD5=
		eval `md5sum ${TOPDIR}/bin/V3K9BL_unchecked.all |
		awk '{
		print "CHECK_SUM_MD5=" $1}'`
	CHECK_SUM_CRC32=
		eval `${TOPDIR}/staging_dir/host/bin/mkcrc32 ${TOPDIR}/bin/V3K9BL_unchecked.all |
		awk '{
		print "CHECK_SUM_CRC32=" $1}'`

	echo $CHECK_SUM_MD5 > ${TOPDIR}/bin/checksum_bl_md5
	echo $CHECK_SUM_CRC32 > ${TOPDIR}/bin/checksum_bl_crc32

	rm -f ${TOPDIR}/bin/${BUILD_BL_NAME}
	cat ${TOPDIR}/bin/checksum_bl_md5 ${TOPDIR}/bin/checksum_bl_crc32 ${TOPDIR}/bin/V3K9BL_unchecked.all >${TOPDIR}/bin/${BUILD_BL_NAME}
fi

# Check size
# Max firmware size = 32MB
# Don't need to check firmware size because mkfs.ubifs already checked
# Max bootloader size = 512KB
if [ -f ${TOPDIR}/bin/u-boot.bin ]
then
	CHECK_FW_SIZE=
		eval `ls -l ${TOPDIR}/bin/u-boot.bin 2> /dev/null |
		awk '{
		print "CHECK_FW_SIZE=" $5}'`
	#echo "Bootloader size $CHECK_FW_SIZE bytes"
	if [ $CHECK_FW_SIZE -gt 524288 ]
	then
		echo -e "\033[31;46m     BOOTLOADER SIZE EXCEEDS LIMIT     \033[m"
	fi
fi

echo "Build script finish."
printf "\a"
