驅動程序可以通過下面的函數註冊並激活一箇中斷處理程序,以便處理中斷:
int request_irq(unsigned int irq,
irqreturn_t (*handler)(int ,void *,struct pt_regs *),
unsigned long irqflags,
const char * devname,
void *dev_id)
第一個參數表示分配的中斷號。
第二個參數handler是一個指針,指向處理這個中斷的實際中斷處理程序。
第三個參數irqflags可以是0,也可以是下列一個或多個標誌的位掩碼:
SA_INTERRUPT:此標誌表明給定的中斷處理程序是一個快速中斷處理程序(fast interrupt handler).在本地處理器上,快速中斷處理程序在禁止所有中斷的情況下運行。這使得快速中斷處理程序能夠不受其他中斷的干擾,得以迅速執行。而默認情況下(沒有這個標誌),除了正運行的中斷處理程序應的那條中斷線被屏蔽外,其他所有中斷都是激活的。除了時鐘中斷外,絕大多數中斷都不使用該標誌。
SA_SAMPLE_RANDOM:此標誌表明這個設備產生的中斷對內核熵池有貢獻。內核熵池負責提供從各種隨機事件導出的真正的隨機數。如果制訂了該標誌,那麼來自該設備的中斷間隔時間就會作爲熵填充到熵池。如果你的設備以預知的速率產生中斷(比如系統定時器),或者可能受外部攻擊者的影響,那麼就不要設置這個標誌。相反,有其他很多硬件產生中斷的速率是不可預知的,所以都能成爲一種較好的熵源。、
SA_SHIRQ:此標誌表明可以在多箇中斷處理程序之間共享中斷線。在同一個給定線上註冊的每個處理程序必須指定這個標誌;否則,在每條線上只能有一個處理程序。
第四個參數dev_id主要用於共享中斷線。
卸載驅動程序時,需要註銷相應的中斷處理程序,並釋放中斷線。使用:
free_irq(unsigned int irq,void *dev_id)
編寫中斷處理程序
static irqreturn_t intr_handler(int irq,void *dev_id,struct pt_regs *regs)
第二個參數dev_id是一個通用指針,它與在中斷處理程序註冊時傳遞給request_irq()的參數dev_id必須一致。如果該值有唯一確定性,那麼它就相當於一個cookie,可以用來區分共享同一中斷處理程序的多個設備。
最後一個參數regs是一個指向結構的指針,該結構包含處理中斷之前處理器的寄存器和狀態。除了調試的時候,它們很少使用到。事實上,目前開發者的興趣顯示這個參數可能不再使用。
中斷處理程序可能返回兩個特殊的值
當中斷處理程序檢測到一箇中斷,但該中斷對應的設備並不是在註冊處理函數期間指定的產生源時,返回IRQ_NONE;
當中斷處理程序被正確調用,且確實是它所對應的設備產生了中斷時,返回IRQ_HANDLED.另外,也可以使用宏IRQ_RETVAL(x).如果x爲非0值