裝置樹學習總結

2021-10-09 17:32:23 字數 4596 閱讀 4249

標籤(label)

可以為節點建立標籤,別的地方引用時可以用標籤。標籤為可選項。

節點(node)

每個節點必須有乙個 「《名稱》[@《裝置位址》]」 /"[@]"形式的名字,[ ]為可選項,unit-address一般是記憶體位址。

名稱(name):乙個位元組大小

就是乙個不超過31位的簡單 ascii 字串,節點的命名應該根據它所體現的是什麼樣的裝置。比如乙個 3 com 乙太網介面卡的節點應該命名為 ethernet,而不應該是 3com509。

裝置位址(unit-address)

掛到記憶體空間的裝置,unit-address一般是記憶體位址。

用來訪問該裝置的主位址,並且該位址也在節點的reg屬性中列出,同級節點命名必須是唯一的,但只要位址不同,多個節點也可以使用一樣的通用名稱,當然裝置位址也是可選的,可以有也可以沒有

二、自定義屬性的設定與獲取?

參考:

三、常見屬性——compatible(相容性)​屬性:《製造商》,《型號》

指定了系統的名稱,是乙個字串的列表,實際在**中可以用於進行匹配,當前你選擇的是哪個機器,它包含了乙個"《製造商》,《型號》"形式的字串。重要的是要指定乙個確切的裝置 ,並且包括製造商的名字,以避免命名空間衝突。不要使用帶萬用字元的compatible值,比如"fsl,mpc83xx-uart" 或類似情況

如果乙個節點是裝置節點,那麼它一定要有compatible(相容性),因為這將作為驅動和裝置(裝置節點)的匹配依據。

compatible(相容性)的值可以有不止乙個字串以滿足不同的需求,詳見下一節。

而根節點的compatible也是非常重要的,因為系統啟動後,將根據根節點的compatible來判斷cpu資訊,並由此進行初始化

屬性設定的套路:

父節點的address-cells和size-cells決定子節點的reg的address和lenth欄位的長度,cell的單位為32bit

#address-cells=<1>  // 子節點reg的address為幾個32bit的整型資料

#size-cells=<1>     // 長度為幾個32bit整型資料,如果為0,則沒有lenth欄位

舉例:

node

ps7_axi_interconnect_0: amba@0 ;

} ;...

}五、常見屬性——reg屬性,例項見以上

reg的組織形式為 reg = ;

其中的每一組address1 lenth1表明了裝置使用的乙個位址範圍

六、常見屬性——gpio、時鐘、pinmux連線

1. gpio屬性的設定與獲取

gpio-controller表示「我是gpio控制器」;

#gpio-cells,設定gpio屬性的大小

舉例1:

ps7_gpio_0: ps7-gpio@e000a000 ;

ps7_ethernet_0: ps7-ethernet@e000b000 ;

舉例2:

/*imx6dl.dtsi中gpio1控制器的定義節點*/

gpio1: gpio@0209c000 ;

/*imx6qdl-sabreauto.dtsi中某個裝置節點*/

max7310_reset: max7310-reset ;

1、一般來說,我們把gpio屬性的名字起為***-gpios(***我們可以隨便起),這樣驅動才能通過特定api從識別該屬性,並轉換成具體的gpio號

2、該裝置節點中設定了reset-gpios = <&gpio1 15 1>;這格式是什麼意思呢?&gpio1 15引用了gpio1節點,故此處含義為gpio1_15這個引腳;最後乙個引數1則代表低電平有效,0則為高電平有效。至於gpio1_15具體對應哪個引腳,在imx6的手冊上都有詳細描述

3、其實最後乙個引數(高低電平有效)不是必須的,因為gpio1節點中設定了#gpio-cells = <2>;,所以才有兩個引數;某些soc的gpio節點中會設定為#gpio-cells = <1>;,那麼可以不寫最後乙個引數

參考:

七、常見屬性——中斷屬性:interrupts 和 interrupts

