查看 /dev/watchdog 是否存在该节点,如果存在,驱动支持硬件看门狗操作。
#include <stddef.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <linux/watchdog.h>
#include <sys/ioctl.h>
#include <linux/rtc.h>
#include <errno.h>
#include <fcntl.h>
#define WATCH_DOG_ENABLE 1
#define WATCH_DOG "/dev/watchdog" //看门狗操作节点
static int fd_watch_dog = 0;
/**
* @projectName Driver interface program
* @brief 打开看门狗操操作
* @author gaven
* @date 2020/09/21
*/
int open_watch_dog(void)
{
#ifdef WATCH_DOG_ENABLE
int ret = 0;
int flags = 0;
fd_watch_dog = open(WATCH_DOG, O_WRONLY);
if(fd_watch_dog <= 0)
{
printf("fd_watch_dog error = %d\n",fd_watch_dog);
return -1;
}
flags = WDIOS_ENABLECARD;
ioctl(fd_watch_dog, WDIOC_SETOPTIONS , &flags);
int timeout = 10;
ioctl(fd_watch_dog, WDIOC_SETTIMEOUT, &timeout);
//ret = ioctl(fd_watch_dog, WDIOC_GETTIMEOUT, &timeout);
if (ret < 0)
{
printf("WDIOC_GETTIMEOUT failed\n");
return -1;
}
#endif
return 0;
}
/**
* @projectName Driver interface program
* @brief 关闭看门狗操操作
* @author gaven
* @date 2020/09/21
*/
int close_watch_dog(void)
{
int ret = 0;
#ifdef WATCH_DOG_ENABLE
int flags = 0;
flags = WDIOS_DISABLECARD;
ioctl(fd_watch_dog, WDIOC_SETOPTIONS, &flags);
ret = close(fd_watch_dog);
fd_watch_dog = 0;
if(ret < 0)
{
printf("ret error = %d\n",ret);
}
printf("close_watch_dog is successful\n");
#endif
return ret;
}
/**
* @projectName Driver interface program
* @brief 喂狗操作
* @author gaven
* @date 2020/09/21
*/
int feed_watch_dog(void)
{
#ifdef WATCH_DOG_ENABLE
int ret = 0;
if(fd_watch_dog <= 0)
{
printf("feed_watch_dog is error = %d\n",fd_watch_dog);
return -1;
}
int dummy = 1;
ret = ioctl(fd_watch_dog, WDIOC_KEEPALIVE, &dummy);
if(ret < 0)
{
printf("Write failed\n");
return -1;
}
#endif
return 0;
}
int main(void)
{
open_watch_dog();
while(1)
{
feed_watch_dog();
sleep(5);
}
close_watch_dog();
return 0;
}
超时时间为10s ,5s喂狗一次