📄 testirq.c
字号:
/* * 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -