1、内部看门狗使用说明
内部看门狗使用WDOG1,
复位输出控制选择WDOG1_B —— MX6UL_PAD_GPIO1_IO08__WDOG1_WDOG_B
注:该引脚正常使用时为高电平,当看门狗超时或系统重启后输出低电平,仅设备重新上电才能够恢复为高电平。
【IMX6ULL参考手册(11/2017 )——59.5.6.2 WDOG_B generation (P4087)】
&iomuxc {
pinctrl-names = "default";
……
pinctrl_gpio1_wdg1: gpio1_wdg1_grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO08__WDOG1_WDOG_B 0x30b0
>;
};
……
};
&wdog1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio1_wdg1>;
fsl,ext-reset-output;
timeout-sec = <5>;
status = "okay";
};
fsl,ext-reset-output 开启复位输出
timeout-sec 设置看门狗超时复位时间,上述配置为5S
Device Drivers --->
[*] Watchdog Timer Support --->
[*] Update boot-enabled watchdog until userspace takes over
<*> IMX2+ Watchdog
其中/dev/watchdog0便是内部看门狗WDOG1
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
-
#define cst_str2(c1, c2) (((unsigned int)0 | \
-
(char)c2) << 8 | \
-
(char)c1)
-
-
-
int main(int argc, char *argv[])
-
{
-
int fd;
-
int flags;
-
int timeout =
10;
-
int dummy =
0;
-
-
fd =
open(
"/dev/watchdog0", O_WRONLY);
-
-
if (fd ==
-1) {
-
printf(
"Watchdog open fail.\n");
-
exit(
-1);
-
}
-
-
if (argc >
1) {
-
switch (
cst_str2(argv[
1][
0], argv[
1][
1]))
-
{
-
case cst_str2('-','s'):
-
if(argc > 2)
-
timeout =
atoi(argv[
2]);
-
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
-
printf(
"set timeout : %d\n", timeout);
-
break;
-
case cst_str2('-', 'g'):
-
ioctl(fd, WDIOC_GETTIMEOUT, &timeout);
-
printf(
"get timeout : %d\n", timeout);
-
break;
-
case cst_str2('-', 'e'): //使能看门狗
-
flags = WDIOS_ENABLECARD;
-
ioctl(fd, WDIOC_SETOPTIONS, &flags);
-
printf(
"Watchdog card enabled.\n");
-
break;
-
case cst_str2('-', 'd'): //禁用看门狗
-
flags = WDIOS_DISABLECARD;
-
ioctl(fd, WDIOC_SETOPTIONS, &flags);
-
printf(
"Watchdog card disabled.\n");
-
close(fd);
-
return
0;
-
break;
-
-
default:
-
printf(
"\
-
\t-s set timeout.\n\
-
\t-g get timeout.\n\
-
\t-d to disable.\n\
-
\t-e to enable.\n\
-
");
-
break;
-
}
-
}
-
-
while (
1) {
-
ioctl(fd, WDIOC_KEEPALIVE, &dummy);
//喂狗
-
sleep(
1);
-
}
-
}
imx6ull外部看门狗使用GPIO控制,利用GPIO输出高低电平保证看门狗芯片(CAT823TTDI-GT3 )不重启。
&iomuxc {
pinctrl-names = "default";
……
pinctrl_gpio_wdog: gpio_wdg_grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO01__GPIO1_IO01 0x010b0
>;
};
……
};
/ {
model = "Freescale i.MX6 ULL 14x14 EVK Board";
compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";
……
watchdog {
compatible = "linux,wdt-gpio";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_wdog>;
gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
hw_algo = "toggle";
always-running;
hw_margin_ms = <1000>;
};
……
};
hw_margin_ms 电平反转周期
Device Drivers --->
[*] Watchdog Timer Support --->
[*] Update boot-enabled watchdog until userspace takes over
<*> Watchdog device controlled through GPIO-line
[*] Register the watchdog as early as possible
其中/dev/watchdog1便是外部看门狗设备,无需控制,GPIO1_IO01引脚每隔1000ms自动进行两次电平反转。