轉自:http://www.pianshen.com/article/274236825/;jsessionid=D90FC6B215155680E0B89A6D060892D4html
https://www.devicetree.org/node
Dtsi——相似於c語言的頭文件數組
Dts——相似於c語言的源文件session
Dtb——相似於c語言的編譯產物、二進制文件數據結構
使用device tree,用戶須要瞭解本身的硬件配置和系統運行參數,並把這些信息組織成device tree source file。DT是描述系統中的硬件信息,那些能夠被動態探測到的硬件設備不須要描述。經過dtc(device tree compiler),能夠將dts變成適合機器處理的dtb(device tree blob)。spa
Linux內核從3.x開始引入設備樹的概念,用於實現驅動代碼與設備信息相分離。在設備樹出現之前,全部關於設備的具體信息都要寫在驅動裏,一旦外圍設備變化,驅動代碼就要重寫。.net
設備樹主要有三個做用:htm
一、識別平臺單板 二、運行參數配置 三、設備構建blog
一、設備樹語法格式ci
DT的基本單元是node(節點),這些node被組織成樹狀結構。每一個node包含了若干個property/value,描述node的一些特性。一個設備樹只能有一個root node(根節點),其名字必須是‘/’。引用設備樹某個節點,可使用全路徑,也可使用句柄等方式。
一個Node被定義爲以下形式:
[label:] node-name[@unit-address] {
[properties [= value] ]
[child nodes]
}
A.[]——表示可選項
B.label:——標籤,方便dts文件的引用,經過符號‘&’進行引用
C.node-name——節點名字
D.@unit-addresss——若是node沒有reg屬性,不須要該選項;若是有就必須和reg第 一個地址相等(The unit-address must match the first address specified in the
reg property of the node——摘自Devicetree Specification Release v0.2,章節2.2.1 Node Names)。Unit-address具體格式和設備掛在哪一個bus上相關。好比:對於cpu, 其unit-address就是從0開始編址;若是是串口控制器,其就是寄存器地址。
E.property——設備屬性
非標準的屬性名字應該以該公司或者組織名稱開頭,好比:fsl,channel-fifo-len=<?>; zrevmm,vdev = "proxy";
也定義了一些標準的屬性:「compatible」,「model」,"device_type"都是用來表示 節點基本信息的,compatible = "virtio,mmio";
F.= value——屬性的定義是多種多樣的,能夠是空值、整型或者字符串。
G.child nodes——和Node格式同樣
二、常見屬性實例
「compatible」屬性是用來匹配驅動的,他的類型是字符串數組,每一個字符串表示一種設備的類型,從具體到通常。舉個例子就比較清楚了,好比某個串口控制器節點的屬性」compatible = 「fsl,mpc8641-uart」, 「ns16550"「。第一個字符串「fsl,mpc8641-uart」前邊部分是廠商(推測是frescale),後邊部分是控制器具體型號,這個形式也是規範建議的標準寫法。第二個字符串ns16550表示一類符合同一標準的串口控制器,比第一個字符串表示的範圍更大。內核匹配驅動時首先看是否有匹配第一個字符串的驅動,若是沒有的話再匹配第二個(若是有更多的,依次類推,因此優先匹配前邊的)。
"model"屬性用來表示設備的型號,用字符串表示,不像"compatible"用多個字符串,只需一個就夠了。
"device_type"屬性用來表示設備類型,用字符串表示。
@後地址和reg後第一個地址關係說明。它兩數值必須得一致。
下面舉一個實例節點分析:
對應的dts源碼
/{
cpus{
cpu@0{
};
cpu@1{
};
};
memory@0{
};
uart@fe001000{
};
ethernet@fe002000{
};
ethernet@fe003000{
};
};