如何在 Linux 中使用看门狗添加更多原因导致重启的 FLAG?

How to add more FLAG of reason cause reboot with watchdog in Linux?

我将 iMX8MM 与 Yocto 一起使用。我正在尝试找出导致 Watchdog 重启的原因。

我发现watchdog.h有很多FLAGs:

#define WDIOF_OVERHEAT 0x0001 /* Reset due to CPU overheat */
#define WDIOF_FANFAULT 0x0002 /* Fan failed */
#define WDIOF_EXTERN1 0x0004 /* External relay 1 */
#define WDIOF_EXTERN2 0x0008 /* External relay 2 */
#define WDIOF_POWERUNDER 0x0010 /* Power bad/power fault */
#define WDIOF_CARDRESET 0x0020 /* Card previously reset the CPU */
#define WDIOF_POWEROVER 0x0040 /* Power over voltage */
#define WDIOF_SETTIMEOUT 0x0080 /* Set timeout (in seconds) */
#define WDIOF_MAGICCLOSE 0x0100 /* Supports magic close char */
#define WDIOF_PRETIMEOUT 0x0200 /* Pretimeout (in seconds), get/set */
#define WDIOF_KEEPALIVEPING 0x8000 /* Keep alive ping reply */

但是当我用命令检查时,我只得到 4 个 FLAGs:

$ wdctl

Device: /dev/watchdog
Identity: imx2+ watchdog [version 0]
Timeout: 60 seconds
Pre-timeout: 0 seconds
FLAG                   DESCRIPTION                          STATUS           BOOT-STATUS
KEEPALIVEPING          Keep alive ping reply                  1                   0
MAGICCLOSE             Supports magic close char              0                   0
PRETIMEOUT             Pretimeout (in seconds)                0                   0
SETTIMEOUT             Set timeout (in seconds)               0                   0

如何使用更多的 FLAG?

您在 watchdog.h 中看到的宏(标志)是完整列表。但是,应用程序实用程序(此处 wdctl)正在从内核读取驱动程序功能实现。

你看到的另一个标志 WDIOF_OVERHEAT 内核驱动程序应该支持其他标志,然后只有它可用于 wdctl 列表。

查看 wdctl 的源代码是按以下方式工作的。它正在调用 read_watchdog_from_device API 来获取已实现的标志(环境监控)。

请检查来自 i.MX8MM 看门狗 imx2_wdt.c 的相应驱动程序中的标志。

参考文献:https://github.com/karelzak/util-linux/blob/master/sys-utils/wdctl.c https://www.kernel.org/doc/Documentation/watchdog/watchdog-api.txt

我就是这样解决上面的问题的。

  1. 查找所有关于 imx2+ watchdog 包的文件 concert。

  2. 通过添加更多标志作为 watchdog.h 文件进行了修改。

  3. 访问 Yocto 中的 menuconfig 并打开 Watchdog 部分中的一些选项。此操作可确保 bitbake 识别驱动程序中的更改。

  4. 重建并生成 OS 图像。