📄 irq_test.c
字号:
#include <linux/interrupt.h>#include <linux/module.h>#include <asm/hardware.h>#include <asm/irq.h>#include <asm/mach/irq.h>void do_irq30_tasklet(unsigned long param){ printk(KERN_INFO "IRQ30 Tasklet \n");}DECLARE_TASKLET(irq30_tasklet, do_irq30_tasklet, 0);int aic_set_type(unsigned irq, unsigned type){ unsigned int smr, srctype; switch (type) { case IRQT_HIGH: srctype = AT91_AIC_SRCTYPE_HIGH; break; case IRQT_RISING: srctype = AT91_AIC_SRCTYPE_RISING; break;#if 0 case IRQT_LOW: if ((irq == AT91_ID_FIQ) || is_extern_irq(irq)) /* only supported on external interrupts */ srctype = AT91_AIC_SRCTYPE_LOW; else return -EINVAL; break; case IRQT_FALLING: if ((irq == AT91_ID_FIQ) || is_extern_irq(irq)) /* only supported on external interrupts */ srctype = AT91_AIC_SRCTYPE_FALLING; else return -EINVAL; break;#endif default: return -EINVAL; } smr = at91_sys_read(AT91_AIC_SMR(irq)) & ~AT91_AIC_SRCTYPE; at91_sys_write(AT91_AIC_SMR(irq), smr | srctype); return 0;}irqreturn_t myIRQ(int irq, void *devid){ printk(KERN_INFO "IRQ test"); tasklet_schedule(&irq30_tasklet); return IRQ_HANDLED;}int init_module(void){ int ret; aic_set_type(30, IRQT_RISING); ret = request_irq(30, myIRQ, 0, "MYIRQ", 0); return 0; }void cleanup_module(void){ free_irq(30, 0);}/* * *PIOC_BSR = *PIOC_BSR | 0x00008000; //Enable IRQ functionality * *PIOC_PDR = *PIOC_PDR | 0x00008000; //Disable GPIO functionality. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -