IMX6UL实现独立硬件看门狗的方案
平台:飞凌嵌入式OKMX6UL开发板
系统:Linux3.14.38
看门狗工作原理:
看门狗其实就是一个可以在一定时间内被复位的计数器。当看门狗开启时,就会自动开始计时,当到达一定时间内没有被复位,就会产生一个复位信号使系统重启。系统正常运行时,需要在看门狗设定的时间间隔内将计数器清零,不让复位信号产生。如果系统不出问题,程序按时“喂狗”,一旦系统跑飞,不能进行“喂狗”,复位信号产生,系统复位重启。
看门狗分类:
1、cpu内部自带的看门狗是将芯片内部的定时器来作为看门狗,通过程序的初始化,写入初值,设置溢出时间,并启动定时器。可以选择开启或关闭。
优点:可以通过程序改变溢出时间;可以随时禁用
缺点:需要初始化,如果在初始化之前系统跑飞,无法实现系统复位,系统恢复能力降低。
2、独立看门狗芯片是一个独立的芯片,主要有一个喂狗引脚和一个复位引脚,如果没有在一定时间内改变喂狗引脚的电平状态,就会输出复位信号,使系统进行复位。此类看门狗一旦上电,无法禁用。
优点:无需配置,上电即用。无法禁用,系统恢复能力强。
缺点:无法灵活配置溢出时间,灵活性降低。
本文主要想在OKMX6UL开发板上适配独立看门狗芯片
如果想使用独立看门狗芯片,主要分为两部分:1、uboot启动过程中喂狗;2、内核启动过程中喂狗;
一、uboot启动过程中喂狗实现:
uboot源码中有看门狗的接口,可以通过宏定义CONFIG_HW_WATCHDOG来实现。
1、include/configs/mx6ul_14x14_evk.h中添加宏定义
#define CONFIG_HW_WATCHDOG
2、board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c中添加引脚复用及喂狗函数
static iomux_v3_cfg_t const iox_pads[] = {
MX6_PAD_SNVS_TAMPER9__GPIO5_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL),
};
void hw_watchdog_reset(void)
{
gpio_direction_output(IMX_GPIO_NR(5,9), 0);
gpio_direction_output(IMX_GPIO_NR(5,9), 1);
}
二、内核启动过程中喂狗实现:
添加一个定时器驱动,在定时器服务函数 中实现喂狗
1、设备树添加节点
32 hw-wdt-gpio {