Linux之IRQ domain


概述

Linux使用IRQ domain來描述一個中斷控制器(IRQ Controller)所管理的中斷源。換句話說,每個中斷控制器都有自己的domain。我們可以將IRQ Domain看作是IRQ Controller的軟件抽象。

這里所說的“中斷控制器”,不僅指硬件上實際存在的中斷控制器,也可以是一個“虛擬”的中斷控制器。例如,假設我們有一塊CPU,它有多個GPIO Pin可以作為外部中斷源使用(事實上大多數嵌入式CPU都有這樣的GPIO)。我們還假定所有的GPIO中斷都復用到該CPU的同一個中斷向量。在這樣的情況下,這多個GPIO中斷就可以抽象成一個虛擬的中斷控制器,它連接到CPU的某個中斷向量上。

這樣做的好處在於,可以將“對中斷控制器的中斷響應”和“對產生中斷的外部設備的中斷響應”分離開來。我們還是看一個例子,假定我們有若干個GPIO,分別接了不同外設(如按鍵、外部以太網控制器等),當這些外設產生中斷的時候,CPU內部的GPIO控制器會置位相應的中斷標志位,並向CPU提交中斷請求。這樣,對每一個外設中斷,我們實際上要進行兩級中斷服務:第一級中斷服務判斷是哪個GPIO產生了中斷,並需要清除GPIO控制器內部某個寄存器中的某個標志位;第二級中斷服務才是服務產生中斷的那個外設的。顯然,第一級中斷服務代碼對每個產生GPIO中斷的外設是類似的。有了IRQ Domain的幫助,第一級中斷服務代碼就可以統一,設備驅動程序只需要關心第二級中斷服務就可以了。

IRQ Domain的創建

有兩個函數可以用來創建IRQ Domain:irq_domain_add_linear和irq_domain_add_tree。對於大多數情況,前一個函數就夠用了:它在中斷源和irq_desc之間建立線性映射。如果硬件提供的可用中斷源較多(>256),而實際用到的很少,就可以用后者,避免無用的表項。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM