管理,则Watchdog平台驱动的设备挂起和恢复功能均有效*/static unsigned long wtcon_save;static unsigned long wtdat_save;static int s3c2410wdt_suspend(struct platform_device *dev, pm_message_t state){/* Save watchdog state, and turn it off. */wtcon_save = readl(wdt_base + S3C2410_WTCON);wtdat_save = readl(wdt_base + S3C2410_WTDAT);/* Note that WTCNT doesnt need to be saved. */s3c2410wdt_stop();return 0;}static int s3c2410wdt_resume(struct platform_device *dev){/* Restore watchdog state. */writel(wtdat_save, wdt_base + S3C2410_WTDAT);writel(wtdat_save, wdt_base + S3C2410_WTCNT); /* Reset count */writel(wtcon_save, wdt_base + S3C2410_WTCON);printk(KERN_INFO PFX "watchdog %sabled\n",(wtcon_save & S3C2410_WTCON_ENABLE) ? "en" : "dis");return 0;}#else#define s3c2410wdt_suspend NULL#define s3c2410wdt_resume NULL#endif /* CONFIG_PM *//*注意:这是使用了一个__devexit_p,还有前面使用了__devinit和__devexit,我们还是先来讲讲这个:在Linux内核中,使用了大量不同的宏来标记具有不同作用的函数和数据结构,这些宏在include/linux/init.h头文件中定义,编译器通过这些宏可以把代码优化放到合适的内存位置,以减少内存占用和提高内核效率。__devinit、__devexit就是这些宏之一,在probe()和remove()函数中应该使用__devinit和__devexit宏。又当remove()函数使用了__devexit宏时,则在驱动结构体中一定要使用__devexit_p宏来引用remove(),所以下面就用__devexit_p来引用rtc_remove*/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", /*注意这里的名称一定要和系统中定义平台设备的名称一致,这样才能把平台设备与该平台设备的驱动关联起来*/},};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);MODULE_AUTHOR("Ben Dooks
, ""Dimitry Andric ");MODULE_DESCRIPTION("S3C2410 Watchdog Device Driver");MODULE_LICENSE("GPL");MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);MODULE_ALIAS("platform:s3c2410-wdt");配置内核,默认情况下已经配置
Devide drivers --->
<*> Watchdog Timer Support --->
<*> s3c2410 wathcdog
测试:
我们可以使用echo向/dev/watchdog设备随便写入一些数据即可开启看门狗,比如:echo 0 > /dev/watchdog如果等待15秒钟,系统自动重启。
由驱动程序知道,只要写入“V”就可以停止看门狗,echo –n V > /dev/watchdog,-n是去掉回车。
下面是一个图形化各个主要函数之间层次关系,更清晰的了解驱动程序。
module_init(&s3c24xx_i2c_driver)
|__ platform_driver_register(&s3c24xx_i2c_driver)
|__ s3c24xx_i2c_probe
| |__ platform_get_resource
| |__ request_irq
| |__ misc_register(&s3c2410wdt_miscdev)
| |__ &s3c2410wdt_fops
| |__ s3c2410wdt_open
| |__ s3c2410wdt_release
| |__ s3c2410wdt_write
| |__ s3c2410wdt_ioctl
| |__ no_llseek
|__ s3c2410wdt_remove
|__ s3c2410wdt_shutdown
|__ s3c2410wdt_suspend
|__ s3c2410wdt_resume
module_exit(watchdog_exit)
|__ platform_driver_unregister(&s3c2410wdt_driver)