設備驅動程序通過調用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"::) 。