一、简介

在嵌入式设备中,为了确保设备在现场的长期稳定运行,一般在芯片之外,接入一个硬件看门狗,由芯片定期的进行喂狗操作,当芯片异常不能喂狗时,看门狗电路将起作用,实现设备的复位重启。因此一般在Linux系统下需要进行喂狗的操作。其实在uboot下也需要实现看门狗的喂狗操作,原因有二。一是看门狗复位周期有大有小,有的看门狗芯片周期只有一两秒,很有可能在linux启动前,看门狗就起作用了。二是,有时存在需要再uboot下进行调试的工作,此时需要看门狗不复位终端。

二、实现在uboot下进行喂狗

 刚开始是想利用uboot中的看门狗定时器,在中断里面进行喂狗。后来发现该方法太折腾。其实,uboot已经在源码中比较耗时、需要喂狗的地方穿插了喂狗函数。我们只需要打开CONFIG_HW_WATCHDOG开关以及实现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、打开CONFIG_HW_WATCHDOG开关

u-boot-2014.07/include/configs/sun8iw17p1.h

#if 1
/*Add watchdog */
#define CONFIG_HW_WATCHDOG
#define CONFIG_CMD_WDT
#define CONFIG_SUN8IW17P1_WATCHDOG
#endif

2、实现hw_watchdog_reset喂狗函数(假设看门狗的硬件看门狗的引脚为PL7)

u-boot-2014.07/drivers/watchdog/sun8iw17p1_wdt.c

#ifdef CONFIG_HW_WATCHDOG
extern void hardware_watchdog_init(void);
extern void hardware_watchdog_reset(void);
#endif

void hw_watchdog_reset(void)
{
#ifdef CONFIG_HW_WATCHDOG /* external watchdog, keep-alive */
       hardware_watchdog_reset();
#endif
}

u-boot-2014.07/board/sunxi/common/board_common.c

#ifdef CONFIG_HW_WATCHDOG
void hardware_watchdog_reset(void)
{
       uint port = SUNXI_GPIO_L;
       uint pin = 7;
       uint data;
       sunxi_gpio_data_get(port,pin,&data);
       data = data ^(1 << pin);
       sunxi_gpio_data_set(port,pin,data);
}
#endif

如此便完成了在uboot阶段的硬件看门狗喂狗。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