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