註冊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 低準位觸發

results matching ""

    No results matching ""