Add new custom command 'rstbywdt' for last reset reason check
authorPiotr Dymacz <pepe2k@gmail.com>
Tue, 13 Jun 2017 20:53:04 +0000 (22:53 +0200)
committerPiotr Dymacz <pepe2k@gmail.com>
Tue, 13 Jun 2017 20:53:04 +0000 (22:53 +0200)
Add a small helper command 'rstbywdt' which returns true if the last
system reset was caused by the SOC watchdog.

It can be used for example to boot different kernel in case of reset
caused by watchdog:

if rstbywdt; then bootm 0x9FE80000; else bootm 0x9F050000; fi

Also, show a warning at boot if last reset was caused by watchodg.

u-boot/board/ar7240/common/common.c
u-boot/common/cmd_custom.c
u-boot/include/common.h
u-boot/include/configs/qca9k_common.h

index d69af948df3af0f5911ad5a4e626f02e5b3bfb52..1d20173dc92b1cbb196903e9f080d7bbec8cffc2 100644 (file)
@@ -76,6 +76,22 @@ void qca_soc_name_rev(char *buf)
        }
 }
 
+/*
+ * Returns last reset reason:
+ * 1 -> reset by watchdog
+ * 0 -> normal reset
+ */
+int last_reset_wdt()
+{
+       u32 reg;
+
+       reg = qca_soc_reg_read(QCA_RST_WATCHDOG_TIMER_CTRL_REG);
+       if (reg & QCA_RST_WATCHDOG_TIMER_CTRL_LAST_MASK)
+               return 1;
+
+       return 0;
+}
+
 /*
  * Prints available information about the board
  */
@@ -89,6 +105,10 @@ void print_board_info(void)
        bd_t *bd = gd->bd;
        char buffer[24];
 
+       /* Show warning if last reboot was caused by SOC watchdog */
+       if (last_reset_wdt())
+               puts("** Warning: reset caused by watchdog!\n\n");
+
        /* Board name */
        printf("%" ALIGN_SIZE "s %s\n",
               "BOARD:", MK_STR(CONFIG_BOARD_CUSTOM_STRING));
index cfefe1a6f603b5806f4457c9eea3f952685a144c..d74f0f4f4aabf6652d5120c21b86891965ec1e7e 100644 (file)
@@ -311,3 +311,15 @@ int do_ledoff(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 U_BOOT_CMD(ledon,  1, 1, do_ledon,  "turn LED/s on\n", NULL);
 U_BOOT_CMD(ledoff, 1, 1, do_ledoff, "turn LED/s off\n", NULL);
 #endif /* CONFIG_CMD_LED */
+
+/*
+ * Checks if last reset was caused by watchdog
+ */
+#if defined(CONFIG_CMD_RSTBYWDT)
+int do_rstbywdt(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       return !last_reset_wdt();
+}
+
+U_BOOT_CMD(rstbywdt, 1, 1, do_rstbywdt, "check if last reset was caused by watchdog\n", NULL);
+#endif /* CONFIG_CMD_RSTBYWDT */
index a52548e05a8332c90a3f4cfad9fbe863d5aa7d42..cc32b91dca9c4b85267ff1d5fe9f671b75b3ea1b 100644 (file)
@@ -191,6 +191,7 @@ int  checkboard(void);
 int  checkflash(void);
 int  checkdram(void);
 int  last_stage_init(void);
+int  last_reset_wdt(void);
 int  reset_button_status(void);
 extern ulong monitor_flash_len;
 
index 360c676eff3e893351861fb8faded3081a2bf65a..4cd3505b0cbb75609d052e805938ad507ae0c0b5 100644 (file)
 #define CONFIG_CMD_MEMORY
 #define CONFIG_CMD_NET
 #define CONFIG_CMD_PING
+#define CONFIG_CMD_RSTBYWDT
 #define CONFIG_CMD_RUN
 #define CONFIG_CMD_SETEXPR
 #define CONFIG_CMD_SLEEP