📄 timerirq.c
字号:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/signal.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/interrupt.h>
#include <asm/irq.h>
#include <asm/arch/hardware.h>
#include <asm/arch/irqs.h>
#include <asm/io.h>
static unsigned int r_TCFG0,r_TCFG1,r_TCNTB1,r_TCMPB1,r_TCON,r_GPCCON,
r_GPCUP,r_GPCDAT;//,r_PRIORITY;//r_GPBCON, r_GPBUP;
//devfs_handle_t devfs_timerirq;
//#define TIMERIRQ_MAJOR 253
void timerirq_interrupt(int irq,void *d,struct pt_regs *regs)
{
/*clear interrupt register for INT_TIMER1*/
SRCPND &= (~0x00000800); //bit11
INTPND = INTPND;
// EINTPEND &= (~0x00100000); //bit20
(*(volatile unsigned int *)r_GPCDAT) ^=0xFFFFFFFF;
// printk("Beginning interrupt service!\n");
// (*(volatile unsigned int *)r_TCON) &= (~0x00000100);
}
static int address_map(void)
{
r_TCFG0 = ioremap(0x51000000,4);
r_TCFG1 = ioremap(0x51000004,4);
r_TCNTB1 = ioremap(0x51000018,4);
r_TCMPB1 = ioremap(0x5100001C,4);
r_TCON = ioremap(0x51000008,4);
// r_GPBCON = ioremap(0x56000010,4);
// r_GPBUP = ioremap(0x56000018,4);
r_GPCCON = ioremap(0x56000020,4);
r_GPCDAT = ioremap(0x56000024,4);
r_GPCUP = ioremap(0x56000028,4);
// r_PRIORITY = ioremap(0x4A00000C,4);
return 0;
}
static int __init timerirq_init(void)
{
static int result;
address_map();
#if 0 //priority
*(volatile unsigned int *)r_PRIORITY &=(~0x00000040);
*(volatile unsigned int *)r_PRIORITY &=(~0x00000004);
*(volatile unsigned int *)r_PRIORITY |=0x00100000;
*(volatile unsigned int *)r_PRIORITY &=(~0x00080000);
*(volatile unsigned int *)r_PRIORITY |=0x00001000;
*(volatile unsigned int *)r_PRIORITY &=(~0x00000800);
#endif
// (*(volatile unsigned int *)r_TCFG0) |= 0x000000FF;//prescaler=255
(*(volatile unsigned int *)r_TCFG0) &= 0x11111100;//prescaler=0
#if 0 //MUX1=1/4
(*(volatile unsigned int *)r_TCFG1) &= (~0x000000E0);
(*(volatile unsigned int *)r_TCFG1) |= 0x00000010;
#endif
(*(volatile unsigned int *)r_TCFG1) &= (~0x000000F0);//MUX1=1/2
(*(volatile unsigned int *)r_TCNTB1) = 25000;
(*(volatile unsigned int *)r_TCMPB1) = 0x00000000;
//1ms
(*(volatile unsigned int *)r_TCON) |= 0x00000E00;
(*(volatile unsigned int *)r_TCON) &= (~0x00000200);
(*(volatile unsigned int *)r_TCON) |= 0x00000100;
// (*(volatile unsigned int *)r_GPBCON) = 0x00000008;
// (*(volatile unsigned int *)r_GPBUP) &= (~0x00000002);
(*(volatile unsigned int *)r_GPCUP) &= (~0x00000040);
(*(volatile unsigned int *)r_GPCCON) = 0x00001000;
disable_irq(IRQ_TIMER1);
enable_irq(IRQ_TIMER1);
result=request_irq(IRQ_TIMER1,&timerirq_interrupt,SA_INTERRUPT,"timerirq",NULL);
if (!result)
{
printk("Get assigned irq %d,result=%d\n",IRQ_TIMER1,result);
// return result;
}
printk("***********Init ok!!***********\n");
return 0;
}
static void __exit timerirq_exit(void){
(*(volatile unsigned int *)r_TCON) &= (~0x00000100);
disable_irq(IRQ_TIMER1);
free_irq(IRQ_TIMER1, NULL);
printk("exit ok\n");
}
module_init(timerirq_init);
module_exit(timerirq_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -