dts設備樹詳解之設備樹規範

dts文件佈局(layout):
/dts-v1/;        // 第一行表示這個dts文件的版本
[memory reservations]    // 格式爲:/memreserve/ <address> <length>;
/{
    [property definitions]
    [child nodes]
};

第一行表示這個dts文件的版本;
第二行表示的是保存的內存區域:如果你的板子的內存有1G大小,想留一塊區域留做它用(比如拿來用作共享內存區域空間)
而不想全部都給內核使用的話,就可以使用該定義。如果你想讓內核使用全部的內存的花,可以省略該選項。
example:
        memory@0x40000{
            reg = <0x40000,0x39c00000>;        // 留100M的大小用作共享內存區域,0x39c00000=924M大小給內核使用
        };

“/”代表這個設備樹的起點--根;根下面會定義一些屬性和子節點,子節點下面又可以再定義屬性和子節點;
通過這些屬性和節點,來描述該設備樹是什麼設備樹(例如是JZ2440設備樹還是mini2440設備樹)同時描述該設備平臺包含的外部硬件信息。

(1) DTS語法:
Devicetree node格式:
[label:] node-name[@unit-address] {
    [properties definitions]
    [child nodes]
};

屬性的定義格式有以下兩種:
Property格式1:
[label:] property-name = value;

Property的value取值只有3種:
1.arrays of cells(1個或多個32位數據, 64位數據使用2個32位數據表示)
   property-name = <1 0x3 0x123>
2.string(字符串)
   property-name = "string"
3.bytestring(1個或多個字節,16進製表示)
   property-name = [00 11 22]  // 11是0x11(16進製表示)
   property-name = [001122]  // byte之間的空格可以省略,取兩位組成一個byte

Property格式2(沒有值):
[label:] property-name;

示例:
a. Arrays of cells : cell就是一個32位的數據
interrupts = <17 0xc>;

b. 64bit數據使用2個cell來表示:
clock-frequency = <0x00000001 0x00000000>;

c. A null-terminated string (有結束符的字符串):
compatible = "simple-bus";

d. A bytestring(字節序列) :
local-mac-address = [00 00 12 34 56 78];  // 每個byte使用2個16進制數來表示
local-mac-address = [000012345678];       // 每個byte使用2個16進制數來表示

e. 可以是各種值的組合, 用逗號隔開:
compatible = "ns16550", "ns8250";
example = <0xf00f0000 19>, "a strange property format";


設備節點的定義:
Devicetree node格式:
[label:] node-name[@unit-address] {
    [properties definitions]
    [child nodes]
};

我們在訪問某個設備節點時,是通過它們的設備節點名來區分不同的設備節點,
如果同一級別下存在兩個相同的設備節點名,可以在設備節點名後加@address來區分不同的設備。

注意:同一個級別下的兩個節點名不能相同,或者說任意一個節點的全路徑不能夠相同。
例如有兩塊不同大小的內存:
/ {
    model = "SMDK24440";
    compatible = "samsung,smdk2440";

    #address-cells = <1>;
    #size-cells = <1>;

    /* @後面加地址,爲了讓設備節點名彼此不同 */
    memory@30000000 {    // 全路徑爲/memory@30000000
        device_type = "memory";
        reg =  <0x30000000 0x4000000>;

        memory@30000000 {    // 全路徑爲/memory@30000000/memory@30000000
            device_type = "memory";
            reg =  <0x30000000 0x4000000>;
        };
    };
    memory@0 {    // 全路徑爲/memory@0
        device_type = "memory";
        reg =  <0 4096>;
    };
};

(2) 特殊的、默認的屬性:
a. 根節點:
#address-cells   // 在它的子節點的reg屬性中, 使用多少個u32整數來描述地址(address)
#size-cells      // 在它的子節點的reg屬性中, 使用多少個u32整數來描述大小(size)
compatible       // 定義一系列的字符串, 用來指定內核中哪個machine_desc可以支持本設備
                 // 即這個板子兼容哪些平臺
                 // uImage : 可以支持smdk2410 smdk2440 mini2440這些單板     ==> 每一種單板在內核裏面都有對應的machine_desc(裏面含有不同的初始化函數等)         
                 
model            // 咱這個板子是什麼
                 // 比如有2款板子配置基本一致, 它們的compatible是一樣的
                 // 那麼就通過model來分辨這2款板子

b. /memory
device_type = "memory";
reg             // 用來指定內存的地址、大小

c. /chosen
bootargs        // 內核command line參數, 跟u-boot中設置的bootargs作用一樣

d. /cpus
/cpus節點下有1個或多個cpu子節點, cpu子節點中用reg屬性用來標明自己是哪一個cpu
所以 /cpus 中有以下2個屬性:
#address-cells   // 在它的子節點的reg屬性中, 使用多少個u32整數來描述地址(address)

#size-cells      // 在它的子節點的reg屬性中, 使用多少個u32整數來描述大小(size)
                 // 必須設置爲0


e. /cpus/cpu*
device_type = "cpu";
reg             // 表明自己是哪一個cpu


(4) 引用其他節點:
a. phandle : // 節點中的phandle屬性, 它的取值必須是唯一的(不要跟其他的phandle值一樣)

pic@10000000 {
    phandle = <1>;
    interrupt-controller;
};

another-device-node {
    interrupt-parent = <1>;   // 使用phandle值爲1來引用上述節點
};

b. label:

PIC: pic@10000000 {
    interrupt-controller;
};

another-device-node {
    interrupt-parent = <&PIC>;   // 使用label來引用上述節點,
                                 // 使用lable時實際上也是使用phandle來引用,
                                 // 在編譯dts文件爲dtb文件時, 編譯器dtc會在dtb中插入phandle屬性
};
======================================================================================
PIC: pic@10000000 {
    phandle = <xxx>;
    interrupt-controller;
};

another-device-node {
    interrupt-parent = <xxx>;   // 使用label來引用上述節點,
                                 // 使用lable時實際上也是使用phandle來引用,
                                 // 在編譯dts文件爲dtb文件時, 編譯器dtc會在dtb中插入phandle屬性
};
======================================================================================

注意:引用不能寫在根節點裏面,必須放在根節點外面。
例如以下寫法是錯誤的:
/{
    &PIC{
    };
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章