altos: Delay reboot by a second to avoid re-entering idle mode
authorKeith Packard <keithp@keithp.com>
Mon, 26 Sep 2011 18:50:28 +0000 (11:50 -0700)
committerKeith Packard <keithp@keithp.com>
Mon, 26 Sep 2011 18:50:28 +0000 (11:50 -0700)
TM and Tm go into idle mode if they receive a packet after boot
time. When tebooting the device over the packet link, the packet
master would be (rapidly) polling the device for additional data and
so the device would invariably receive a packet during bootup and go
into idle mode again.

Delay the reboot by a second to give the controller time to disable
the master end of the packet link.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/ao_cmd.c

index 1442ebea8eafc9a32e31ae18006bf61ef2af9316..8037195a13f12264af41866ce1671e8982cb1e84 100644 (file)
@@ -208,6 +208,13 @@ ao_reboot(void)
        ao_cmd_white();
        if (!ao_match_word("eboot"))
                return;
        ao_cmd_white();
        if (!ao_match_word("eboot"))
                return;
+
+       /* Delay waiting for the packet master to be turned off
+        * so that we don't end up back in idle mode because we
+        * received a packet after boot.
+        */
+       flush();
+       ao_delay(AO_SEC_TO_TICKS(1));
        WDCTL = WDCTL_EN | WDCTL_MODE_WATCHDOG | WDCTL_INT_64;
        ao_delay(AO_SEC_TO_TICKS(2));
        ao_panic(AO_PANIC_REBOOT);
        WDCTL = WDCTL_EN | WDCTL_MODE_WATCHDOG | WDCTL_INT_64;
        ao_delay(AO_SEC_TO_TICKS(2));
        ao_panic(AO_PANIC_REBOOT);