Recovery mode: Load recovery image through TFTP and start it

Change-Id: If2fa5b91561f88aeaa6239707d8eb769dc09387e
diff --git a/arch/arm/boards/optimus/env_spacecast/bin/boot_recovery b/arch/arm/boards/optimus/env_spacecast/bin/boot_recovery
new file mode 100644
index 0000000..97070b0
--- /dev/null
+++ b/arch/arm/boards/optimus/env_spacecast/bin/boot_recovery
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+if [ -f /env/bin/pre-boot ]; then
+	. /env/bin/pre-boot || exit
+fi
+
+. /default/config
+
+mtdparts="${nor_device}:${nor_parts}"
+bootargs="${bootargs} mtdparts=${mtdparts}"
+bootargs="${bootargs} mac_addr=${eth0.ethaddr},${eth1.ethaddr},${eth2.ethaddr}"
+
+printenv
+
+gpio_reg=0x90470000
+led_blue=0x0800D000
+led_red=0x0800E000
+led_purple=0x0800F000
+led_off=0x0800C000
+
+mw ${gpio_reg} ${led_purple}
+dhcp
+
+while true; do
+	mw ${gpio_reg} ${led_blue}
+	tftp gfsc100/recovery.img
+	if [ "$?" = "0" ]; then
+		mw ${gpio_reg} ${led_red}
+		bootm recovery.img
+
+		# The image is invalid, blink red until power is unplugged
+		while true; do
+			for st in ${led_off} ${led_red}; do
+				mw ${gpio_reg} ${st}
+				msleep 250
+			done
+		done
+	else
+		# TFTP failed, blink blue for 2s
+		for i in 0 1 2 3; do
+			for st in ${led_off} ${led_blue}; do
+				mw ${gpio_reg} ${st}
+				msleep 250
+			done
+		done
+
+                # Switch the LED off for 2s, then try again
+		mw ${gpio_reg} ${led_off}
+		msleep 2000
+	fi
+done
diff --git a/arch/arm/boards/optimus/env_spacecast/bin/init b/arch/arm/boards/optimus/env_spacecast/bin/init
index 9a64e17..3cd93f1 100644
--- a/arch/arm/boards/optimus/env_spacecast/bin/init
+++ b/arch/arm/boards/optimus/env_spacecast/bin/init
@@ -40,23 +40,27 @@
 echo -n "Hit Ctrl-C to stop autoboot: "
 timeout -c $autoboot_timeout
 if [ $? = 0 ]; then
-	boot
+	if [ x${recovery_mode} != x1 ]; then
+		boot
 
-	# If we reach here, the kernel has failed to boot. Try the other kernel.
-	if [ x$HNV_ACTIVATED_KERNEL_NAME = xkernel1 ]; then
-		kernpart=kernel0
-		rootpart=rootfs0
+		# If we reach here, the kernel has failed to boot. Try the other kernel.
+		if [ x$HNV_ACTIVATED_KERNEL_NAME = xkernel1 ]; then
+			kernpart=kernel0
+			rootpart=rootfs0
+		else
+			kernpart=kernel1
+			rootpart=rootfs1
+		fi
+		echo
+		echo "ERROR: Unable to boot $HNV_ACTIVATED_KERNEL_NAME!
+			Attempting to boot $kernpart instead."
+		echo
+
+		boot
+		echo 'Autoboot failed.'
 	else
-		kernpart=kernel1
-		rootpart=rootfs1
+		boot_recovery
 	fi
-	echo
-	echo "ERROR: Unable to boot $HNV_ACTIVATED_KERNEL_NAME!
-		Attempting to boot $kernpart instead."
-	echo
-
-	boot
-	echo 'Autoboot failed.'
 fi
 
 echo