描述中斷連線需要四個屬性:

中斷控制器節點屬性:這類節點可能是中斷父節點

interrupt-controller-乙個空的屬性定義該節點作為乙個接收中斷訊號的裝置

#interrupt-cells-這是乙個中斷控制器節點的屬性。它宣告了該中斷控制器的中斷指示符中cell的個數(類似於#address-cells 和#size-cells )

中斷產生裝置節點屬性:

interrupt-parent-這是乙個裝置節點的屬性,包含乙個指向該裝置連線的中斷控制器的phandle(指向或者可以引用&)那些沒有interrupt-parent 的節點則從它們的父節點中繼承該屬性。

interrupts- 乙個裝置節點屬性,包含-乙個中斷指示符的列表,對應於該裝置上的每個中斷輸出訊號

1、某個裝置要使用中斷, 需要在裝置樹中如何描述中斷?

想使用中斷,節點中至少有有2個屬性:

interrupt-parent // 中斷產生裝置節點屬性:這個中斷要接到哪乙個裝置去? 即父中斷控制器是誰

interrupts // 中斷產生裝置節點屬性:表示要使用哪乙個中斷, 中斷的觸發型別等等。

父中斷控制器有兩種指定方法:

1)只有乙個中斷父裝置

interrupt-parent = <&父裝置標號》;

interrupts = <... ...>, <... ...>;

ethernet@20000000 ;

2)有多個中斷父裝置

interrupts-extended = <&父裝置標號 .....>, <... ... ...>;

buttons ;

假設某裝置節點需要乙個gpio中斷

/*先確定中斷所在的組*/

interrupt-parent = <&gpio6>;

/*表示中斷,gpio6中的第8個io,2為中斷觸發條件,下降沿觸發*/

interrupts = <8 2>;

interrupts = 13 (irq_type_edge_rising | gic_cpu_mask_******(2))>; 

可以參考gic的規範,第乙個u32表示中斷型別,第二個是中斷號,第三個是中斷觸發條件

而在驅動中使用中斷號 =irq_of_parse_and_map(node, index)函式返回值來得到中斷號

舉例:

/ ;intc:interrupt-controller@10140000;

}2、在裝置樹中,如何描述在父中斷控制器?(上述的interrupts屬性用多少個u32來表示?由它的父中斷控制器來描述)

在父中斷控制器中, 至少有2個屬性:

interrupt-controller; // 表示自己是乙個中斷控制器

#interrupt-cells // 表示自己的子裝置裡應該用幾個u32的資料來描述中斷

例如:gpf ;

3、如何找到乙個子中斷節點的父中斷控制器

一般在描述子中斷節點中都會有乙個屬性interrupt-parent,由此屬性描述。

如果子中斷節點中沒有此屬性,需要檢視此節點的父節點,一級一級往上直到父節點**現interrupt-parent

4、interrupts屬性的具體含義

參考:

5、驅動中使用這些中斷

參考:

6、gpio中斷使用方法

參考:

裝置樹學習(二)(裝置樹的規範)

dts v1 memory reservations 格式為 memreserve 從上面檔案布局我們能看到大概分為以下幾部分,我們依次介紹 1 dts v1 表示dts檔案的版本 2 memory reservations 格式為 memreserve 表示留給自己使用的記憶體。即核心不能使用這部...

linux裝置樹學習筆記備忘 裝置樹格式

1 裝置樹格式 label node name unit address 例子 1150 fusb0 fusb30x 22 格式一 label property name value 格式二 label property name property取值方式只有3種 arrays of cells 1...

裝置樹學習(四) uboot對裝置樹的支援)

這個比較簡單,我們知道在啟動核心的時候,需要把裝置樹的位址寫到r2暫存器中,但是怎麼寫到r2暫存器?a.u boot中核心啟動命令 bootm 無裝置樹,bootm 0x30007fc0 bootm 有裝置樹 比如 nand read.jffs2 0x30007fc0 kernel 讀核心uimag...