设备驱动程序通过调用request_irq函数来申请中断,通过free_irq来释放中断。它们在linux/sched.h中的定义如下:
int request_irq(
unsigned int irq,
void (*handler)(int irq,void dev_id,structpt_regs *regs),
unsigned long flags,
const char *device,
void *dev_id
);
void free_irq(unsigned int irq, void*dev_id);
通常从request_irq函数返回的值为0时,表示申请成功;负值表示出现错误。
— irq表示所要申请的硬件中断号。
— handler为向系统登记的中断处理子程序,中断产生时由系统来调用,调用时所带参数irq为中断号,dev_id为申请时告诉系统的设备标识,regs为中断发生时寄存器内容。
— device为设备名,将会出现在/proc/interrupts文件里。
— flag是申请时的选项,它决定中断处理程序的一些特性,其中最重要的是决定中断处理程序是快速处理程序(flag里设置了SA_INTERRUPT)还是慢速处理程序(不设置SA_INTERRUPT)。
下面的代码将在SBC-2410X的Linux中注册外部中断2。
eint_irq = IRQ_EINT2;
set_external_irq (eint_irq, EXT_FALLING_EDGE,GPIO_PULLUP_DIS);
ret_val =request_irq(eint_irq,eint2_handler, “S3C2410Xeint2”,0);
if(ret_val < 0){
return ret_val;
}
用来打开和关闭中断的函数如下:
#define cli() _asm_ _volatile_("cli"::)
#define sli() _asm_ _volatile_("sli"::) 。