【已解决】MT7688的硬件看门狗watchdog玩法

对于无人系统来说,看门狗很重要

@mango 好的, 謝謝你的建議.

@big-j 后续还是建议让系统procd来喂狗,也就是更正openwrt的寄存器即可。不用自己准备喂狗脚本了。系统死机后必然会重启,这个有客户在线的设备已经验证了。

我有遇到watchdog無法工作的問題, 根據mango的作法, 我的修改:

#!/bin/sh

# 若是開機時, 系統程序沒有做清除WDTRST這個動作, watchdog就不會動作, 需補做.
# 第一次設定10000100, 需用reg s 0
reg s 0
reg w 100 0x200

reg w 10000120 0x03e80000
reg w 10000124 0x2710
reg w 10000120 0x03e80090

sleep 1

while true
do
reg w 10000100 0x0200
#reg w 10000120 0x3e80090 (我的環境可以自動啟動)
sleep 5
done

标准的看门狗用法:
https://wiki.widora.io/zh/watchdog
修复看门狗的锅(OP官方把寄存器搞错了我勒个擦擦):
https://github.com/widora/openwrt_widora/commit/dc84f8bd09e0f3505ffb0adf3b85229b2e9bc7d4

@xinlan 这个没有确定之,看你具体APP的设计允许多长时间无响应。

这个看门狗的时间设计多少合适呢?

@xinlan 找到问题了,之前的固件系统procd里其实在也在操作看门狗,自己偷懒用脚本重新设置了看门狗寄存器,这样子存在干扰。
dts中关闭系统看门狗,mt7628an.dtsi里,看门狗部分加一条:

status = "disabled";

后再测试,一切正常。爽!!!!!!!
1522656086662-wechatsight33.mp4 (856 KB)

@xinlan 我再查查。

时间长了真的不行,芯片有bug?

更新一下脚本(此脚本不直接发起系统复位,针对32MB Winbond芯片情况,通过WDT引脚(WPS)输出低电平):
初始化看门狗:

#!/bin/sh
## start
reg w 10000120 0x3e80010
reg r 10000120
## set timeout
reg w 10000124 0x17d0
reg r 10000124
reg w 10000100 0x0202
reg r 10000100
## enable
reg w 10000120 0x3e80090
reg r 10000120
## WDT PIN
reg w 10000038 0x7fff0302
reg w 10000060 0x50005

喂狗(一旦喂狗就要一直喂下去,间隔1秒执行一次):

#!/bin/sh
while true
do
## ping
reg w 10000100 0x0202
reg w 10000120 0x3e80090
sleep 1
done

经过测试,设置延时太长了不起作用,暂未找到原因。
另外,WDT引脚低电平时间过短,最长可能也就16ms,所以外部需要复位IC参与了,购买了MAX811S在路上。
还测试出,不知道是不是看门狗有BUG! WDT计数器无规律停止,每次初始化后,一般能跑1-2秒左右就无规律停止,计数下降到0才会触发复位。
拍摄视频:1522461981822-qq20180331-100252.mp4 (2.09 MB)
!

@mango 你有遇到这个问题吗?

我的是16M的BIT4.0
我把时间改为10s (0x2710=10000)我的脚本是这样的
root@GZXCY:~# cat /bin/enable_wd.sh
#!/bin/sh
reg w 10000120 0x03e80000
reg w 10000124 0x2710
reg w 10000120 0x03e80090
我执行了这个脚本没有执行喂狗的脚本。
但是发现系统不会重新启动呢?

@wdlhpw 我确认一下这个事情!

@mango , 32M的直接连接的话,打开看门狗后不喂狗,2s后系统就down了,也不重启。那个低电平好像 最多4ms,不足以复位系统。

32M的验证了么?方法是什么样的?

@mangoMT7688的硬件看门狗watchdog玩法 中说:

WDT_RST_N

WDT_RST_N 这个管脚在底板上好像没有引出来吧

@wdlhpw 我看一下吧,需要借助WDT_RST_N,但前提是寄存器得设置好,让看门狗时间到了后输出有效的低电平去复位芯片

16M的验证过了,32M的只需要外接硬件连线把WDT_RST_N接到RST就行了,是么?

好的,我先验证下16M的吧。