#! /bin/bash

. /etc/uboot.cfg

UBOOTENV=$(mktemp)

# default values
UBOOT_ROOT_PART=${UBOOT_ROOT_PART-/dev/mmcblk0p2}
UBOOT_KERNEL_ARGS=${UBOOT_KERNEL_ARGS-console=ttyAMA0,115200 console=tty1 selinux=0 plymouth.enable=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 kgdboc=ttyAMA0,115200 elevator=noop}
UBOOT_DEVICE_TREE=${UBOOT_DEVICE_TREE-bcm2709-rpi-2-b.dtb}

# check if mkimage tool is installed
which mkimage >/dev/null || { echo "missing mkimage"; exit 1; }

# load custom configuration
UBOOT_USER_CFG=${UBOOT_USER_CFG-/etc/uboot.user.cfg}
if [ "${UBOOT_USER_CFG}" != "" ]; then
	[[ -x "${UBOOT_USER_CFG}" ]] && source "${UBOOT_USER_CFG}"
fi

# load device tree file and set default kernel arguments
echo "
mmc dev 0
fatload mmc 0:1 \${fdt_addr_r} ${UBOOT_DEVICE_TREE}
setenv bootargs 'root=${UBOOT_ROOT_PART} rw rootwait ${UBOOT_KERNEL_ARGS}'
" > "${UBOOTENV}"

echo "echo ' '
echo 'Available boot options:'
echo '-----------------------'" >> "${UBOOTENV}"


# callback for each kernel
function vmlinuz_cb() {
	kernel=$1
	version=$2
	
	echo "Found kernel ${kernel}"
	echo "" >> "${UBOOTENV}"
	
	if [ -f /boot/initrd.img-${version} ] || [ -f /boot/initrd.uimg-${version} ]; then
		echo "initrd found"
		UBOOT_INITRD=\${ramdisk_addr_r}
		PRECMDS="${PRECMDS}fatload mmc 0:1 \${ramdisk_addr_r} /initrd.uimg-${version};"
		
		if [ ! -f /boot/initrd.uimg-${version} ]; then
			echo "Creating U-Boot image for /boot/initrd.img-${version}"
			mkimage -n "Ramdisk Image ${version}"  -A arm -O linux -T ramdisk -C gzip -d /boot/initrd.img-${version} /boot/initrd.uimg-${version} || { echo "error creating initrd.uimg"; exit 1; }
		else
			echo "Using cached U-Boot image for /boot/initrd.img-${version}"
		fi
	else
		UBOOT_INITRD=-
	fi
	
	if [ -f /boot/cmdline-${version} ]; then
		echo "setenv bootargs${i} 'setenv bootargs \"$(cat /boot/cmdline-${version} | tr '\n' ' ' | sed "s/[[:space:]]*$//")\"'" >> "${UBOOTENV}"
		PRECMDS="${PRECMDS}run bootargs${i};"
	fi
	
	echo "setenv boot${i} '${PRECMDS}fatload mmc 0:1 \${kernel_addr_r} /${kernel}; bootz \${kernel_addr_r} ${UBOOT_INITRD} \${fdt_addr_r}'" >> "${UBOOTENV}"
	
	echo "echo '   \"run boot${i}\" will boot ${kernel}'" >> "${UBOOTENV}"
}

# register callback
UBOOT_KERNEL_FCTS="${UBOOT_KERNEL_FCTS} vmlinuz_cb"

i=0
for k in $(ls -vr /boot/vmlinuz*); do
	PRECMDS=""
	kernel=$(basename "${k}")
	version=$(basename "${k}" | cut -d "-" -f2-)
	
	# execute all registered callbacks for this kernel
	for cb in ${UBOOT_KERNEL_FCTS}; do
		${cb} ${kernel} ${version}
	done
	
	i=$(( $i + 1 ))
done
echo "echo ' '" >> "${UBOOTENV}"

echo "
setenv autoboot run distro_bootcmd

echo 'Will execute \"run boot0\" in 2 seconds, abort with CTRL+c...'
sleep 2 && run boot0
" >> "${UBOOTENV}"

# create an image from the config in a format uboot understands
echo "Building U-Boot config image ..."
mkimage -A arm -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n "RPi2 Boot Script" -d "${UBOOTENV}" /boot/boot.scr || { echo "error creating uboot config image"; exit 1; }

#cat "${UBOOTENV}"
rm "${UBOOTENV}"
