Linux下的Watchdog驱动

来源:互联网 发布:ps4白金神作 知乎 编辑:程序博客网 时间:2024/05/16 01:39

版权所有,转载必须说明转自 http://my.csdn.net/weiqing1981127 

 

对于看门狗驱动,在我们内核中把这些代码放在/driver/watchdog文件夹下面,但是watchdog并没有子系统,每个驱动都是独立的,需要我们根据自己的平台去编写看门狗驱动,比如mini2440看门狗驱动代码就是/driver/watchdog/S3c2410_wdt.c,这个代码比较简单,我不想多分析,这里主要讲下移植和应用层使用的方法。另外对于Watchdog设备。内核中的说明文档在/Document/wdt.txt

 

一般我们移植一个驱动,先在内核中找到驱动文件,这个就需要我们知道常见的一些设备的驱动分布在我们内核的哪个子系统,哪个目录下。当找到了这个驱动文件后,一般先浏览驱动文件的顺序是从下往上看,先看模块加载函数,一般会定义一个平台驱动,比如

static struct platform_driver s3c2410wdt_driver = {

       .probe            = s3c2410wdt_probe,

       .remove          = __devexit_p(s3c2410wdt_remove),

       .shutdown      = s3c2410wdt_shutdown,

       .suspend  = s3c2410wdt_suspend,

       .resume          = s3c2410wdt_resume,

       .driver            = {

              .owner    = THIS_MODULE,

              .name      = "s3c2410-wdt",  //驱动名

       },

};

然后我们在Source Insight中查找"s3c2410-wdt"相关所有文件,这样会在Devs.c中找到如下代码

static struct resource s3c_wdt_resource[] = {

       [0] = {

              .start = S3C24XX_PA_WATCHDOG,

              .end   = S3C24XX_PA_WATCHDOG + S3C24XX_SZ_WATCHDOG - 1,

              .flags = IORESOURCE_MEM,

       },

       [1] = {

              .start = IRQ_WDT,

              .end   = IRQ_WDT,

              .flags = IORESOURCE_IRQ,

       }

};

struct platform_device s3c_device_wdt = {

       .name               = "s3c2410-wdt",

       .id             = -1,

       .num_resources       = ARRAY_SIZE(s3c_wdt_resource),

       .resource   = s3c_wdt_resource,

};

需要注意的是如果Devs.c中没有定义,而在其他文件中找到设备名,那么需要在BSP中添加平台设备。好了,下面打开我们的BSP文件mach-mini2440.c,在mach-mini2440.c这个mini2440开发板的BSP中把这个s3c_device_rtc加入到mini2440_devices数组

static struct platform_device *mini2440_devices[] __initdata = {

       ……

       & s3c_device_wdt , //添加

};

这样配置完后,进行make zImage生成zImage内核镜像。

 

Watchdog驱动测试

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <sys/fcntl.h>

#include <linux/watchdog.h>

#define DEV_NAME     "/dev/watchdog"

int main(int argc, char *argv[])

{

       int fd = -1;

      

       if ((fd = open(DEV_NAME, O_RDONLY)) < 0)

       {

              perror("open error");

              exit(1);

       }

       for(;;)

       {

              ioctl(fd, WDIOC_KEEPALIVE);  //喂狗

              sleep(5);

       }

       close(fd);

       return 0;

}

上面是应用层喂狗程序,当加载内核后移,必须每隔15秒执行一次该文件,如果你不喂狗,那么系统会在15秒后重启。

原创粉丝点击