註冊ISR
驅動程式如果要收到裝置送出的中斷訊號,必須先登記中斷處理程序IRQ(Interrupt ReQuest),登錄中斷處理程序用的是 request_irq() 這個 kernel 函式:
int request_irq(unsigned int irq,irqreturn_t (*handler)(int,void*,struct pt_regs*), unsigned long flags, const char *dev_name, void *dev_id);
以下介紹各項目代表意義:
unsigned int irq
想要索取的中斷通道之編號。
void (*handler)(int,void*,struct pt_regs*)
要被安裝的ISR的函式指標,此函式觸發後的行為模式。
unsigned long flags
flags是關於中斷管理的選項之位元遮罩。
const char *dev_name
代表ISR的字串。此字串會被顯示在/pro/interrupt
void *dev_id
此指標用於共享IRQ。它是一個識別碼,在釋放IRQ時需要用到,在驅動程式使用自己的私有資料區也需要此識別碼(用以辨認是哪一個裝置發出的中斷)。
flags引數是選用的,可傳入下列旗標以OR的結合的結果。不指定的話會傳回0。
旗標 | 舊旗標 | 意義 |
---|---|---|
IRQF_DISABLED | SA_INTERRUPT | 處理中斷時,禁止本地處理器進一步收到中斷。現在幾乎用不到。 |
IRQF_SHARED | SA_SHIRQ | 共享IRQ |
IRQF_SAMPLE_RANDOM | SA_SAMPLE_RANDOM | 中斷發生頻率以亂數(/dev/random、/dev/urandom)決定 |
flag設定中斷觸發條件的值
旗標 | 意義 |
---|---|
IRQF_TRIGGER_RISING | 上升緣觸發 |
IRQF_TRIGGER_FALLING | 下降緣觸發 |
IRQF_TRIGGER_HIGH | 高準位觸發 |
IRQF_TRIGGER_LOW | 低準位觸發 |