设为首页 加入收藏

TOP

S3C6410在Linux下的WATCHDOG TIMER(看门狗定时器)驱动
2014-11-24 12:51:42 来源: 作者: 【 】 浏览:0
Tags:S3C6410 Linux WATCHDOG TIMER 看门 定时器 驱动


还是先说下整体结构,又要说到大家很熟悉的平台设备了,同样看门狗定时器也是作为平台设备存在的,但与以前的不同的地方是,看门狗定时器是一种混杂设备,先介绍下混杂设备。


1、混杂设备


1.1、混杂设备并没有明确的定义。它的主设备号是10,不同的设备用次设备号区分。混杂设备用结构体miscdevice表示,源码如下:


struct miscdevice {
int minor; 次设备号
const char *name; 设备名
const struct file_operations *fops;设备的操作函数,与字符设备相同
struct list_head list; 链接混杂设备的链表
struct device *parent;指向父设备
struct device *this_device;指向设备结构体
};


对应的看下看门狗中的定义:


在S3c2410_wdt.c (linux2.6.28\drivers\watchdog)文件中


static struct miscdevice s3c2410wdt_miscdev = {
.minor = WATCHDOG_MINOR,
.name = "watchdog",
.fops = &s3c2410wdt_fops,
};


其中还有:


/* kernel interface */
static const struct file_operations s3c2410wdt_fops = {
.owner = THIS_MODULE,
.llseek = no_llseek,
.write = s3c2410wdt_write,
.unlocked_ioctl= s3c2410wdt_ioctl,
.open = s3c2410wdt_open,
.release = s3c2410wdt_release,
};


1.2、混杂设备的注册和注销


内核提供了misc_register用于注册一个混杂设备。


/**
* misc_register-register a miscellaneous device
* @misc: device structure


int misc_register(struct miscdevice * misc)


同样对应的内核提供了misc_deregister用于混杂设备的注销。


/**
* misc_deregister - unregister a miscellaneous device
* @misc: device to unregister


int misc_deregister(struct miscdevice *misc)


2、再来看看门狗定时器作为平台设备存在


static struct platform_driver s3c2410wdt_driver = {
.probe = s3c2410wdt_probe,
.remove = s3c2410wdt_remove,
.shutdown = s3c2410wdt_shutdown,
.suspend = s3c2410wdt_suspend,
.resume = s3c2410wdt_resume,
.driver = {
.owner = THIS_MODULE,
.name = "s3c2410-wdt",
},
};


static char banner[] __initdata =
KERN_INFO "S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics\n";

static int __init watchdog_init(void)
{
printk(banner);
return platform_driver_register(&s3c2410wdt_driver);
}
static void __exit watchdog_exit(void)
{
platform_driver_unregister(&s3c2410wdt_driver);
}
module_init(watchdog_init);
module_exit(watchdog_exit);


看到这些,你可能都看腻了。没办法,接着来,平台设备的资源定义在


Devs.c (linux2.6.28\arch\arm\plat-s3c64xx)文件中:


/* Watchdog */
static struct resource s3c_wdt_resource[] = {
[0] = {
.start = S3C64XX_PA_WATCHDOG,
.end = S3C64XX_PA_WATCHDOG + S3C64XX_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,
};

EXPORT_SYMBOL(s3c_device_wdt);


3、S3c2410_wdt.c (linux2.6.28\drivers\watchdog)文件开头一些变量的含义(参考于网络和书籍),如下所示:



】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇利用XDoclet自动生成Hibernate配.. 下一篇Linux驱动修炼之道-混杂设备

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何利用Python做数 (2025-12-24 23:48:36)
·如何使用python进行 (2025-12-24 23:48:34)
·python 爬虫入门该怎 (2025-12-24 23:48:31)
·Java 实现多个大文件 (2025-12-24 23:22:00)
·Java多线程编程在工 (2025-12-24 23:21:56)