#include<linux/module.h>
#include<linux/timer.h>
#include<linux/jiffies.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/err.h>
#include <asm/io.h>
#define IBX_GPIO12_OUT ( 1 << 12 )
#define IBX_GPIO44_OUT ( 1 << 12)
#define IBEX_GPIOBASE (0x500)
#define GP_LVL (IBEX_GPIOBASE + 0x0c)
#define GP_LVL2 (IBEX_GPIOBASE+0x38)
#define GPIO_USE_SEL (IBEX_GPIOBASE + 0x00)
#define GP_IO_SEL (IBEX_GPIOBASE+0x04)
#define GPIO_USE_SEL2 (IBEX_GPIOBASE + 0x30)
#define GP_IO_SEL2 (IBEX_GPIOBASE+0x34)
#define TRUE 1
#define FALSE 0
typedef unsigned int uint32;
typedef unsigned char BOOL;
struct timer_list watchdogtimer;
BOOL Enablewatchdog( BOOL b)
{
uint32 value;
if(b){
value=inl(GP_LVL2)&(~IBX_GPIO44_OUT);
outl(value,GP_LVL2);
if(inl(GP_LVL2)&(IBX_GPIO44_OUT))
return FALSE;
else
return TRUE;
}else{
value=inl(GP_LVL2)|(IBX_GPIO44_OUT);
outl(value,GP_LVL2);
if(inl(GP_LVL2)&(IBX_GPIO44_OUT))
return TRUE;
else
return FALSE;
}
}
static void feed_dog(unsigned long data)
{
uint32 forword;
forword=inl(GP_LVL)|IBX_GPIO12_OUT;
outl(forword,GP_LVL);
if((forword=inl(GP_LVL))&(IBX_GPIO12_OUT)){
msleep(8000);
forword&=(~IBX_GPIO12_OUT);
outl(forword,GP_LVL);
}else{
printk(KERN_ALERT"feed dog fault !\n");
mod_timer(&watchdogtimer,jiffies+1*HZ);
return;
}
mod_timer(&watchdogtimer,jiffies+10*HZ);
}
static int __init watchdogtimer_init(void)
{
uint32 value;
value=inl(GPIO_USE_SEL2)|IBX_GPIO44_OUT;
outl(value,GPIO_USE_SEL2);
value=inl(GP_IO_SEL2)&(~IBX_GPIO44_OUT);
outl(value,GP_IO_SEL2);
value=inl(GPIO_USE_SEL)|IBX_GPIO12_OUT;
outl(value,GPIO_USE_SEL);
value=inl(GP_IO_SEL)&(~IBX_GPIO12_OUT);
outl(value,GP_IO_SEL);
setup_timer(&watchdogtimer,feed_dog,0);
watchdogtimer.expires=jiffies+2*HZ;
if(Enablewatchdog(TRUE))
{
printk(KERN_ALERT"Watchdog is start succeed !\n");
add_timer(&watchdogtimer);
}else{
printk(KERN_ALERT"Watchdog is start fail !\n");
}
return 0;
}
static void __exit watchdogtimer_exit(void)
{
if(Enablewatchdog(FALSE))
{
printk(KERN_ALERT"Watchdog is stop succeed !\n");
del_timer(&watchdogtimer);
}else{
printk(KERN_ALERT"Watchdog is stop fault !\n");
}
}
module_init(watchdogtimer_init);
module_exit(watchdogtimer_exit);
MODULE_LICENSE("GPL");
内核驱动之内核定时器示例
最新推荐文章于 2024-01-07 18:59:04 发布