【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

看门狗是linux驱动的一个重要环节。某些特殊的设备,有时候需要放在一些环境恶劣的地方,比如电信设备。但是,任何软件都不可能100%没有bug。如何保证软件在遇到严重bug、死机的时候也能正常运行呢,那么看门狗就是有效的一种方法。看门狗一般要求用户定时喂狗,如果一段时间没有喂狗的话,那么系统就会自动重启。今天,我们就来看看这个看门狗驱动怎么编写?

1、代码目录

drivers/watchdog

2、阅读目录下的Kconfig,可以找一个s3c模块macro

config HAVE_S3C2410_WATCHDOGboolhelpThis will include watchdog timer support for Samsung SoCs. Ifyou want to include watchdog support for any machine, kindlyselect this in the respective mach-XXXX/Kconfig file.config S3C2410_WATCHDOGtristate "S3C2410 Watchdog"depends on HAVE_S3C2410_WATCHDOG || COMPILE_TESTselect WATCHDOG_COREselect MFD_SYSCON if ARCH_EXYNOShelpWatchdog timer block in the Samsung SoCs. This will rebootthe system when the timer expires with the watchdog enabled.The driver is limited by the speed of the system's PCLKsignal, so with reasonably fast systems (PCLK around 50-66MHz)then watchdog intervals of over approximately 20seconds areunavailable.The driver can be built as a module by choosing M, and willbe called s3c2410_wdt

3、S3C2410_WATCHDOG主要依赖WATCHDOG_CORE,可以继续跟踪Makefile

obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o

4、macro只依赖一个s3c2410_wdt.c文件,继续查看

static SIMPLE_DEV_PM_OPS(s3c2410wdt_pm_ops, s3c2410wdt_suspend,s3c2410wdt_resume);static struct platform_driver s3c2410wdt_driver = {.probe     = s3c2410wdt_probe,.remove     = s3c2410wdt_remove,.shutdown  = s3c2410wdt_shutdown,.id_table    = s3c2410_wdt_ids,.driver      = {.name   = "s3c2410-wdt",.pm  = &s3c2410wdt_pm_ops,.of_match_table   = of_match_ptr(s3c2410_wdt_match),},
};module_platform_driver(s3c2410wdt_driver);

5、确认driver为platform类型,继续在probe函数中查找有用的code

 ret = watchdog_register_device(&wdt->wdt_device);if (ret) {dev_err(dev, "cannot register watchdog (%d)\n", ret);goto err_cpufreq;}

6、网上继续查找,寻找到和watchdog有关的数据结构

static const struct watchdog_info s3c2410_wdt_ident = {.options          =     OPTIONS,.firmware_version =    0,.identity         =  "S3C2410 Watchdog",
};static const struct watchdog_ops s3c2410wdt_ops = {.owner = THIS_MODULE,.start = s3c2410wdt_start,.stop = s3c2410wdt_stop,.ping = s3c2410wdt_keepalive,.set_timeout = s3c2410wdt_set_heartbeat,.restart = s3c2410wdt_restart,
};static const struct watchdog_device s3c2410_wdd = {.info = &s3c2410_wdt_ident,.ops = &s3c2410wdt_ops,.timeout = S3C2410_WATCHDOG_DEFAULT_TIME,
};

7、找到设备注册函数、函数结构基本就算结束了,当然有中断的话,也可以确认一下

 ret = devm_request_irq(dev, wdt_irq->start, s3c2410wdt_irq, 0,pdev->name, pdev);if (ret != 0) {dev_err(dev, "failed to install irq (%d)\n", ret);goto err_cpufreq;}

8、有兴趣的话,可以找一个函数阅读一下。比如下面这个重启函数,可以和spec对比者来看

static int s3c2410wdt_restart(struct watchdog_device *wdd, unsigned long action,void *data)
{struct s3c2410_wdt *wdt = watchdog_get_drvdata(wdd);void __iomem *wdt_base = wdt->reg_base;/* disable watchdog, to be safe  */writel(0, wdt_base + S3C2410_WTCON);/* put initial values into count and data */writel(0x80, wdt_base + S3C2410_WTCNT);writel(0x80, wdt_base + S3C2410_WTDAT);/* set the watchdog to go and reset... */writel(S3C2410_WTCON_ENABLE | S3C2410_WTCON_DIV16 |S3C2410_WTCON_RSTEN | S3C2410_WTCON_PRESCALE(0x20),wdt_base + S3C2410_WTCON);/* wait for reset to assert... */mdelay(500);return 0;
}

