内核定时器的实现
来源:互联网 发布:企业网站源码带手机版 编辑:程序博客网 时间: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"
#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;
//};
#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);
}
{
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);
{
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;
}
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);
}
{
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_LICENSE("Dual BSD/GPL");
//module_param(second_major, int, S_IRUGO);
module_init(dc_wdt_init);
module_exit(dc_wdt_exit);
module_exit(dc_wdt_exit);
0 0
- 内核定时器的实现
- linux内核定时器的实现
- linux内核定时器的实现
- linux内核时钟与定时器的实现
- linux内核定时器的实现(2)
- 【内核】: 内核定时器的使用
- 内核定时器的使用
- 内核定时器的使用
- 内核定时器的使用
- 内核定时器的使用
- 内核定时器的使用
- 【内核】:定时器的使用
- 内核定时器的例子
- 内核定时器的使用
- 内核定时器的使用
- 内核定时器的使用
- 内核定时器的学习
- 内核定时器的使用
- u-boot修改main.c实现bootloader里喂狗
- ubuntu gparted不能启动问题解决
- 什么是人月,如何简单估算人月
- Spring Boot系列教程三:使用devtools实现热部署
- storm trident实战 filter,function的使用
- 内核定时器的实现
- 企业小号来啦!统一钉铛2.1新功能升级啦
- python数据分析与挖掘学习笔记(3)_小说文本数据挖掘part2
- Python练手项目0009
- 如何自动创建结点
- 关于android studio生成jar库的方法(aidl)
- 设计模式之模板方法模式
- 基于Java开发的免费网络拓扑软件-SugarNMSTool
- MySQL索引介绍