在uboot中加入硬件看门狗喂狗的操作
·
一、简介
在嵌入式设备中,为了确保设备在现场的长期稳定运行,一般在芯片之外,接入一个硬件看门狗,由芯片定期的进行喂狗操作,当芯片异常不能喂狗时,看门狗电路将起作用,实现设备的复位重启。因此一般在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阶段的硬件看门狗喂狗。
更多推荐

所有评论(0)