Linux内核watchdog

本文基于RockPi 4A单板Linux 4.4内核介绍RK3399看门狗(watchdog)的调试方法。

一、驱动文件

RK3399 watchdog用的是新思(Synopsys)的IP,在watchdog驱动程序加载时,会注册misc设备,节点为/dev/watchdog

驱动文件:drivers/watchdog/dw_wdt.c

二、DTS配置

配置文件:arch/arm64/boot/dts/rockchip/rk3399.dtsi

watchdog具体配置如下:

watchdog@ff848000 {
        compatible = "snps,dw-wdt";
        reg = <0x0 0xff848000 0x0 0x100>; ## watchdog寄存器基地址和映射长度
        clocks = <&cru PCLK_WDT>; ## watchdog时钟
        interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH 0>; ## watchdog中断号和触发方式
};

三、调试方法

1、关闭看门狗

echo A > watchdog

写入除大写V以外的任意字符,不再喂狗,一段时间后系统会重启。

## drivers/watchdog/watchdog_dev.c
/*
 *  watchdog_write: writes to the watchdog.
 *  A write to a watchdog device is defined as a keepalive ping.
 *  Writing the magic 'V' sequence allows the next close to turn
 *  off the watchdog (if 'nowayout' is not set).
 */

static ssize_t watchdog_write(struct file *file, const char __user *data,
                        size_t len, loff_t *ppos)
{
    ...
}

例:

## 关闭看门狗后,等待一段时间后重启
root@linaro-alip:/dev# echo A > watchdog
[ 1502.302824] dw_wdt: unexpected close, system will reboot soon
root@linaro-alip:/dev# DDR Version 1.20 20190314  ## 系统重启
In
soft reset

2、打开卡门狗

echo V > watchdog

写入大写V,继续喂狗,系统不再重启。

例:

## 打开看门狗
root@linaro-alip:/dev# echo V > watchdog
root@linaro-alip:/dev#

3、CONFIG_WATCHDOG_NOWAYOUT

watchdog驱动程序中,需要关注宏CONFIG_WATCHDOG_NOWAYOUT。使用如下:

static bool nowayout = WATCHDOG_NOWAYOUT;
module_param(nowayout, bool, 0);
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started "
         "(default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");

如果配置了CONFIG_WATCHDOG_NOWAYOUT,通过echo命令写入任何字符,都不会关闭喂狗。

root@ubuntu:/home/run/code/rockchip-bsp/kernel/arch/arm64/configs# git diff rockchip_linux_defconfig
diff --git a/arch/arm64/configs/rockchip_linux_defconfig b/arch/arm64/configs/rockchip_linux_defconfig
index cfbc7774a15f..80265bdcd598 100644
--- a/arch/arm64/configs/rockchip_linux_defconfig
+++ b/arch/arm64/configs/rockchip_linux_defconfig
 CONFIG_WATCHDOG=y
 CONFIG_DW_WATCHDOG=y
+CONFIG_WATCHDOG_NOWAYOUT=y
 CONFIG_MFD_CROS_EC=y

例:

## 写入任何字符,都不会关闭喂狗
root@linaro-alip:~# echo A > watchdog
root@linaro-alip:~#

注:

使用./build/mk-kernel.sh rockpi4a编译内核时,即使修改了rockchip_linux_defconfig文件,编译时,相关配置也不会生效。需要在编译前make distclean或删除内核根目录下的.config文件后,重新编译内核。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 1
收藏 1
关注 140
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧
<tt id='oddrAII'><del></del></tt>
    <blockquote id='aSPShMFx'><dfn></dfn></blockquote><sup id='Neu'><span></span></sup><dfn id='URYNr'><blockquote></blockquote></dfn><blockquote id='XbkvZF'><strike></strike></blockquote>
      <blink id='hexyMdhv'><kbd></kbd></blink><label id='QiDo'><nobr></nobr></label>
      <optgroup></optgroup>
        <fieldset></fieldset><xmp id='rfAjKWTf'><big></big></xmp><strike id='yLqXnY'><strong></strong></strike>