linux驱动编写(看门狗)相关推荐

  1. linux驱动编写(入门)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在我离职之前,工作内容几乎不涉及到驱动方面的知识.我所要做的内容就是把客户对设备的请求拆分成一 ...

  2. linux驱动编写--2--应用程序控制led闪烁

    本系列教程的上一篇:  linux驱动编写--1--点亮led 目标:编写一个驱动程序,实现上一篇没写的 "接口".并编写一个测试程序,透过驱动来控制led闪烁. 硬件:micro ...

  3. 【分析笔记】Linux gpio_wdt.c 看门狗设备驱动源码分析

    基本原理 该看门狗的设备驱动实现原理很简单,比较主要的有两点: 一.定时器喂狗 通过定时器根据配置文件配置的喂狗方式(如脉冲切换.电平切换),对指定的 gpio 进行脉冲切换或电平切换实现喂狗. 脉冲 ...

  4. linux驱动编写(设备树)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 对于linux的开发者来说,设备树其实比较熟悉.但是为什么要有设备树,很多人不了解,其实本质来说 ...

  5. linux驱动编写(platform总线和网卡驱动)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 对于linux驱动来说,一般的架构还是按照bus-host-device的形式来进行的.比如就拿 ...

  6. linux驱动编写(虚拟字符设备编写)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 昨天我们说了一些简单模块编写方法,但是终归没有涉及到设备的编写内容,今天我们就可以了解一下相关 ...

  7. Linux驱动编写入门-新解

    1.驱动编写后是一个C文件,通过make命令对其进行编译,生成 .KO文件,这个文件就是可执行的驱动文件,通过使用insmod xx.ko即可执行此驱动文件.如下为一个完整的驱动程序C文件.(用的是讯 ...

  8. linux软件实现看门狗,一个软件实现的Linux看门狗—soft_wdt

    soft_wdt(下面简称本软件)是一个软件实现的Linux看门狗. 本软件是一款开源.免费软件. 下载地址: 本软件和/drivers/watchdog/softdog.c实现的软件看门狗差点儿一样 ...

  9. disk磁盘管理与Linux驱动编写

    磁盘管理 一.关于硬盘接口 安装linux red hat系统,到分区时发现硬盘驱动器设备 /dev/sda            #sata接口设备名 /dev/sda1#sda对应的物理分区 /d ...

最新文章

  1. 安卓获取浏览器上网记录_Android 获取浏览器当前分享页面的截屏示例
  2. conda 修改环境名称
  3. Time value help in webclient UI
  4. MySQL的timestamp类型自动更新问题
  5. 信息学奥赛一本通(1252:走迷宫)
  6. 用easyx画五角星_【洛谷日报#195】有个东西叫EasyX
  7. 拯救者linux无法正常关机,菜鸟求助。centos无法关机。请各位高手帮忙! - Linux论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  8. 离职盗取代码、倒卖获利800万,北京西二旗程序员被逮捕
  9. JavaScript的组成
  10. R语言各个包里面的数据集
  11. 层次分析法(AHP),超详解,进来秒懂!!
  12. 58-高级路由:双点双向重分发
  13. Excel格式的SNP数据怎么变为plink格式
  14. NS2中GOD的使用
  15. python换照片底色_Python学习给照片换底色(蓝底换红底)
  16. 【洛谷】P5149 会议座位
  17. Java初学者使用Scanner通过键盘输入学生成绩,并使用while循环实现重复输入,计算成绩的平均分及优秀率等
  18. 使用Opencv2+Pyqt5实现人脸识别视频马赛克
  19. PG-REINFORCE tensorflow 2.0
  20. 适合中介的二手房房源管理系统

热门文章

  1. 第三章·MySQL版本区别及管理
  2. Python学习week4-set集合
  3. php大数除法保留精度问题
  4. 转载 MySql常用查询语句(23种)
  5. 配置文件空格丢失问题
  6. 数组的去重-----------------------来自大牛的讲解
  7. C++11多线程03
  8. RabbitMQ、Redis
  9. 2015某大型电商集团的前端实习生在线笔试题(无耻的拿来偷看了)
  10. Atitit.Gui控件and面板----数据库区-mssql 2008 权限 配置 报表查看成员