⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timerirq.c

📁 用于arm2410开发系统
💻 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 + -