1、全志的硬件看门狗的驱动文件为sunxi_wdt.c文件,但是全志本身的看门狗并不能进行设置超时时间,本身的代码里面已经写好了喂狗函数以及设置超时时间的函数,我们只需要调用一下就可以,在watchdog_dev.c中进行修改write函数即可,修改后代码如下,或者直接用ioctl函数调用也可以。这样可以直接在命令行喂狗以及设置超时时间,如果是echo 0 >/dev/watchdog就是喂狗,echo V > /dev/watchdog停止看门狗,设置看门狗的状态,输入其他的数字就是设置看门狗的超时时间了,可以写一个脚本来循环喂狗测试效果。
static ssize_t watchdog_write(struct file *file, const char __user *data,
size_t len, loff_t *ppos)
{
struct watchdog_core_data *wd_data = file->private_data;
struct watchdog_device *wdd;
int err = -ENODEV;
char c;
size_t i;
if (len == 0)
return 0;
clear_bit(_WDOG_ALLOW_RELEASE, &wd_data->status);
for (i = 0; i != len; i++) {
if (get_user(c, data + i))
return -EFAULT;
if (c == 'V')
set_bit(_WDOG_ALLOW_RELEASE, &wd_data->status);
}
mutex_lock(&wd_data->lock);
wdd = wd_data->wdd;
if (wdd) {
char timeout_str[16];
int timeout_value;
/* Copy data to string buffer */
if (copy_from_user(timeout_str, data, len) != 0) {
mutex_unlock(&wd_data->lock);
return -EFAULT;
}
timeout_str[len] = '\0'; // Null-terminate the string
/* Convert data to int */
if (sscanf(timeout_str, "%d", &timeout_value) == 1) {
if(timeout_value == 0){
err = watchdog_ping(wdd);
}else{
err = watchdog_set_timeout(wdd, timeout_value);
if (err >= 0) {
err = watchdog_ping(wdd);
}
}
} else {
err = -EINVAL; // Invalid input format
}
}
mutex_unlock(&wd_data->lock);
return (err < 0) ? err : len;
}
2、脚本文件如下,test.sh
#!/bin/bash
WATCHDOG_DEVICE="/dev/watchdog"
FEED_INTERVAL=4
TIME=1
# 检查是否存在/dev/watchdog设备
if [ ! -e "$WATCHDOG_DEVICE" ]; then
echo "正在加载$WATCHDOG_DEVICE设备"
insmod /lib/modules/`uname -r`/sunxi_wdt.ko //加载驱动,自己的驱动看门狗文件
fi
# 打开/dev/watchdog设备
if ! exec 8> "$WATCHDOG_DEVICE"; then
echo "无法打开$WATCHDOG_DEVICE设备"
fi
# 定期喂狗
while true; do
echo 0 >&8
echo "$TIME"
sleep "$FEED_INTERVAL"
TIME=$((TIME + 1))
done