testirq.c

来自「嵌入式LINUX下的中断程序例子」· C语言 代码 · 共 97 行

C
97
字号
/* * File:		testirq.c  * Purpose:		test the external interrupt respond speed of MCF5249 * Developer:		wing.zhang (stanxerror@hotmail.com) * Copyright: 		HHTECH Co., Ltd (www.hhcn.com)  */ #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>/*use gpio5 as the input external irq*/#define EXTERNAL_IRQ     (128+37)#define MBAR_ADDR        0x10000000#define MBAR2_ADDR       0x80000000#define GPIO_FUNCTION    0x00C#define GPIO_EN          0x008#define GPIO_OUT         0x004#define GPIO_INT_CLEAR   0x0C0#define GPIO_INT_STAT    0x0C0#define GPIO_INT_EN      0x0C4#define GPIO1_FUNCTION   0x0BC#define GPIO1_EN         0x0B8#define GPIO1_OUT        0x0B4void testirq_interrupt(int,void *,struct pt_regs *);int testirq_init(void);void gpio_int_enable(void);/**********************************************************///Interrupt Functionvoid testirq_interrupt(int irq,void *d,struct pt_regs *regs){	/*clear interrupt register for INT 37*/	*(volatile unsigned long *)(MBAR2_ADDR+GPIO_INT_CLEAR) |= 0x00000020;	/*reverse gpio1 output*/	*(volatile unsigned long *)(MBAR2_ADDR+GPIO_OUT)^=0xFFFFFFFF;}void gpio_int_enable(void){	/*enable interrupt for gpio5*/	*(volatile unsigned long *)(MBAR2_ADDR+GPIO_INT_EN) |=0x00000020;	/*level assignment for gpio5 (mbar2+150)*/        *(volatile unsigned long *)0x80000150 |= 0x00400000;}void gpio_int_disable(void){	*(volatile unsigned long *)(MBAR2_ADDR+GPIO_INT_EN) &= 0xFFFFFFDF;}/****************************************************///Initialize Functionstatic int __init testirq_init(void){		static int result;	printk("test_irq : EXTERNAL_IRQ = %d\n",EXTERNAL_IRQ);	result=request_irq(EXTERNAL_IRQ,&testirq_interrupt,SA_INTERRUPT,"testirq",NULL);	if (result == -1)	{		printk("Can't get assigned irq %d\n",EXTERNAL_IRQ);		return result;	}	gpio_int_enable();	/*switch ddata1/gpio1 to gpio output*/	*(volatile unsigned long *)(MBAR2_ADDR+GPIO_EN) |=0x00000002;	*(volatile unsigned long *)(MBAR2_ADDR+GPIO_FUNCTION) |=0x00000002;	printk("Testirq interrupt registered ok!!!\n");#if 0 	*(volatile unsigned long *)(MBAR2_ADDR+GPIO_EN) |=0x00000002;	*(volatile unsigned long *)(MBAR2_ADDR+GPIO_FUNCTION) |=0x00000002;	for(result=0;result<1000;result++) {		printk("output -gpio0\n"); 		/*turn gpio0 output*/		*(volatile unsigned long *)(MBAR2_ADDR+GPIO_OUT)^=0xFFFFFFFF;	}#endif	return 0;}static void __exit testirq_exit(void){	gpio_int_disable();	free_irq(EXTERNAL_IRQ, testirq_interrupt);}module_init(testirq_init);module_exit(testirq_exit);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?