看门狗说明
1、 看门狗原理
主板上提供一个可按分或秒计时的,最长达255级的可编程看门狗定时器,WDT超时事件发生时系统复位。
本程序(w83627hf_wdt.c)是基于Winbond83627芯片的看门狗驱动程序。
2、 驱动程序接口
l wdt_open :打开设备,应用程序调用open时进入该函数。
l wdt_close :关闭设备,应用程序调用close时进入该函数
l wdt_write :写设备,若传入数据大小不为0则喂狗;应用程序调用write时进入该函数。
l wdt_ioctl :应用程序调用ioctl时进入该函数,通过传入不同的参数实现不同的功能。主要参数如下:
WDIOC_GETSUPPORT :获取看门狗信息watchdog_info(见w83627hf_wdt.h)
WDIOC_KEEPALIVE :喂狗,同write函数功能类似
WDIOC_SETTIMEOUT :设置超时值
WDIOC_GETTIMEOUT :获取超时值
WDIOC_SETOPTIONS :设置看门狗状态,开启(WDIOS_ENABLECARD)或关闭(WDIOS_DISABLECARD)
3、 应用程序编写
主要步骤如下(请参考代码w83627hf_test.c):
l 打开设备
调用open方法,返回值为已打开的设备,若小于0表示打开失败,以下的调用都要用该返回值做参数,表示操作该设备。
wdt = open(WDT_DEVICE, O_RDWR);
l 开启看门狗
调用ioctl方法,传入WDIOC_SETOPTIONS参数,设置开启(WDIOS_ENABLECARD)状态,方法如下:
ioctl(wdt, WDIOC_SETOPTIONS, WDIOS_ENABLECARD);
l 设置看门狗超时值(可选,默认为60s)
调用ioctl方法,传入WDIOC_SETTIMEOUT参数,设置指定的超时值。
ioctl(wdt, WDIOC_SETTIMEOUT, &timeout);//timeout为超时值
l 喂狗
一般用while(1)循环在超时时间(timeout)内定时喂狗,若在timeout内没喂狗,则系统复位。提供2种喂狗方法:
(1) 调用write方法,注意传入参数大小不要为0。
write(wdt, &arg, sizeof(arg));//若sizeof(arg)为0则不会喂狗
(2)调用ioctl方法,传入WDIOC_KEEPALIVE参数
ioctl(wdt, WDIOC_KEEPALIVE,0);//第3个参数驱动不用
l 关闭看门狗
若不需要使用看门狗,则关闭它,注意关闭后即使超时值到也不会复位。
示例应用程序并没有调用此函数,因为我们并不想关闭看门狗。
调用ioctl方法实现,传入WDIOC_SETOPTIONS参数,设置关闭状态
ioctl(wdt, WDIOC_SETOPTIONS, WDIOS_DISABLECARD)
l 关闭设备
调用close方法。
close(wdt);