5.註冊中斷處理程序
1)驅動程序可以通過request_irq()函數註冊一箇中斷處理程序,並激活給定的中斷線。函數原型如下:
int request_irq( unsigned int irq , irq_handler_t handler,
unsinged long flags, const char * name,
void *dev )
返回值:成功返回0,失敗返回非0。通常返回非0最常見的錯誤是-BUSY,它表示給定的中斷線已經在使用,或沒有指定共享。
第一個參數:要分配的中斷號。
第二個參數:一個函數指針,指向該驅動程序的中斷處理函數。中斷處理函數的原型我們已經在前面講過了。
第三個參數:可以爲0,也可以使是以下幾個取值.
IRQF_DISABLED:表示內核在處理此中斷處理程序本身期間,要禁止所有其它中斷。多數中斷處理程序不應該這麼做。
IRQF_SAMPLE_RANDOM:表示該設備產生的中斷會對內核熵池(entropy pool)有貢獻。內核熵池是用來產生隨機數的。所以,一般來說,只有中斷產生時機不可預測的中斷源纔會如此設置,否則,會使得產生的隨機數不是真正的隨機。像時鐘中斷這種有規律的中斷是堅決不應該這樣設置的。
IRQF_TIMER:系統定時器專用。即時鐘中斷。
IRQF_SHARED:表示允許多箇中斷處理程序共享同一個中斷線。只有此中斷線上的所有設備都設置了此標誌位,該中斷線纔是共享的。只要有一箇中斷處理程序表示自己不共享,那麼這條中斷線就無法共享。
注意,第三個參數可以是以上幾個選項中一個或多個的組合,如:IRQF_SAMPLE_RANDOM| IRQF_SHARED
第四個參數:是與該中斷處理程序相關聯的設備名。
第五個參數:指向該設備的一個可以唯一區分的指針。當該中斷線是非共享的時候,可以是NULL。如果中斷線是共享的,它上面有多箇中斷源,就無法通過中斷號唯一確定一個設備,所以就需要這樣一個指針來唯一定位一個設備。
2)注意:request_irq()函數可能會睡眠,所以,不能在中斷上下文或其它不允許睡眠的代碼中調用此函數。
3)硬件的初始化和註冊中斷處理程序的順序要正確,應先初始化設備,然後再註冊中斷處理程序。以防止出現中斷處理程序在設備初始化完成之前就開始執行,這種情況下,中斷處理程序根本無法正確指定完成。
4)釋放中斷處理程序。有生就有死,有註冊就要有釋放。當中斷處理程序不需要再使用的時候就需要進行釋放,釋放函數如下:
void free_irq ( unsigned int irq, void *dev );
第一個參數是終端號,第二個參數是指向該設備的唯一確定的指針。
刪除中斷處理程序後,如果該中斷線上已經沒有其他中斷處理程序,那麼,該函數以會將這個中斷線禁止掉。