全志开发板看门狗喂狗问题

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值