寫在 Documentation/watchdog
其中 watchdog-api.rst 有說明一些基本的操作。
#include <iostream> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/watchdog.h> class Watchdog { private: int watchdog_fd; public: Watchdog(const char* device_path = "/dev/watchdog") { watchdog_fd = open(device_path,O_RDWR); if (watchdog_fd == -1) { std::cerr << "Error opening watchdog device" << std::endl; }else { std::cout << "watchdog open OK" << std::endl; } } ~Watchdog() { if (watchdog_fd != -1) { int options = WDIOS_DISABLECARD; ioctl(watchdog_fd,WDIOC_SETOPTIONS,&options); close(watchdog_fd); } std::cout << "watchdog closed OK" << std::endl; } bool kick() { int dummy = 0; std::cout << "kick" << std::endl; return ioctl(watchdog_fd, WDIOC_KEEPALIVE, &dummy) != -1; } }; int main() { Watchdog wd; for(int i=0;i<10;i++) { wd.kick(); sleep(10); } return 0; }用 raspberry pi測試 (因為 NB 沒有 /dev/watchdog):
$sudo ./watchdog watchdog open OK kick kick kick .. kick watchdog close OK系統不會 reboot
但是在中途用 Ctrl-C 中斷。會出現
watchdog: watchdog0: watchdog did not stop!然後 10 sec 後系統 reboot
另外,用 shell command 也可以。
document 說,寫入 'V' 之後close 可以停止 watchdog.
echo 'V' > /dev/watchdog另外,雖然driver load,但是 watchdog timrer 是沒有啟動的。
一旦有人 open dev node,timer 就開始啟動。
在timeout 之前,寫除了'V' 之外的東西,都可以 reset timer 或是用IOCTL)。
沒有留言:
張貼留言