SSU_WATCHDOG使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 11/01/2022

    1. 概述

    Hardware watchdog提供超时复位系统的功能,其功能由定时器和复位功能组成,用户可以设定一个超时时间,并在超时时间以内对它进行“喂狗”的操作,重置其内部计数,如果其内部计算达到了设定的超时时间,watchdog就会对系统进行复位,重启系统。

    2. Linux下WATCHDOG控制

    2.1. 驱动架构

    Watchdog 采用标准的linux 框架,提供硬件的watchdog,上层应用可以设定time out时间,自己来keep alive。

    Watchdog默认是关闭的,用户可自行决定是否开启。开启建议在主线程中操作,如果在其他线程中操作,watchdog会随着线程的关闭而关闭

    2.2. 驱动位置

    在kernel源代码目录中的drivers/sstar/watchdog目录

    2.3. 打开WATCHDOG

    打开/dev/watchdog设备,watchdog将被启动。

    参考代码如下:

    int wdt_fd = -1;
    wdt_fd = open("/dev/watchdog", O_WRONLY);
    if (wdt_fd == -1)
    {
        // fail to open watchdog device
    }
    

    2.4. 关闭WATCHDOG

    参考代码如下:

    int option = WDIOS_DISABLECARD;
    ioctl(wdt_fd, WDIOC_SETOPTIONS, &option);
    if (wdt_fd != -1)
    {
        close(wdt_fd);
        wdt_fd = -1;
    }
    

    2.5. 设定TIMEOUT

    通过标准的IOCTL命令WDIOC_SETTIMEOUT,来设定timeout,单位是second,timeout的时间建议大于5s,参考代码如下:

    #define WATCHDOG_IOCTL_BASE 'W'
    #define WDIOC_SETTIMEOUT     _IOWR(WATCHDOG_IOCTL_BASE, 6, int)
    int timeout = 20;
    ioctl(wdt_fd, WDIOC_SETTIMEOUT, &timeout);
    

    2.6. KEEP ALIVE

    通过标准的IOCTL命令WDIOC_KEEPALIVE来喂狗,喂狗时间按照设定的timeout来决定,喂狗时间应该比timeout小,参考代码如下:

    #define WATCHDOG_IOCTL_BASE 'W'
    #define WDIOC_KEEPALIVE      _IOR(WATCHDOG_IOCTL_BASE, 5, int)
    ioctl(wdt_fd, WDIOC_KEEPALIVE, 0);
    

    3. Uboot下WATCHDOG控制

    3.1. 驱动架构

    Watchdog 采用标准的uboot DM 框架,对接uboot标准watchdog使用框架。

    3.2. 驱动位置

    在uboot源代码目录中的drivers/sstar/wdt目录

    3.3. 启用uboot watchdog功能

    通过uboot menuconfig配置下列选项来启用watchdog

    可以通过修改 “watchdog timeout in msec” 来配置超时时间。

    3.4. 启用Sigmastar watchdog驱动