設備樹語法


[DTS]設備樹語法

原創: 楊永達  嵌入式軟件開發交流 3月15日

 

前言

 

        之前分享了一些設備樹的基本概念,今天來聊聊設備樹的語法。以前閱讀設備樹文件時發現很多平台的節點的屬性名稱都不一樣,然后就很糾結,就到官方去找,發現都沒有該屬性或節點,就很郁悶。這其實犯了一個錯誤,那就是設備樹並不是一種編程語言,沒有什么絕對的關鍵字。我們應該把設備樹理解成配置文件,如果知道xml文件,就可以把設備樹類比成xml文件。

        好,廢話不多說了。。。

 

 

語法規則

 

一、設備樹語法

    (1)設備樹節點語法

[label:] node-name[@unit-address] {    [properties definitions];    [child nodes];};

解釋:

    label: 可選項,節點別名

    node-name: 節點名

    unit-address: 設備地址

    properties definitions:屬性定義

    child nodes:子節點

 

(2) 屬性定義語法

[label:] property-name = value;[label:] property-name;

屬性分為有屬性值和無屬性值

屬性值有三種取值:

  • arrays of cells(1個或多個32位數據, 64位數據使用2個32位數據表示),用尖括號表示(< >)

  • string(字符串), 用雙引號表示(" ")

  • bytestring(1個或多個字節),用方括號表示([ ])

 

舉例:

//Arrays of cells : cell就是一個32位的數據interrupts = <17 0xc>;
//64bit數據使用2個cell來表示:clock-frequency = <0x00000001 0x00000000>;
//A null-terminated string (有結束符的字符串):compatible = "simple-bus";
//A bytestring(字節序列) :local-mac-address = [00 00 12 34 56 78]; // 每個byte使用2個16進制數來表示local-mac-address = [000012345678]; // 每個byte使用2個16進制數來表示
//可以是各種值的組合, 用逗號隔開:compatible = "ns16550", "ns8250";example = <0xf00f0000 19>, "a strange property format";

 

二、特殊屬性

    (1)根節點

#address-cells   // 在子節點的reg屬性中, 使用多少個u32整數來描述地址(address)

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

compatible // 定義一系列的字符串, 用來指定內核中哪個machine_desc可以支持本設備                 // 即這個板子兼容哪些平台

model            // 比如有2款板子配置基本一致, 它們的compatible是一樣的 // 那么就通過model來分辨這2款板子

* cell: 一個u32整數

 

(2) /memory

所有設備樹文件的必需節點,它定義了系統物理內存的 layout

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

(3) /chosen

傳遞runtime parameter

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

(4) /cpus

/cpus節點下有1個或多個cpu子節點, cpu子節點中用reg屬性用來標明自己是哪一個cpu

所以 /cpus 中有以下2個屬性:

#address-cells   // 在它的子節點的reg屬性中, 使用多少個u32整數來描述地址(address)

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

(5) aliases

用來定義別名

aliases {    ethernet0 = &gmac;    i2c0 = &i2c0;    i2c1 = &i2c1;    i2c2 = &i2c2;    mshc0 = &emmc;    mshc1 = &sdmmc;    mshc2 = &sdio0;    mshc3 = &sdio1;    serial0 = &uart0;    serial1 = &uart1;    spi0 = &spi0;    spi1 = &spi1;  };

三、引用其他節點

    (1) phandle屬性引用

    節點中的phandle屬性, 它的取值必須是唯一的(不要跟其他的phandle值一樣)

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

 

(2)使用別名(本質還是phandle)

PIC: pic@10000000 {    interrupt-controller;};
another-device-node {    interrupt-parent = <&PIC>;   // 使用label來引用上述節點                       };

四、包含dtsi文件

#include "rk3288-firefly.dtsi"

    在每個.dsti和.dts中都會存在一個“/”根節點,那么如果在一個設備樹文件中include一個.dtsi文件,那么豈不是存在多個“/”根節點了么。其實不然,編譯器DTC在對.dts進行編譯生成dtb時,會對node進行合並操作,最終生成的dtb只有一個root node。

 

五、使用宏定義

#include <dt-bindings/gpio/gpio.h>#include <dt-bindings/interrupt-controller/irq.h>#include <dt-bindings/interrupt-controller/arm-gic.h>#include <dt-bindings/pinctrl/rockchip.h>#include <dt-bindings/clock/rk3288-cru.h>#include <dt-bindings/power/rk3288-power.h>#include <dt-bindings/thermal/thermal.h>#include <dt-bindings/power/rk3288-power.h>#include <dt-bindings/soc/rockchip,boot-mode.h>
arm-pmu { compatible = "arm,cortex-a12-pmu"; interrupts = <GIC_SPI 151 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 152 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>; interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>; };

上面的GIC_SPI和IRQ_TYPE_LEVEL_HIGH都是宏定義,定義在頭文件中。

 

六、屬性重寫

//rk3288.dtsihdmi: hdmi@ff980000 {    compatible = "rockchip,rk3288-dw-hdmi";    reg = <0x0 0xff980000 0x0 0x20000>;    reg-io-width = <4>;    #sound-dai-cells = <0>;    rockchip,grf = <&grf>;    interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;    clocks = <&cru  PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_HDCP>, <&cru SCLK_HDMI_CEC>;    clock-names = "iahb", "isfr", "cec";    power-domains = <&power RK3288_PD_VIO>;    status = "disabled";};
//rk3288-firefly.dtsi&hdmi { ddc-i2c-bus = <&i2c5>; status = "okay";};

上面的rk3288-firefly.dtsi包含rk3288.dtsi, 然后使用&hdmi引用rk3288.dtsi中的hdmi節點。並在原有的基礎上添加ddc-i2c-bus屬性,然后將status屬性進行重寫覆蓋。這就體現了dtsi文件的價值,dtsi定義公共的部分,板級差異再進行添加或重寫。

 

 

 

    還是提醒大家,設備樹不能當成一種編程語言來學哦!否則你有時候會很糾結。

 

精彩還在繼續,歡迎繼續關注!!!!

 

歡迎加入QQ群聊

如果你喜歡就請分享給你的朋友,感謝大家的支持

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM