Chinaunix首页 | 论坛 | 博客

分类: LINUX

2012-05-07 11:15:08

看门狗原理
主板上提供一个可按分或秒计时的,最长达255级的可编程看门狗定时器,WDT超时事件发生时系统复位.
本程序(w83627hf_wdt.c)是基于Winbond83627芯片的看门狗驱动程序.
驱动程序接口
wdt_open :打开设备,应用程序调用open时进入该函数.
wdt_close :关闭设备,应用程序调用close时进入该函数
wdt_write :写设备,若传入数据大小不为0则喂狗;应用程序调用write时进入该函数.
wdt_ioctl :应用程序调用ioctl时进入该函数,通过传入不同的参数实现不同的功能.主要参数如下:
WDIOC_GETSUPPORT :获取看门狗信息watchdog_info(见w83627hf_wdt.h)
WDIOC_KEEPALIVE :喂狗,同write函数功能类似
WDIOC_SETTIMEOUT :设置超时值
WDIOC_GETTIMEOUT :获取超时值
WDIOC_SETOPTIONS :设置看门狗状态,开启(WDIOS_ENABLECARD)或关闭(WDIOS_DISABLECARD)
应用程序编写
主要步骤如下(请参考代码w83627hf_test.c):
1、打开设备
调用open方法,返回值为已打开的设备,若小于0表示打开失败,以下的调用都要用该返回值做参数,表示操作该设备.
        wdt = open(WDT_DEVICE, O_RDWR);
2、开启看门狗
调用ioctl方法,传入WDIOC_SETOPTIONS参数,设置开启(WDIOS_ENABLECARD)状态,方法如下:
        ioctl(wdt, WDIOC_SETOPTIONS, WDIOS_ENABLECARD);
3、设置看门狗超时值(可选,默认为60s)
调用ioctl方法,传入WDIOC_SETTIMEOUT参数,设置指定的超时值.
        ioctl(wdt, WDIOC_SETTIMEOUT, &timeout);//timeout为超时值
4、喂狗
一般用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个参数驱动不用
5、关闭看门狗
若不需要使用看门狗,则关闭它,注意关闭后即使超时值到也不会复位.调用ioctl方法实现,传入WDIOC_SETOPTIONS参数,设置关闭状态
         ioctl(wdt, WDIOC_SETOPTIONS, WDIOS_DISABLECARD)
6、关闭设备
调用close方法.
         close(wdt);
阅读(5607) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~