Rockchip Developer Guide Linux WDT
:::info 文档信息
文档标识:RK-KF-YF-078 · 发布版本:V1.1.0 · 发布日期:2021-04-13 · 页数:7 · 语言:英文
原始文档:Rockchip_Developer_Guide_Linux_WDT_CN.pdf
:::
章节大纲
- Rockchip Developer Guide Linux WDT(P1)
- WDT 驱动(P5)
- 驱动文件(P5)
- DTS 节点配置(P5)
- WDT 使用(P5)
- 内核配置(P6)
- 常见问题(P6)
- WDT无法停止(P6)
- WDT精度(P6)
- RK356X暂停功能(P7)
- WDT 驱动(P5)
在线预览
若预览无法显示,请直接下载 PDF 后用本地阅读器打开。
1. WDT 驱动
1.1 驱动文件
驱动文件所在位置:
drivers/watchdog/dw_wdt.c
1.2 DTS 节点配置
DTS 配置参考文档为 Documentation/devicetree/bindings/watchdog/dw_wdt.txt ,本文主要说明
如下参数:
interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH 0>;
中断模式时候用于首先触发中断,再经过一个超时周期才产生复位信号。
clocks = <&cru PCLK_WDT>;
驱动WDT工作,并且用于计算每个计数周期。
2. WDT 使用
应用操作 /dev/watchdog 节点来控制watchdog,示例如下:
int main(void)
{
int fd = open("/dev/watchdog", O_WRONLY); 通过open来启动watchdog
int ret = 0;
if (fd == -1) {
perror("watchdog");
exit(EXIT_FAILURE);
}
while (1) {
ret = write(fd, "\0", 1); 通过write来喂狗
if (ret != 1) {
ret = -1;
break;
}
sleep(10);
}
close(fd);
return ret;
}
关于 close()
-
正常情况下
close(),不再喂狗,watchdog会自动重启。echo A > /dev/watchdog, 这里写入的是除大写V以外的任意字符。 -
write(fd, "V", 1); 再close(),写入大写V,内核继续喂狗,系统不会自动重启。
echo V > /dev/watchdog
- 配置宏
CONFIG_WATCHDOG_NOWAYOUT,重复步奏2,内核不会继续喂狗,系统会被重启。
3. 内核配置
Symbol: WATCHDOG [=y]
Type : boolean
Prompt: Watchdog Timer Support
Location:
(1) -> Device Drivers
Defined at drivers/watchdog/Kconfig:6
4. 常见问题
4.1 WDT无法停止
旧版本WDT没有相应的寄存器可以配置停止功能,只能通过disable clock或者软复位来停止WDT,有些芯片的clock或者复位操作只能在安全环境执行,未来新版本的WDT添加了停止功能。
4.2 WDT精度
WDT精度只有16档,相邻档位计数相差比较大,因此无法精细计数。
0000: 0x0000ffff
0001: 0x0001ffff
0010: 0x0003ffff
0011: 0x0007ffff
0100: 0x000fffff
0101: 0x001fffff
0110: 0x003fffff
0111: 0x007fffff
1000: 0x00ffffff
1001: 0x01ffffff
1010: 0x03ffffff
1011: 0x07ffffff
1100: 0x0fffffff
1101: 0x1fffffff
1110: 0x3fffffff
1111: 0x7fffffff
假设wdt clock为100MHz,最大超时时间 0x7fffffff / 100MHz = 21秒,如果需要更大的超时,需要调整对应的wdt clock。
4.3 RK356X暂停功能
使用Rockchip自带的io命令或者busybox的devmem命令可以实现暂停计数以及恢复计数。
打开
CONFIG_DEVMEM
关闭
CONFIG_STRICT_DEVMEM
0xfdc60504来自SYS_GRF的GRF_SOC_CON1寄存器,对bit4写1暂停计数,写0恢复计数,高16位为写使能位。
暂停计数
io -4 0xfdc60504 0x00100010
或者
busybox devmem 0xfdc60504 32 0x00100010
恢复计数
io -4 0xfdc60504 0x00100000
或者
busybox devmem 0xfdc60504 32 0x00100000