轉載於 : https://www.cnblogs.com/xiaojiang1025/p/6131381.html 部分內容
另外 : https://blog.csdn.net/qq_16777851/article/details/87291146
一個計算機系統中大量設備都是通過中斷請求CPU服務的,所以設備節點中就需要在指定中斷號。常用的屬性有
- interrupt-controller 一個空屬性用來聲明這個node接收中斷信號,即這個node是一個中斷控制器。
- #interrupt-cells,是中斷控制器節點的屬性,用來標識這個控制器需要幾個單位做中斷描述符,用來描述子節點中"interrupts"屬性使用了父節點中的interrupts屬性的具體的哪個值。一般,如果父節點的該屬性的值是3,則子節點的interrupts一個cell的三個32bits整數值分別為:<中斷域 中斷 觸發方式>,如果父節點的該屬性是2,則是<中斷 觸發方式>
- interrupt-parent,標識此設備節點屬於哪一個中斷控制器,如果沒有設置這個屬性,會自動依附父節點的
- interrupts,一個中斷標識符列表,表示每一個中斷輸出信號
設備樹中中斷的部分涉及的部分比較多,interrupt-controller表示這個節點是一個中斷控制器,需要注意的是,一個SoC中可能有不止一個中斷控制器,這就會涉及到設備樹中斷組織的很多概念,下面是在文件"arch/arm/boot/dts/exynos4.dtsi"中對exynos4412的中斷控制器(GIC)節點描述:
要說interrupt-parent,就得首先講講Linux設備管理中對中斷的設計思路演變。隨着linux kernel的發展,在內核中將interrupt controller抽象成irqchip這個概念越來越流行,甚至GPIO controller也可以被看出一個interrupt controller chip,這樣,系統中至少有兩個中斷控制器了,另外,在硬件上,隨着系統復雜度加大,外設中斷數據增加,實際上系統可以需要多個中斷控制器進行級聯,形成事實上的硬件中斷處理結構:
在這種趨勢下,內核中原本的中斷源直接到中斷號的方式已經很難繼續發展了,為了解決這些問題,linux kernel的大牛們就創造了irq domain(中斷域)這個概念。domain在內核中有很多,除了irqdomain,還有power domain,clock domain等等,所謂domain,就是領域,范圍的意思,也就是說,任何的定義出了這個范圍就沒有意義了。如上所述,系統中所有的interrupt controller會形成樹狀結構,對於每個interrupt controller都可以連接若干個外設的中斷請求(interrupt source,中斷源),interrupt controller會對連接其上的interrupt source(根據其在Interrupt controller中物理特性)進行編號(也就是HW interrupt ID了)。有了irq domain這個概念之后,這個編號僅僅限制在本interrupt controller范圍內,有了這樣的設計,CPU(Linux 內核)就可以根據級聯的規則一級一級的找到想要訪問的中斷。當然,通常我們關心的只是內核中的中斷號,具體這個中斷號是怎么找到相應的中斷源的,我們作為程序員往往不需要關心,除了在寫設備樹的時候,設備樹就是要描述嵌入式軟件開發中涉及的所有硬件信息,所以,設備樹就需要准確的描述硬件上處理中斷的這種樹狀結構,如此,就有了我們的interrupt-parant這樣的概念:用來連接這樣的樹狀結構的上下級,用於表示這個中斷歸屬於哪個interrupt controller,比如,一個接在GPIO上的按鍵,它的組織形式就是:
中斷源--interrupt parent-->GPIO--interrupt parent-->GIC1--interrupt parent-->GIC2--...-->CPU
有了parant,我們就可以使用一級一級的偏移量來最終獲得當前中斷的絕對編號,這里,可以看出,在我板子上的dm9000的的設備節點中,它的"interrupt-parent"引用了"exynos4x12-pinctrl.dtsi"(被板級設備樹的exynos4412.dtsi包含)中的gpx0節點:
而在gpx0節點中,指定了"#interrupt-cells = <2>;",所以在dm9000中的屬性"interrupts = <6 4>;"表示dm9000的的中斷在作為irq parant的gpx0中的中斷偏移量,即gpx0中的屬性"interrupts"中的"<0 22 0>",通過查閱exynos4412的手冊知道,對應的中斷號是EINT[6]。
gpio
gpio也是最常見的IO口,常用的屬性有
- "gpio-controller",用來說明該節點描述的是一個gpio控制器
- "#gpio-cells",用來描述gpio使用節點的屬性一個cell的內容,即 `屬性 = <&引用GPIO節點別名 GPIO標號 工作模式>
GPIO的設置同樣采用了上述偏移量的思想,比如下面的這個led的設備書,表示使用GPX2組的第7個引腳:
驅動自定義key
針對具體的設備,有部分屬性很難做到通用,需要驅動自己定義好,通過內核的屬性提取解析函數進行值的獲取,比如dm9000節點中的下面這句就是自定義的節點屬性,用以表示配置EEPROM不可用。