Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    【FAQ】全志R329 Tina下如何使用硬件Watchdog?

    其它全志芯片讨论区
    r329 r818 faq 看门狗 技术支持
    1
    1
    1549
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • q1215200171
      budbool LV 9 last edited by

      问题背景

      一些产品需要使用硬件看门狗(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);
          }
      }
      
      1 Reply Last reply Reply Quote Share 0
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策