Skip to content

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 承亨 柯