我正在編寫一個設備驅動程序來處理PCIe卡的中斷,該PCIe卡當前適用於在IRQ線路上引發的任何中斷向量。處理多箇中斷源/向量的Linux設備驅動程序
但它有幾個類型可以引發,由Vector寄存器標記。所以現在我需要閱讀矢量信息,並且是一個有點聰明...
所以,做我: -
1 /有獨立開發的節點/dev/int1
,/dev/int2
等爲每個中斷類型,只是文件,讓int1
是矢量類型A等?
1.1 /由於每個文件/字符設備將有它自己的minor
號碼,當打開時,我會知道哪個是哪個。 我想。
1.2/ldd3似乎演示了這種方法。
2 /有一個節點/dev/int
(正如我現在所做的)並且有多個進程掛在同一個read
方法? 聽起來更好?!
2.1 /然後只喚醒正確的過程...?
2.2 /我使用單獨的wait_queue_head_t wait_queue
s嗎?還是不同的flag
/測試條件?
在read
方法: -
wait_event_interruptible(wait_queue, flag);
在處理程序不是真正的代碼!: -
int vector = read_vector();
if vector = A then
wake_up_interruptible(wait_queue, flag)
return IRQ_HANDLED;
else
return IRQ_NONE/IRQ_RETVAL?
編輯:從人民的意見說明: -
1)我的用戶空間代碼mmap
的所有的PCIe固件寄存器
2)用戶空間代碼有幾個線程,每個線程在設備驅動程序設備節點上執行阻塞read
,然後在發生中斷時從固件返回數據。我需要根據中斷類型喚醒正確的線程。
抱歉,文檔是專有/自定義固件。但內存映射包含一個源矢量,所以我知道哪種類型已被引發。謝謝,我有'request_irq'代碼位的工作,我的驅動程序掛起這個單一的IRQ,但PCIe卡引發不同的中斷,我們都知道,所有的中斷都引發同一個IRQ線。 – 2011-03-22 10:57:42
我沒有導出_interrupts_ per-sa,我公開了一個用於使用用戶空間的設備節點,因爲我可能不清楚,我更新了我的Q,另請參閱我的其他評論回覆。而'int'這個名字只是這裏的一個僞名。是的,你必須閱讀_vector_。 _(但沒有意義侮辱,但你的選擇1代碼看起來非常像我的僞代碼在我的Q !?(但是是實際的代碼!))_ – 2011-03-22 11:06:37
不要擔心,我不覺得侮辱,沒有處理irq的10種方法。這個例子的意思是你可以擁有一個單獨的irq處理程序,它可以獲取向量中所有可能的源,或者許多共享這個中斷的irq處理程序,它們都可以在向量中尋址一個irq源。對於版本1),您將擁有一個擁有多個隊列的設備,對於版本2),每個隊列都有多個設備。從你編輯的問題,我會說選項2可能看起來更簡單,更清潔。 – Longfield 2011-03-22 12:43:41