9. Watchdog操作指南

9.1. Watchdog的操作准备如下:

  • 使用SDK发布的kernel。

9.2. 模块编译

  • 插入模块:cv180x则insmod cv180x_wdt.ko,cv181x则insmod cv181x_wdt.ko.

  • 在控制台下运行 Watchdog 读写命令或者自行在内核态或者用户态编写 Watchdog 读写程序,即可操作 Watchdog 。

9.3. 操作示例

Watchdog采用标准的linux框架, 提供硬件watchdog。用户只需打开, 关闭或设定timeout,即可使用watchdog。当watchdog timeout发生时, 系统重新启动.

Watchdog 默认是关闭的,客户可自行决定是否开启。可指定的timeout时间分别为1秒, 2秒, 5秒, 10秒, 21秒, 42秒, 85秒.

当使用者输入timtout时间为8秒, 驱动会选择大于等于该值的timeout即10秒; 若未设定 timeout,驱动采用默认42秒。

  • 打开 WATCHDOG

    打开/dev/watchdog 设备,watchdog 即被启动。打开之后应该立刻ping(喂狗),否则wdt将会立刻重启。

int wdt_fd = -1;
wdt_fd = open("/dev/watchdog", O_WRONLY);
if (wdt_fd == -1)
{
   // fail to open watchdog device
}
ioctl(fd, WDIOC_KEEPALIVE, 0);
  • 关闭 WATCHDOG

    驱动支持”Magic Close”, 在关闭watchdog前必須將magic 字符’V’写入watchdog设备。
    如果userspace daemon没有发送’V’而直接关閉設設備,則watchdog驱

    动持續計數, 在给定时间内未喂狗仍会导致timeout, 系統重启.

    参考代码如下:

int option = WDIOS_DISABLECARD;
ioctl(wdt_fd, WDIOC_SETOPTIONS, &option);
if (wdt_fd != -1)
{
   write(wdt_fd, "V", 1);
   close(wdt_fd);
   wdt_fd = -1;
}
  • 设定 TIMEOUT值

通过标准的 IOCTL 命令 WDIOC_SETTIMEOUT设定 timeout,单位为秒. 可指定的timeout时间分别为1秒, 2秒, 5秒, 10秒, 21秒, 42秒, 85秒.

#define WATCHDOG_IOCTL_BASE 'W'
#define WDIOC_SETTIMEOUT \_IOWR(WATCHDOG_IOCTL_BASE, 6, int)

int timeout = 10;
ioctl(wdt_fd, WDIOC_SETTIMEOUT, &timeout);
  • PING watchdog (喂狗)

    通过标准的 IOCTL 命令 WDIOC_KEEPALIVE喂狗.

while (1) {
   ioctl(fd, WDIOC_KEEPALIVE, 0);
   sleep(1);
}