標籤(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...