努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2011/06/06/6527969.aspx

默认看门狗是不开机启动的,我们可以向/dev/watchdog写入数据来启动关闭看门狗。使用echo命令,经过我的测试,这个命令启动的作用是先打开那个文件,再写入内容,然后关闭。也就是open->write->release。

echo 0 > /dev/watchdog

此时打印出:

过了几秒后系统复位。

如果这样:

echo 0 > /dev/watchdog echo V > /dev/watchdog

则系统不会复位。

为什么这样呢,下面看看源码是怎样实现的,open函数:

static int s3c2410wdt_open(struct inode *inode, struct file *file) { if (test_and_set_bit(0, &open_lock)) return -EBUSY; printk("fuck open\n"); if (nowayout) __module_get(THIS_MODULE); allow_close = CLOSE_STATE_NOT; /* start the timer */ s3c2410wdt_start(); return nonseekable_open(inode, file); }

write函数:

static ssize_t s3c2410wdt_write(struct file *file, const char __user *data, size_t len, loff_t *ppos) { /* * Refresh the timer. */ if (len) { if (!nowayout) { size_t i; /* In case it was set long ago */ allow_close = CLOSE_STATE_NOT; for (i = 0; i != len; i++) { char c; if (get_user(c, data + i)) return -EFAULT; if (c == 'V') allow_close = CLOSE_STATE_ALLOW; } } s3c2410wdt_keepalive(); } return len; }

release函数:

static int s3c2410wdt_release(struct inode *inode, struct file *file) { /* * Shut off the timer. * Lock it in if it's a module and we set nowayout */ printk("fuck release\n"); if (allow_close == CLOSE_STATE_ALLOW) s3c2410wdt_stop(); else { dev_err(wdt_dev, "Unexpected close, not stopping watchdog\n"); s3c2410wdt_keepalive(); } allow_close = CLOSE_STATE_NOT; clear_bit(0, &open_lock); return 0; }

看门狗只能被一个进程打开,打开函数中先判断了一下,然后启动了看门狗;再看write函数,写入的如果是V则允许关闭看门狗,如果不是V仅仅喂狗一次;最后是release函数,如果允许关闭则关闭看门狗,如果不允许关闭,打印"Unexpected close, not stopping watchdog",喂狗一次。此时看门狗并没有关闭,所以系统会复位的,如果输入V则看门狗被关闭,这样系统就不复位了。

下面让看门狗开机启动:

查看启动信息:

首先make menuconfig进行配置:

在drivers/watchdog/s3c2410_wdt.c中进行修改:

#define CONFIG_S3C2410_WATCHDOG_ATBOOT (1) #define CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME (20)

设置成系统启动就启动看门狗,并且看门狗到期时间为20s。这样系统复位后每20s系统就会复位一次,所以我们在用户空间进行喂狗,驱动中的那个中断函数是当看门狗作为定时器时用的,所以没有实现喂狗,所以只能在用户程序中喂狗,下面是源码:

#include <stdio.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> #include <errno.h> #include <linux/watchdog.h> int main(int argc, char **argv){ int fd; fd = open("/dev/watchdog",O_RDONLY); if(fd < 0){ perror("/dev/watchdog"); return -1; } for(;;){ ioctl(fd, WDIOC_KEEPALIVE); sleep(3); } close(fd); return 0; }

然后:

arm-linux-gcc watchdog.c -o wdt

把wdt拷贝到root-2.6.30.4/sbin/下,并修改root-2.6.30.4/etc/init.d/rcS文件,添加wdt&这么一句,让系统启动后这个应用程序在后台运行:

#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin runlevel=S prevlevel=N umask 022 export PATH runlevel prevlevel # Mount virtual filesystem /bin/mount -t proc procfs /proc /bin/mount -n -t sysfs sysfs /sys /bin/mount -n -t usbfs usbfs /proc/bus/usb /bin/mount -t ramfs ramfs /dev # Make dir /bin/mkdir -p /dev/pts /bin/mkdir -p /dev/shm /bin/mkdir -p /var/log /bin/mount -n -t devpts none /dev/pts -o mode=0622 /bin/mount -n -t tmpfs tmpfs /dev/shm # Make device node echo /sbin/mdev > /proc/sys/kernel/hotplug /sbin/mdev -s /bin/hostname -F /etc/sysconfig/HOSTNAME wdt&

然后重新制作文件系统:

mkyaffs2image root-2.6.30.4 root-2.6.30.4.bin

此时由于用户程序在不断喂狗所以系统不复位了。再次查看启动信息:

分析看门狗源码s3c2410_wdt.c其中的中断处理函数是定时器中断处理函数。如果关闭复位功能,使能定时器功能,则中断处理函数中的喂狗也就是让定时器重新定时罢了。

