設備樹實例解析


[DTS]設備樹實例解析

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

前言 

    前面對設備樹的一些基本語法進行了講解,然后這一節通過一個demo來實踐一下具體的語法,可以和上一小節一起閱讀。多看多改自然就慢慢理解語法規則了。^_^

 

實例解析

    

    下面的dts文件內容是網上比較常見的一個demo,我們把它拿過來解析。為什么不從arch/arm/boot/dts/中找一份呢? 因為里面的dts內容都很多,看着很容易暈,所以找一份簡短的來學習會更容易獲取成就感。

/ {    
compatible = "acme,coyotes-revenge";

#address-cells = <1>; //子結點需要一個 cell 描述地址

#size-cells = <1>; //子結點需要一個 cell 描述長度

interrupt-parent = <&intc>;

cpus {

  #address-cells = <1>;

  #size-cells = <0>;

  cpu@0 {

  compatible = "arm,cortex-a9";

  reg = <0>;

  };

  cpu@1 {

  compatible = "arm,cortex-a9";

  reg = <1>;

  };

};


serial@101f1000 { //串口

  compatible = "arm,pl011";

  reg = <0x101f1000 0x1000 >;

  interrupts = < 1 0 >;

};

serial@101f2000 { //串口

  compatible = "arm,pl011";

  reg = <0x101f2000 0x1000 >;

  interrupts = < 2 0 >;

};


intc: interrupt-controller@10140000 { //中斷控制器

  compatible = "arm,pl190";

  reg = <0x10140000 0x1000 >;

  interrupt-controller;

  #interrupt-cells = <2>;

};

spi@10115000 { //spi 控制器

  compatible = "arm,pl022";

  reg = <0x10115000 0x1000 >; 起始地址為 0x10115000,長度為 0x1000

  interrupts = < 4 0 >;

};

external-bus { //external bus 橋

  #address-cells = <2> //子結點需要兩個 cell 描述地址,片選

  #size-cells = <1>; //子結點需要一個 cell 描述長度

  ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet 片選 0 0,地址 0x10100000 ,長度 0x10000

       1 0 0x10160000 0x10000 // Chipselect 2, i2c controller

       2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash

  ethernet@0,0 {

    compatible = "smc,smc91c111";

    reg = <0 0 0x1000>;

    interrupts = < 5 2 >;

  };

  i2c@1,0 {

    compatible = "acme,a1234-i2c-bus";

    #address-cells = <1>; //rtc 需要一個 cell 描述地址

    #size-cells = <0>; //rtc 不需要 0 描述長度

    reg = <1 0 0x1000>;

    rtc@58 {

      compatible = "maxim,ds1338";

      reg = <58>;

      interrupts = < 7 3 >;

    };

  };

  flash@2,0 {

    compatible = "samsung,k8f1315ebm", "cfi-flash";

    reg = <2 0 0x4000000>;

  };

}; //external-bus

};

解析:

 

(1) 根節點

compatible: 內核通過root節點"/"的compatible屬性來判斷它啟動的是哪個machine。

#address-cells : 子結點(reg屬性)需要多少個cell描述地址。

#size-cells : 子結點(reg屬性)需要多少個cell描述長度。

interrupt-parent : 標示該節點屬於哪個中斷控制器,如果沒有該屬性,則依附於父節點。

 

(2) cpus節點

#address-cells : 同上

#size-cells : 同上

 

(3) cpu節點

@unit-address: 可選項,設備地址,節點名相同時可以通過這個來區分不同節點。unit-address地址也經常在其對應的reg屬性中給出。

reg : region,描述設備地址

格式: reg = <address1 length1 [address2 length2] [address3 length3]>

 

(4) serial節點

compatible: 外設節點上的compatible屬性用於驅動和設備的綁定(匹配)

reg: 外設基地址和偏移量 ,比如:reg = <0x101f1000 0x1000 >

interrupts: 中斷號和標識(上升沿,下降沿等), 里面多少個值要根據中斷控制器的#interrupt-cells屬性來決定。而#interrupt-cells屬性值要由中斷控制器的類型決定。

 

中斷控制器類型:

GIC: Generic Interrupt Controller(通用中斷控制器)

    中斷類型,中斷號,標識(上升沿,下降沿等)

VIC : Vectored Interrupt Controller(向量中斷控制器)

    中斷號

NVIC:Nested Vectored Interrupt Controller(內嵌向量中斷控制器)

    中斷號,中斷優先級

 

參考: Documentation\devicetree\bindings\interrupt-controller

 

(5) interrupt-controller節點

compatible: 中斷控制器類型,查看上面路徑下的文件來獲知, 芯片datasheet也有說明。

reg:同上

interrupt-controller:空屬性,用來聲明這個節點接收中斷信號。

#interrupt-cells:標識該控制器需要幾個cell來描述中斷,其實就是決定了interrupts屬性需要幾個cell

 

(6) external-bus節點

ranges: 地址轉換表,每一行都包含子地址、父地址、在子地址空間內的區域大小。

ranges屬性值為空的話,表示1:1映射。

ranges屬性值的格式 <local地址, parent地址, size>

local地址的個數取決於當前含有ranges屬性的節點的#address-cells屬性的值。

parent地址的個數取決於父節點的#address-cells的值。

size取決於當前含有ranges屬性的節點的#size-cells屬性的值。

 

(7) rtc節點

reg: i2c設備地址

 

 

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

歡迎加入QQ群聊

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

 

 


免責聲明!

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



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