feat: 4015 Watchdog功能
這些定義是看門狗 IOCTL 命令,用於與看門狗設備互動:
-
WDIOC_GETSTATUS
:獲取看門狗設備的狀態。 -
WDIOC_GETBOOTSTATUS
:獲取看門狗設備的啟動狀態。 -
WDIOC_SETOPTIONS
:設定看門狗設備的選項。 -
WDIOC_KEEPALIVE
:讓看門狗設備保持活躍。 -
WDIOC_SETTIMEOUT
:設定看門狗超時時間。 -
WDIOC_GETTIMEOUT
:獲取看門狗超時時間。 -
WDIOC_SETPRETIMEOUT
:設定看門狗的預超時時間。 -
WDIOC_GETPRETIMEOUT
:獲取看門狗的預超時時間。 -
WDIOC_GETTIMELEFT
:獲取看門狗剩餘時間。
#define WDIOC_GETSTATUS _IOR(WATCHDOG_IOCTL_BASE, 1, int)
#define WDIOC_GETBOOTSTATUS _IOR(WATCHDOG_IOCTL_BASE, 2, int)
#define WDIOC_SETOPTIONS _IOR(WATCHDOG_IOCTL_BASE, 4, int)
#define WDIOC_KEEPALIVE _IOR(WATCHDOG_IOCTL_BASE, 5, int)
#define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int)
#define WDIOC_GETTIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 7, int)
#define WDIOC_GETTIMELEFT _IOR(WATCHDOG_IOCTL_BASE, 10, int)
這些定義是看門狗設備支援的選項:
-
WDIOF_OVERHEAT
:因為 CPU 過熱重置。 -
WDIOF_FANFAULT
:風扇故障。 -
WDIOF_EXTERN1
:外部繼電器1。 -
WDIOF_EXTERN2
:外部繼電器2。 -
WDIOF_POWERUNDER
:電力故障。 -
WDIOF_CARDRESET
:卡片之前重置了 CPU。 -
WDIOF_POWEROVER
:電壓過高。 -
WDIOF_SETTIMEOUT
:設定超時時間(以秒為單位)。 -
WDIOF_MAGICCLOSE
:支援魔法關閉字元。 -
WDIOF_PRETIMEOUT
:預超時(以秒為單位),可設定或獲取。 -
WDIOF_ALARMONLY
:看門狗觸發管理或其他外部警報而不是重啟。 -
WDIOF_KEEPALIVEPING
:保持活躍的 ping 回應。
#define WDIOF_OVERHEAT 0x0001 /* Reset due to CPU overheat */
#define WDIOF_FANFAULT 0x0002 /* Fan failed */
#define WDIOF_EXTERN1 0x0004 /* External relay 1 */
#define WDIOF_EXTERN2 0x0008 /* External relay 2 */
#define WDIOF_POWERUNDER 0x0010 /* Power bad/power fault */
#define WDIOF_CARDRESET 0x0020 /* Card previously reset the CPU */
#define WDIOF_POWEROVER 0x0040 /* Power over voltage */
#define WDIOF_SETTIMEOUT 0x0080 /* Set timeout (in seconds) */
#define WDIOF_MAGICCLOSE 0x0100 /* Supports magic close char */
#define WDIOF_PRETIMEOUT 0x0200 /* Pretimeout (in seconds), get/set */
#define WDIOF_ALARMONLY 0x0400 /* Watchdog triggers a management or
other external alarm not a reboot */
#define WDIOF_KEEPALIVEPING 0x8000 /* Keep alive ping reply */
這些定義是看門狗設備的狀態:
-
WDIOS_DISABLECARD
:關閉看門狗計時器。 -
WDIOS_ENABLECARD
:開啟看門狗計時器。 -
WDIOS_TEMPPANIC
:溫度過高引起的內核恐慌。
#define WDIOS_DISABLECARD 0x0001 /* Turn off the watchdog timer */
#define WDIOS_ENABLECARD 0x0002 /* Turn on the watchdog timer */
#define WDIOS_TEMPPANIC 0x0004 /* Kernel panic on temperature trip */
範例程式碼
int main(int argc, char** argv) {
int fd;
struct watchdog_info info;
fd = open("/dev/watchdog", O_RDWR);
if (fd == -1) {
perror("open");
return 1;
}
int timeout;
if (ioctl(fd, WDIOC_GETTIMEOUT, &timeout)) {
perror("ioctl(WDIOC_GETTIMEOUT)");
close(fd);
return 1;
}
printf("Initial timeout: %d seconds\n", timeout);
timeout = 5; // 設定超時時間為60秒
if (ioctl(fd, WDIOC_SETTIMEOUT, &timeout)) {
perror("ioctl(WDIOC_SETTIMEOUT)");
close(fd);
return 1;
}
printf("New timeout: %d seconds\n", timeout);
// Keep the watchdog alive
if (ioctl(fd, WDIOC_KEEPALIVE, 0)) {
perror("ioctl(WDIOC_KEEPALIVE)");
close(fd);
return 1;
}
printf("Sent keep-alive ping to the watchdog\n");
// Optional: disable the watchdog timer before exiting
int options = WDIOS_DISABLECARD;
if (ioctl(fd, WDIOC_SETOPTIONS, &options)) {
perror("ioctl(WDIOC_SETOPTIONS)");
close(fd);
return 1;
}
printf("Disabled the watchdog timer\n");
close(fd);
return 0;
}
Edited by 承亨 柯