#!/bin/bash

set -e

rk_ramdisk_security_bootup_normal()
{
	echo "[$0] Build ramdisk with sha256 digest"
	ROOTFS_IMAGE_DIGEST=$(dirname $ROOTFS_IMAGE)/ramdisk.gz.digest

	openssl dgst -sha256 -binary -out $ROOTFS_IMAGE_DIGEST $ROOTFS_IMAGE || exit 1
	rootfs_image_digest_size=$(du -b $ROOTFS_IMAGE |sed -r -e 's/[[:space:]]+.*$//')

	if [ "$RK_ARCH" == "arm" ]; then
		kernel_dts_file="kernel/arch/arm/boot/dts/$RK_KERNEL_DTS.dts"
	else
		kernel_dts_file="kernel/arch/arm64/boot/dts/rockchip/$RK_KERNEL_DTS.dts"
	fi

	cp $kernel_dts_file ${kernel_dts_file}.backup
cat << EOF >> ${kernel_dts_file}
&ramdisk_c {
	size = <$rootfs_image_digest_size>;
	hash {
		algo = "sha256";
		value = /incbin/("$ROOTFS_IMAGE_DIGEST");
	};
};
EOF
	./build.sh kernel
	mv ${kernel_dts_file}.backup $kernel_dts_file
}

rk_ramdisk_build_init()
{
	echo "Try to build init for $1"

	if [ "$RK_SYSTEM_CHECK_METHOD" = "DM-V" ]; then
		SYSTEM_IMAGE=$TOP_DIR/buildroot/output/$RK_CFG_BUILDROOT/images/rootfs.squashfs
	else
		SYSTEM_IMAGE=$TOP_DIR/buildroot/output/$RK_CFG_BUILDROOT/images/rootfs.${RK_ROOTFS_TYPE}
	fi
	if [ ! -e "$SYSTEM_IMAGE" ]; then
		echo "ERROR: Please build system first"
		exit -1
	fi

	$COMMON_DIR/mk-dm.sh $1 $SYSTEM_IMAGE
}

COMMON_DIR=$(cd `dirname $0`; pwd)
if [ -h $0 ]
then
        CMD=$(readlink $0)
        COMMON_DIR=$(dirname $CMD)
fi
cd $COMMON_DIR
cd ../../..
TOP_DIR=$(pwd)
RAMDISK_IMG=$1
RAMDISK_CFG=$2
RAMDISK_TYPE=$RK_RAMBOOT_TYPE
echo "config is $RAMDISK_CFG"
if [ -z $RAMDISK_CFG ]
then
	echo "config for building $RAMDISK_IMG doesn't exist, skip!"
	exit 0
fi

BOARD_CONFIG=$TOP_DIR/device/rockchip/.BoardConfig.mk
source $BOARD_CONFIG
if [ -z $RK_KERNEL_ZIMG ]; then
	KERNEL_IMAGE=$TOP_DIR/$RK_KERNEL_IMG
else
	KERNEL_IMAGE=$TOP_DIR/$RK_KERNEL_ZIMG
fi

KERNEL_DTB=$TOP_DIR/kernel/resource.img

# build kernel
if [ -f $KERNEL_IMAGE ]
then
	echo "found kernel image"
else
	echo "kernel image doesn't exist, now build kernel image"
	$TOP_DIR/build.sh kernel
	if [ $? -eq 0 ]; then
		echo "build kernel done"
	else
		exit 1
	fi
fi

source $TOP_DIR/buildroot/build/envsetup.sh $RAMDISK_CFG
CPIO_IMG=$TOP_DIR/buildroot/output/$RAMDISK_CFG/images/rootfs.cpio.gz
ROMFS_IMG=$TOP_DIR/buildroot/output/$RAMDISK_CFG/images/rootfs.romfs
TARGET_IMAGE=$TOP_DIR/buildroot/output/$RAMDISK_CFG/images/$RAMDISK_IMG

if [ -z $RAMDISK_TYPE ]
then
RAMDISK_TYPE=CPIO
fi

eval ROOTFS_IMAGE=\$${RAMDISK_TYPE}_IMG

if [ "$RK_RAMDISK_SECURITY_BOOTUP" = "true" ];then
	case "$RK_SYSTEM_CHECK_METHOD" in
	"DM-V" | "DM-E")
		rk_ramdisk_build_init $RK_SYSTEM_CHECK_METHOD
		;;
	*)
		echo "do nothing ($RK_SYSTEM_CHECK_METHOD)"
	esac
fi

# build ramdisk
echo "====Start build $RAMDISK_CFG===="
if $TOP_DIR/buildroot/utils/brmake; then
    echo "log saved on $TOP_DIR/br.log"
    echo "====Build $RAMDISK_CFG ok!===="
else
    echo "log saved on $TOP_DIR/br.log"
    echo "====Build $RAMDISK_CFG failed!===="
    tail -n 100 $TOP_DIR/br.log
    exit 1
fi

if [ $RAMDISK_TYPE == ROMFS ]
then
# Do compress for tinyrootfs
cat $ROOTFS_IMAGE | gzip -n -f -9 > $ROOTFS_IMAGE.gz
cat $KERNEL_IMAGE | gzip -n -f -9 > $KERNEL_IMAGE.gz
ROOTFS_IMAGE=$ROOTFS_IMAGE.gz
KERNEL_IMAGE=$KERNEL_IMAGE.gz
fi

echo -n "pack $RAMDISK_IMG..."
if [ -f "$TOP_DIR/device/rockchip/$RK_TARGET_PRODUCT/$RK_RECOVERY_FIT_ITS" ];then
	if [ "$RK_RAMDISK_SECURITY_BOOTUP" = "true" ];then
		if [ -z "$RK_SYSTEM_CHECK_METHOD" ]; then
			rk_ramdisk_security_bootup_normal $0
		fi
	fi

	$COMMON_DIR/mk-fitimage.sh $TARGET_IMAGE $TOP_DIR/device/rockchip/$RK_TARGET_PRODUCT/$RK_RECOVERY_FIT_ITS $ROOTFS_IMAGE $KERNEL_IMAGE
else
	$TOP_DIR/kernel/scripts/mkbootimg --kernel $KERNEL_IMAGE --ramdisk $ROOTFS_IMAGE --second $KERNEL_DTB -o $TARGET_IMAGE
fi
echo "done."
