内核定时器的实现

来源:互联网 发布:企业网站源码带手机版 编辑:程序博客网 时间:2024/06/17 16:33
#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);
0 0
原创粉丝点击