【FAQ】全志R329 Tina下如何使用硬件Watchdog?
-
问题背景
一些产品需要使用硬件看门狗(watchdog)复位功能,以避免死机后系统没有办法重启,影响用户体验。全志平台基本都带了硬件watchdog,并且内核中也已经包含驱动,只是需要在内核和应用使用即可。
解决方案
配置kernel
使能SUNXI Watchdog驱动;
可以直接在执行make kernel_menuconfig进行配置,路径如下:Device Drivers -- Watchdog Timer Support -- SUNXI Watchdog
系统中添加喂狗操作
procd方式和busybox启动方式下,对watchdog的操作方式有些差异:1)procd 启动
在procd启动方式下,系统启动时候,会在procd init进程加载watchdog,然后在后台进行“喂狗”操作,如果系统crash,watchdog会reset系统。
具体的代码:
procd-2016-02-08/initd/init.c
procd-2016-02-08/initd/watchdog.c因此在procd启动方式下,应用可以不用对watchdog进行操作,如果需要改为应用喂狗,可以去掉init中对watchdog的操作;
2)busybox启动
Busybox启动时,init默认不会自动操作watchdog,需要由应用程序自行“喂狗”,启动代码可以参考下面示范代码:
/* * Watchdog Driver Test Program */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/types.h> #include <linux/watchdog.h> int fd; /* * This function simply sends an IOCTL to the driver, which in turn ticks * the PC Watchdog card to reset its internal timer so it doesn't trigger * a computer reset. */ static void keep_alive(void) { int dummy; ioctl(fd, WDIOC_KEEPALIVE, &dummy); } /* * The main program. Run the program with "-d" to disable the card, * or "-e" to enable the card. */ int main(int argc, char *argv[]) { int flags; fd = open("/dev/watchdog", O_WRONLY); if (fd == -1) { fprintf(stderr, "Watchdog device not enabled.\n"); fflush(stderr); exit(-1); } if (argc > 1) { if (!strncasecmp(argv[1], "-d", 2)) { flags = WDIOS_DISABLECARD; ioctl(fd, WDIOC_SETOPTIONS, &flags); fprintf(stderr, "Watchdog card disabled.\n"); fflush(stderr); exit(0); } else if (!strncasecmp(argv[1], "-e", 2)) { flags = WDIOS_ENABLECARD; ioctl(fd, WDIOC_SETOPTIONS, &flags); fprintf(stderr, "Watchdog card enabled.\n"); fflush(stderr); exit(0); } else { fprintf(stderr, "-d to disable, -e to enable.\n"); fprintf(stderr, "run by itself to tick the card.\n"); fflush(stderr); exit(0); } } else { fprintf(stderr, "Watchdog Ticking Away!\n"); fflush(stderr); } while(1) { keep_alive(); sleep(1); } }
-
-
-
-
-
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号