Watchdog 使用 简介 看门狗(watchdog)实际是一个定时器,å¯åŠ¨ä¹‹åŽä¼šå¼€å§‹è®¡æ—¶ã€‚系统或者软件需 è¦åœ¨è§„定时间内与看门狗通信(俗称喂狗)é‡ç½®è®¡æ—¶ï¼Œå¦‚æ¤åå¤ä¸‹åŽ»ï¼Œä»¥æ¤æ¥ç¡® 定系统和软件æ£å¸¸è¿è¡Œã€‚ 如果规定时间内没有喂狗,看门狗超时,说明系统或应用陷入循环ã€å¡æ»ï¼Œæ¤æ—¶ 看门狗会å‘出å¤ä½ä¿¡å·è®©ä¸»æŽ§å¤ä½ï¼Œè„±ç¦»å¡æ»ã€‚ æœ¬ç« èŠ‚ä¸»è¦ä»‹ç» ITX-3588J å¼€å‘æ¿å†…部看门狗的使用。 DTSé…ç½® ITX-3588J çš„ watchdog çš„ DTS 节点在 "kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588s.dtsi" 文件ä¸å®šä¹‰ï¼Œå¦‚ 下所示: wdt: watchdog@feaf0000 { compatible = "snps,dw-wdt"; reg = <0x0 0xfeaf0000 0x0 0x100>; clocks = <&cru TCLK_WDT0>, <&cru PCLK_WDT0>; clock-names = "tclk", "pclk"; interrupts = <GIC_SPI 315 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; }; 用户首先需在 DTS 文件ä¸æ‰“å¼€ wdt 节点: &wdt{ status = "okay"; }; 使用 watchdog 默认是关é—的,需按上述说明在 DTS 文件ä¸æ‰“开相关节点方能使用。 watchdog 的驱动文件为 "kernel-5.10/drivers/watchdog/dw_wdt.c"。下é¢ä»‹ ç»ä¸¤ç§æ–¹æ³•æ¥ä½¿ç”¨ watchdog: 内部看门狗的设备å称为"/dev/watchdog",用户å¯é€šè¿‡ "echo" 命令æ¥æŽ§åˆ¶è¯¥ 设备 # 写入任æ„内容(大写å—æ¯â€˜V’除外),开å¯çœ‹é—¨ç‹—ï¼Œæ¯ 44 秒内需è¦å†™å…¥ä¸€æ¬¡ï¼ˆå–‚狗) echo A > /dev/watchdog # å¼€å¯çœ‹é—¨ç‹—ï¼Œå¹¶ä¸”å†…æ ¸ä¼šæ¯éš” 22 秒自动喂一次狗 echo V > /dev/watchdog 也å¯ä»¥é€šè¿‡ç¨‹åºæ¥æŽ§åˆ¶çœ‹é—¨ç‹—,通过Android.mk编译生æˆå¯æ‰§è¡Œæ–‡ä»¶ï¼Œåœ¨æœºå™¨å¯ 动åŽï¼Œpush到上é¢è¿è¡Œï¼Œdemo代ç 如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <signal.h> #include <sys/ioctl.h> #include <linux/types.h> #include <linux/watchdog.h> #define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int) #define WDIOC_GETTIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 7, int) int main(void) { int timeout1 = 22; int timeout2; int fd = open("/dev/watchdog", O_WRONLY); //start watchdog int ret = 0; if (fd == -1) { perror("watchdog"); exit(EXIT_FAILURE); } ret = ioctl(fd, WDIOC_SETTIMEOUT, &timeout1); //set timeout if (ret < 0) printf("ioctl WDIOC_SETTIMEOUT failed.\n"); ret = ioctl(fd, WDIOC_GETTIMEOUT, &timeout2); //get timeout if (ret < 0) printf("ioctl WDIOC_SETTIMEOUT failed.\n"); printf("timeout = %d\n", timeout2); while (1) { ret = write(fd, "\0", 1); //feed the dog if (ret != 1) { ret = -1; break; } printf("feed the dog\n"); sleep(10); } close(fd); return ret; } demo说明: 1ã€å†…部看门狗在使用 open 函数打开åŽä¼šç«‹åˆ»å¼€å§‹è®¡æ—¶ã€‚ 2ã€å…³äºŽè¶…时时间:用户å¯ä»¥ç”¨ ioctl æ¥è®¾ç½®è¶…时时间和获å–超时时间。当用户 没有设置超时时间时,驱动会应用默认请求的超时时间为 30 s。需è¦è¯´æ˜Žçš„是 驱动最终设置的超时时间并ä¸ä¸€å®šæ˜¯åº”ç”¨å±‚ä¼ è¾“çš„æ—¶é—´æˆ–è€…é©±åŠ¨ä¸€å¼€å§‹è®¾ç½®çš„é»˜ 认时间。驱动函数里有一个超时时间的列表,该列表ä¸å˜æ”¾äº† 16 个超时时间( å‰ 9 个是 0)。驱动会在超时时间列表ä¸æ‰¾åˆ°ä¸€ä¸ªåˆé€‚的时间作为最终 watchdog 设置的超时时间。 以下为超时时间的详细列表: å‚考文档:SDK/RKDocs(linux 为 docs)/common/watchdog 外部看门狗 很多设备上有外部硬件看门狗,通过查看设备文件å¯ä»¥ç¡®è®¤æ˜¯å¦æ”¯æŒå¤–部看门狗 。如果有硬件看门狗 /dev/ ä¸‹åº”è¯¥ä¼šç”Ÿæˆ wdt_XXX 的设备文件。 ls /dev/wdt_* 通过写设备文件完æˆä½¿èƒ½å’Œå–‚狗。 echo e > /dev/wdt_core echo 1 > /dev/wdt_core case '0':0.64s case '1':2.56s case '2':10.24s case '3':40.96s case 'e':enable wdt