一. 設備樹的由來
1.1. 什么是設備樹
1.1.1. Device Tree 可以描述的信息包括CPU的數量和類別,內存基地址和大小,總線和橋,外設連接,中斷控制器和中斷使用情況,Clock控制器和Clock使用情況。
1.1.2. 設備樹信息被保持在一個ASCII文本文件中,適合人類閱讀習慣。類似於XML文件,在ARM linux中,一個.dts文件對應一個arm的machine放置在內核的arch/arm/boot/dts/ 目錄中
1.1.3. 設備樹是一種數據結構,用於描述設備信息的語言,具體而言,是用於操作系統中描述硬件,使得不需要對設備進行硬編碼
1.1.4. Devices Tree是由一系列被命名的節點(node)和屬性(property)組成, 而節點本身可包含子節點。所謂屬性,其實就是成對出現的name和value
1.1.5. 設備樹源文件dts被編譯成dtb二進制,在bootloader運行時傳遞給操作系統,操作系統對其進行解析展開,從而產生一個硬件設備的拓撲圖,有了這個拓撲圖,在編成過程可以直接通過系統提供的接口獲取到設備樹的節點和屬性信息
1.2. 為什么需要設備樹
1.2.1 在linux 2.6中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代碼,相當於多數的代碼只是在描述板級信息,而這些細節對於內核來說不過是垃圾。如板上的platform設備、resource、i2c_board_info、spi_board_info以及各種硬件platform_data。常見的s3c2410、s3c6410等板級目錄,代碼量在數萬行。
1.2.2. linus Torvalds對於此種情況大發雷霆,在2011年的ARM Linux郵件列表宣稱this whole ARM thing is a f*cking pain in the ass”。所以Linux開發社區就開始整改,設備樹最早用於PowerPC等其他體系架構,ARM架構開發社區就開始采用設備樹來描述設備的信息
1.3. 相關名稱縮寫
<1>. DT :Device Tree
<2>. FDT : Flattened Device Tree
<3>. OF :Open Firmware
<4>. DTS :device tree source
<5>. DTSI:device tree source include
<6>. DTB :device tree blob
<7>. DTC :device tree compiler
二. 設備樹基本語法
2.1. 基本數據格式
<1>. 設備樹是節點和屬性的簡單樹型結構。屬性是鍵-值對,節點可以包含屬性和子節點。
以下是.dts格式的簡單樹:

/ DTS-V1 /; / { node1 { a-string-property =“A string”; a-string-list-property =“first string”,“second string”; //十六進制隱含在字節數組中。不需要'0x'前綴. a-byte-data-property = [01 23 34 56]; child-node1 { //boolean,first-child-property定義為true,不定義為false. first-child-boolean-property; second-child-cell-property = <1>; a-string-property =“Hello,world”; }; child-node2 { }; }; node2 { an-empty-property; a-cell-property = <1 2 3 4>; }; };
<2>. 這棵樹顯然沒用,因為它沒有描述任何東西,但它確實顯示了節點和屬性的結構。既:
- 單個根節點:“ / ”
- 幾個子節點:“ node1 ”和“ node2 ”
- node1的幾個孩子:“ child-node1 ”和“ child-node2 ”
- 一堆散落在樹上的屬性。
<3>屬性是簡單的鍵值對,其中值可以為空或包含任意字節流。雖然數據類型未編碼到數據結構中,但有一些基本數據表示可以在設備樹源文件中表示。
- 文本字符串用雙引號表示:
string-property = “a string”;
‘Cells’是由尖括號分隔的32位無符號整數:
cell-property = <0xbeef 123 0xabcd1234>;
二進制數據用方括號分隔:
binary-property = [0x01 0x23 0x45 0x67];
可以使用逗號將不同表示的數據連接在一起:
mixed-property = “a string”, [0x01 0x23 0x45 0x67], <0x12345678>;
逗號還用於創建字符串列表:
string-list = “red fish”, “blue fish”