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);
}