#include <linux/module.h>
#include <linux/types.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/mm.h> #include <linux/sched.h> #include <linux/init.h> #include <linux/cdev.h> #include <asm/io.h> #include <asm/system.h> #include <asm/uaccess.h> #include <linux/timer.h> #include <asm/atomic.h> #include <linux/delay.h> #include "ra_gp.h" #include "dc_gp_api.h"
#define DC_WDT_MAJOR 0
#define MODULE_NAME "dc_wdt" static int dc_wdt_major = DC_WDT_MAJOR; //static dev_t dc_wdt_dev; //struct cdev *dc_wdt; static dev_t dc_wdt_dev_t; //struct dc_wdt_dev //{ struct cdev *dc_wdt_cdev; static atomic_t counter; struct timer_list s_timer; //};
//struct dc_wdt_dev *dc_wdt_devp;
static void dc_wdt_timer_handle(unsigned long arg)
{ mod_timer(&s_timer, jiffies + HZ); atomic_inc(&counter); regwr(RA_GP_OUTPUT0_P,dcreg(RA_GP_OUTPUT0_P)|0x10); udelay(10); regwr(RA_GP_OUTPUT0_P,dcreg(RA_GP_OUTPUT0_P)&~0x10); }
static int __init dc_wdt_init(void)
{ int ret; regwr(RA_GP_PATCHPANEL_P4,0x00); regwr(RA_GP_CLIENTSEL_P_HI,dcreg(RA_GP_CLIENTSEL_P_HI)&~0x10); regwr(RA_GP_DRIVE0_P,dcreg(RA_GP_DRIVE0_P)|0x10); regwr(RA_GP_OUTPUT0_P,dcreg(RA_GP_OUTPUT0_P)|0x10);
ret = alloc_chrdev_region(&dc_wdt_dev_t, 0, 1, "wdt");
dc_wdt_major = MAJOR(dc_wdt_dev_t); if (ret < 0) { return ret; } dc_wdt_cdev=cdev_alloc(); dc_wdt_cdev->owner = THIS_MODULE; // result = alloc_chrdev_region( &dc_wdt_dev, 0, 1, MODULE_NAME ); ret = cdev_add(dc_wdt_cdev, dc_wdt_dev_t, 1); if (ret) { printk(KERN_NOTICE "Error %d", ret); } init_timer(&s_timer); s_timer.function = &dc_wdt_timer_handle; s_timer.expires = jiffies + HZ; add_timer(&s_timer); atomic_set(&counter, 0); return 0; }
static void __exit dc_wdt_exit(void)
{ del_timer(&s_timer); cdev_del(dc_wdt_cdev); // kfree(dc_wdt_devp); unregister_chrdev_region(MKDEV(dc_wdt_major, 0), 1); }
MODULE_AUTHOR("Song Baohua");
MODULE_LICENSE("Dual BSD/GPL");
//module_param(second_major, int, S_IRUGO);
module_init(dc_wdt_init);
module_exit(dc_wdt_exit); |
内核定时器的实现
最新推荐文章于 2024-08-24 17:51:41 发布