ARM+LINUX移植攻略(十九)Linux驱动移植之看门狗相关推荐

  1. [RHEL5企业级Linux服务攻略]--第6季 Vsftpd服务全攻略之常规配置

    1.vsftpd服务软件包 vsftpd-2.0.5-10.el5.i386.rpm:vsftpd主程序包 2.vsftpd相关文档 /etc/vsftpd/vsftpd.conf:vsftpd的核心 ...

  2. [RHEL5企业级Linux服务攻略]--第5季 Sendmail服务全攻略之高级配置

    企业环境 公司邮件服务器,统一为员工设置企业邮箱,公司业务以销售为主,员工数量为300人并办公地点不固定.员工收发邮件一般较小,大部分为产品信息及销售报表.为了减少邮件服务器负荷,提高邮件传输效率,需 ...

  3. Prometheus+Node_exporter+Grafana监控(附送保姆级别linux安装攻略)

    Prometheus+Node_exporter+Grafana监控(附送保姆级别linux安装攻略) 前言:监控系统技术选型 从开发语言上看,为了应对高并发和快速迭代的需求,监控系统的开发语言已经慢 ...

  4. 安信可ESP32 LVGL_V8 最快移植攻略

    安信可ESP32 LVGL_V8 最快移植攻略 文章目录: 安信可ESP32 LVGL_V8 最快移植攻略 软件环境 硬件环境 ESP-S3-12K开发板介绍 开发板的参数 ESP32S3的SPI L ...

  5. 嵌入式知识-ARM裸机-学习笔记(8):SoC定时器与看门狗(WDT)

    嵌入式知识-ARM裸机-学习笔记(8):SoC定时器与看门狗(WDT) 一.定时器 1. 定时器简介 定时器是SoC中最常见的外设 (1)定时器与计数器.计数器是用来计数的(每隔一个固定时间会计一个数 ...

  6. TI Davinci DM6441嵌入式Linux移植攻略——UBL移植篇

    目录(?)[+] 一DM6441的Boot过程简介 二DM6441的UBL移植 CCS文件夹 Common文件夹 GNU文件夹 移植DDR2 移植Nand Flash 其它 声明:本文参考网友zjb_ ...

  7. linux内核(二)内核移植(DM365-DM368开发攻略——linux-2.6.32的移植)

    一.介绍linux-2.6.32: Linux-2.6.32的网上介绍:增添了虚拟化内存 de-duplicacion.重写了 writeback 代码.改进了 Btrfs 文件系统.添加了 ATI ...

  8. 【正点原子Linux连载】 第十九章 CAN Bus 摘自【正点原子】I.MX6U嵌入式Qt开发指南V1.0.2

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 3)全套实验源码+手册+视频下载地址: ...

  9. [RHEL5企业级Linux服务攻略]--第3季 DHCP服务全攻略

    1 DHCP原理  1.1 DHCP概述 DHCP(Dynamic Host Configuration Protocal)就是动态主机配置协议哈,可以自动配置主机的IP地址.子网掩码.网关及DNS等 ...

最新文章

  1. 敲的php代码怎么预览,php代码实现文件的预览
  2. 阿里程序员跳槽到小外企,再无996!业余时间开发APP,每月广告收入8万多!堪比阿里P8!...
  3. slf4j 和 log4基础入门(Maven配置)
  4. 多继承有什么坏处,为什么java搞单继承,接口为什么可以摈弃这些坏处
  5. 亚信联创java面试题_亚信联创面试题及答案
  6. redis-day1
  7. 只运行一个实例的写法
  8. Vue基本使用---vue工作笔记0002
  9. 很多大企业都在用的Pentaho 商业分析软件中存在多个严重缺陷
  10. vs2010+open244的永久性配置
  11. 动态规划之插头DP入门
  12. 如何在C#窗体中定义全局变量
  13. lcmgcd因数分解
  14. [渝粤教育] 中国农业大学 大学计算机基础 参考 资料
  15. php json转数组示例,php json转数组的例子
  16. 视频格式mp4转emf
  17. MATLAB 数据拟合 (使用 polyfit 多项式曲线拟合、polyval)
  18. js 根据公历日期 算出农历_显示阴历(农历)日期的js代码
  19. 融资融券的交易成本有哪些?
  20. 一花一世界 一叶一菩提

热门文章

  1. 一、关于STM32 SPI NSS的讨论
  2. dva是什么游戏_守望dva下载_守望dva大全_手游排行榜_网游/单机游戏_九游
  3. Unit2-电梯调度
  4. 信创实力认证,创邻科技荣获“2023爱分析·信创产品及服务创新奖”
  5. 第五十七章 Unity 混音器
  6. 数据库Mysql——sql语句大全
  7. mysql 查看是否锁表
  8. 【Firefly Ubuntu设置系统为中文失败原因说明及解决方法~】
  9. Linux 基础-一周目总结
  10. Android Input 输入系统学习