详解linux 看门狗驱动编写

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

1、代码目录

drivers/watchdog 

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

config HAVE_S3C2410_WATCHDOG
  bool
  help
   This will include watchdog timer support for Samsung SoCs. If
   you want to include watchdog support for any machine, kindly
   select this in the respective mach-XXXX/Kconfig file. 

config S3C2410_WATCHDOG
  tristate "S3C2410 Watchdog"
  depends on HAVE_S3C2410_WATCHDOG || COMPILE_TEST
  select WATCHDOG_CORE
  select MFD_SYSCON if ARCH_EXYNOS
  help
   Watchdog timer block in the Samsung SoCs. This will reboot
   the system when the timer expires with the watchdog enabled. 

   The driver is limited by the speed of the system's PCLK
   signal, so with reasonably fast systems (PCLK around 50-66MHz)
   then watchdog intervals of over approximately 20seconds are
   unavailable. 

   The driver can be built as a module by choosing M, and will
   be 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 软件看门狗 watchdog使用介绍
(0)

相关推荐

  • Linux 软件看门狗 watchdog使用介绍

    背景: root@119.10.6.23:/usr/local/php# ps aux|grep watchdog root 6 0.0 0.0 0 0 ? S Aug28 4:50 [watchdog/0] root 10 0.0 0.0 0 0 ? S Aug28 4:11 [watchdog/1] root 14 0.0 0.0 0 0 ? S Aug28 3:58 [watchdog/2] root 18 0.0 0.0 0 0 ? S Aug28 3:36 [watchdog/3] 附

  • 详解linux 看门狗驱动编写

    看门狗是linux驱动的一个重要环节.某些特殊的设备,有时候需要放在一些环境恶劣的地方,比如电信设备.但是,任何软件都不可能100%没有bug.如何保证软件在遇到严重bug.死机的时候也能正常运行呢,那么看门狗就是有效的一种方法.看门狗一般要求用户定时喂狗,如果一段时间没有喂狗的话,那么系统就会自动重启.今天,我们就来看看这个看门狗驱动怎么编写? 1.代码目录 drivers/watchdog 2.阅读目录下的Kconfig,可以找一个s3c模块macro config HAVE_S3C2410

  • 详解linux usb host驱动编写入门

    usb协议是一个复杂的协议,目前涉及到的版本就有usb1.0, usb2.0, usb3.0.大家如果打开kernel usb host目录,就会发现下面包含了ohci,uhci,ehci,xhci,whci等多种形式的控制器驱动.那么,对于我们这些不是很了解usb的开发人员,如何了解usb的代码结构呢? 1.代码分布 drivers/usb目录下面,host目录包括了host驱动代码,core目录包含了主要的api接口代码,而其他目录则主要是device驱动代码. 2.device驱动怎么看

  • 详解linux电源管理驱动编写

    对于嵌入式设备来说,合适的电源管理,不仅可以延长电池的寿命,而且可以省电,延长设备运行时间,在提高用户体验方面有很大的好处.所以,各个soc厂家在这方面花了很多的功夫.下面,我们可以看看linux是如何处理电源管理驱动的. 1.代码目录 drivers/regulator 2.查看目录下的Kconfig文件 menuconfig REGULATOR bool "Voltage and Current Regulator Support" help Generic Voltage and

  • 详解linux 摄像头驱动编写

    对于现代嵌入式设备,特别是手机来说,摄像头是很重要的一个设备.很多同学买手机,一看颜值,第二就看摄像头拍照如何.所以,从某个角度来说,摄像头是各个厂家主打的应用功能.那么,linux是如何支持摄像头的,我们可以来看一下? 1.代码目录地址 drivers/media 2.v4l2框架 目前linux上的camera都是按照v4l2框架来设计,它的地址位于drivers/media/v4l2-core 3.查看三星soc是如何支持camera的,可以查看drviers/media/platform

  • 详解linux pwm驱动编写

    pwm方波可以用来控制很多的设备,比如它可以被用来控制电机.简单来说,就是单位时间内的方波越多,那么电机的转速就会越快:反之就越慢.通过这个特性,soc就可以轻松地利用pwm对外设进行自动控制.所以,今天的主题就是pwm驱动. 1.驱动目录 drivers/pwm 2.查看对应目录下的Kconfig config PWM_SAMSUNG tristate "Samsung PWM support" depends on PLAT_SAMSUNG || ARCH_EXYNOS help

  • 详解linux lcd驱动编写

    有些嵌入式设备是不需要lcd的,比如路由器.但是,还有些设备是需要lcd显示内容的,比如游戏机.测试仪.智能手表等等.所以,今天我们就看看lcd驱动在linux上是怎么进行的. 1.代码目录 drivers/video 2.查看video下的Makefile文件 # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_VGASTATE) += vgastate.o obj-$(CONFIG_HDMI) += hdmi.o obj-$(CONFIG_VT)

  • 详解linux dma驱动编写

    linux下面的驱动虽然什么样的情形都有,但是dma驱动却并不少见.dma可以有很多的好处,其中最重要的功能就是能够帮助我们将数据搬来搬去,这个时候cpu就由时间去做别的事情了,提高了设备效率. 1.dma驱动在什么地方 drivers/dma 2.如何看s3c的dma驱动,先看Kconfig config S3C24XX_DMAC bool "Samsung S3C24XX DMA support" depends on ARCH_S3C24XX || COMPILE_TEST se

  • 详解linux驱动编写(入门)

    在我离职之前,工作内容几乎不涉及到驱动方面的知识.我所要做的内容就是把客户对设备的请求拆分成一个一个的接口,调用驱动的设置进行配置就可以了.当然,至于驱动下面是怎么实现那就要根据具体情况而定了.比如说,有的驱动是芯片厂商直接写好的,假设芯片厂商提供了对应平台的sdk函数,那么驱动的工作就是对这些sdk函数进行封装就可以了,另外一种就是自己编写具体平台的驱动接口了.比如说,现在你需要编写串口.i2c.i2s.FLASH.网卡.LCD.触摸屏.USB驱动了.这个时候,你手里面除了一堆芯片手册,啥也没

  • 详解linux 驱动编写(sd卡驱动)

    随着sd卡的流行,sd卡在嵌入式设备上使用的场景也越来越多.那下面我们可以看一下,linux驱动框架上是怎么处理sd卡驱动的? 1.代码目录地址 drivers/mmc 2.基本结构 从mmc的代码结构可以看得出,主要分为两个部分,其中core为协议部分,host为各个soc的适配部分 host是我们需要真正关心的代码 3.以s3c为例,观察makefile obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o ...... obj-$(CONFIG_MMC_S3

  • 详解Linux 主机网络接入配置

    详解Linux 主机网络接入配置 前言: 网络配置是我们在安装好操作系统之后,需要解决的第一步.现时代没有接入网络的主机已然等同于一堆废铁.在网络配置的过程中,通常我们需要配置本机IP地址,缺省网关,DNS,主机名等等.本文主要描述在Linux环境下,主要以传统命令行方式讲解如何将主机接入网络.对于网路配置的新命令如ip,nmcli等等在以后的文章中描述. 一.网络配置概述 主机接入互联网前提:遵循TCP/IP协议栈 配置主机接入TCP/IP网络需要配置的内容:   IP/Netmask   路

随机推荐