watchdog分为 cpu内置watchdog,外置硬件watchdog,软件实现watchdog。
cpu内置watchdog可以在uboot启动时关闭,这样uboot就不会受watchdog影响。
外置硬件watchdong需要以下处理,基本思路就是打开CONFIG_HW_WATCHDOG宏,定义在uboot中多次调用的WATCHDOG_RESET,实例化hw_watchdog_reset函数。
/*
* Hardware watchdog
*/
#ifdef CONFIG_HW_WATCHDOG
#if defined(__ASSEMBLY__)
#define WATCHDOG_RESET bl hw_watchdog_reset
#else
extern void hw_watchdog_reset(void);
#define WATCHDOG_RESET hw_watchdog_reset
#endif /* __ASSEMBLY__ */
#else
1、u-boot-2016/common/Makefile 添加一句obj-$(CONFIG_HW_WATCHDOG) += watchdog.o
# boards
obj-$(CONFIG_SYS_GENERIC_BOARD) += board_f.o
obj-$(CONFIG_SYS_GENERIC_BOARD) += board_r.o
obj-$(CONFIG_DISPLAY_BOARDINFO) += board_info.o
obj-$(CONFIG_DISPLAY_BOARDINFO_LATE) += board_info.o
obj-$(CONFIG_HW_WATCHDOG) += watchdog.o
# core command
obj-y += cmd_boot.o
obj-$(CONFIG_CMD_BOOTM) += cmd_bootm.o bootm.o bootm_os.o
obj-y += cmd_help.o
obj-y += cmd_version.o
2、编写watchdog.c
#include <common.h>
#include <watchdog.h>
#ifdef CONFIG_HW_WATCHDOG
#define WATCH_DOG_GPIO 24
void hw_watchdog_reset(void)
{
gpio_direction_output(WATCH_DOG_GPIO, 1);
gpio_set_value(WATCH_DOG_GPIO, 0);
gpio_set_value(WATCH_DOG_GPIO, 1);
}
#endif
3、u-boot-2016/include/ipq6018.h 对应的配置文件加上 #define CONFIG_HW_WATCHDOG
#define CONFIG_IPQ6018_UART
#define CONFIG_NR_DRAM_BANKS 1
#define CONFIG_SKIP_LOWLEVEL_INIT
#define CONFIG_HW_WATCHDOG 1
#define CONFIG_SYS_BOOTM_LEN 0x4000000
可以添加自定义命令调试uboot功能
https://blog.csdn.net/mc_li/article/details/114269790