IMX6ULL平台watchdog未停止报错及重启配置技术咨询
针对i.MX6ULL看门狗配置与重启问题的解决方法
环境信息
- i.MX6ULL处理器:MCIMX6Y2CVM08AB
- 内核版本:6.1.1
问题1:解决watchdog: watchdog0: watchdog did not stop!报错并实现正常重启
报错原因分析
该报错源于systemd关机流程中尝试关闭看门狗但未成功,结合你的设备树配置来看,fsl,ext-reset-output属性会让看门狗向外接引脚输出复位信号,但你的硬件中LCD_RESET引脚并未连接到系统复位回路,导致看门狗无法完成正常停止流程。
解决方案
方案1:调整设备树看门狗节点配置
如果不需要看门狗输出外部复位信号,直接移除fsl,ext-reset-output属性即可:
&wdog1 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_wdog>; // 移除fsl,ext-reset-output属性 status = "okay"; };
重新编译设备树并替换SD卡中的dtb文件后,重启即可消除报错并正常完成系统重启。
若必须保留外部复位输出,需确认硬件上LCD_RESET引脚是否连接到系统复位输入(如PMIC复位脚或处理器复位引脚),硬件未连接时该属性无实际作用,反而会引发报错。
方案2:内核启动参数调整(临时验证用)
若需快速验证,可在内核启动参数中添加nowatchdog禁用看门狗,但此方案不推荐长期使用,会丢失看门狗的硬件守护功能。
问题2:软件触发看门狗实现复位按键功能
方法1:直接操作/dev/watchdog设备文件
通过打开看门狗设备后停止喂狗,等待看门狗超时即可触发系统复位:
- Shell命令方式(需确保等待时间小于看门狗默认超时,可通过
cat /sys/class/watchdog/watchdog0/timeout查看当前超时值):
# 打开看门狗设备,10秒后超时复位(需根据实际超时调整数值) exec 3>/dev/watchdog && sleep 10
- C语言代码示例:
#include <stdio.h> #include <fcntl.h> #include <unistd.h> int main() { int fd = open("/dev/watchdog", O_WRONLY); if (fd < 0) { perror("Failed to open watchdog device"); return 1; } // 停止喂狗,等待超时复位 while (1) { sleep(1); } close(fd); return 0; }
方法2:结合GPIO按键实现复位功能
如果复位按键连接到LCD_RESET引脚,可通过以下步骤实现按键触发复位:
- 在设备树中添加GPIO按键节点,将LCD_RESET引脚配置为输入按键;
- 编写守护脚本监控按键事件,当检测到按键按下时,执行上述看门狗复位命令。
内容的提问来源于stack exchange,提问作者rpr
相关产品推荐
相关产品推荐

