1. 程式人生 > >DTS(裝置樹)入門

DTS(裝置樹)入門

DTS即Device Tree Source 裝置樹原始碼, 是一種描述硬體的資料結構

DTS的載入過程

  1. 使用者根據解自己的硬體配置和系統執行引數,編寫DTS檔案
  2. DTC(Device Tree Compiler)將DTS檔案變成適合機器處理的DTB檔案(Device Tree binary )
  3. 系統啟動時,通過bootloader的互動式命令載入DTB到核心

Device Tree描述的資訊

  • CPU的數量和類別
  • 記憶體基地址和大小
  • 匯流排和橋
  • 外設連線
  • 中斷控制器和中斷使用情況
  • GPIO控制器和GPIO使用情況
  • Clock控制器和Clock使用情況

Device Tree的結構

由一系列被命名的結點(node)和屬性(property)組成,

/ -------------根節點

@------------如果裝置有地址,則由此符號指定

& -------------引用節點

:---------------冒號前的label是為了方便引用給節點起的別名,此label一般使用為&label

, -------------- 屬性名稱中可以包含逗號。如compatible屬性的名字 組成方式為"[manufacturer], [model]",加入廠商名是為了避免重名。自定義屬性名中通常也要有廠商名,並以逗號分隔。

#-------------並不表示註釋。如 #address-cells ,#size-cells 用來決定reg屬性的格式。

    -----------空屬性並不一定表示沒有賦值。如 interrupt-controller 一個空屬性用來宣告這個node接收中斷訊號

“” --------------引號中的為字串,字串陣列:”strint1”,”string2”,”string3”

< > ------------尖括號中的為32位整形數字,整形陣列<12 3 4>

[ ] --------------方括號中的為32位十六進位制數,十六機制資料[0x11 0x12 0x13]  其中0x可省略

結點本身可包含子結點。

/ {  //根節點
	node1 {   //子結點
		a-string-property = "A string";  
		a-string-list-property = "first string", "second string";  
		a-byte-data-property = [0x01 0x23 0x34 0x56];  
		child-node1 {  //子節點的子節點
			first-child-property;  
			second-child-property = <1>;  
			a-string-property = "Hello, world";  
		};  
		child-node2 {  
		};  
	};  
	node2 {  //子節點
		an-empty-property;  
		a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */  
		child-node1 {  
		};  
	};  
};

屬性,其實就是成對出現的name和value

compatible屬性

 [email protected],0 {
        compatible = "smc,smc91c111";
        reg = <0 0 0x1000>;
    };
  1. 組織形式----------"<manufacturer>,<model>",manufacturer表徵了結點代表的確切裝置,特指。model表徵可相容的其他裝置,泛指。
  2. 作用-----------使用者驅動和裝置的繫結

name屬性

  1. 組織形式----------<name>[@<unit-address>],name指結點對應的裝置型別,@unit-address表示結點裝置的地址
  2. 作用-----------標識裝置,多個相同型別裝置結點的name可以一樣,只要unit-address不同即可

reg屬性

external-bus{
    #address-cells = <2>
    #size-cells = <1>;
 
    [email protected],0 {
        compatible ="acme,a1234-i2c-bus";
        #address-cells = <1>;
        #size-cells = <0>;
        reg = <1 0 0x1000>;
        [email protected] {
            compatible ="maxim,ds1338";
            reg = <58>;
        };

  1. 組織形式---------reg = <address1 length1 [address2 length2][address3 length3] ... >,
  2. 作用----------表明了裝置使用的一個地址範圍。父結點#address-cells和#size-cells分別決定了子結點reg屬性的address和length欄位的長度,子節點有特殊需求的話,可以自己再定義,這樣就可以擺脫父節點的控制。

ranges屬性


#address-cells= <1>;
#size-cells= <1>;
...
external-bus{
    #address-cells = <2>
    #size-cells = <1>;
    ranges = <0 0  0x10100000  0x10000     // Chipselect 1,Ethernet
              1 0  0x10160000  0x10000     // Chipselect 2, i2c controller
              2 0  0x30000000  0x1000000>; // Chipselect 3, NOR Flash
  1. 組織形式---------片選0,偏移0,被對映到CPU地址空間的0x10100000~0x10110000中,地址長度為0x10000(第一行)。
  2. 作用---------地址轉換表,其中的每個專案是一個子地址、父地址以及在子地址空間的大小的對映。由子節點的address-cells的值、父節點的address-cells的值和子節點的size-cells來決定。

描述中斷連線需要四個屬性:

intc: [email protected] {  
		compatible = "arm,pl190";  
		reg = <0x10140000 0x1000 >;  
		interrupt-controller;  
		#interrupt-cells = <2>;  
	};

1. interrupt-controller 一個空屬性用來宣告這個node接收中斷訊號;
2. #interrupt-cells 這是中斷控制器節點的屬性,用來標識這個控制器需要幾個單位做中斷描述符;
3. interrupt-parent 標識此裝置節點屬於哪一個中斷控制器,如果沒有設定這個屬性,會自動依附父節點的;
4. interrupts 一箇中斷識別符號列表,表示每一箇中斷輸出訊號。

二個cell的情況

[email protected] {  
		compatible = "arm,pl022";  
		reg = <0x10115000 0x1000 >;  
		interrupts = < 4 0 >;  
	}; 

第一個值: 該中斷位於他的中斷控制器的索引;

第二個值:觸發的type

固定的取值如下:

        1 (0001)= low-to-high edge triggered
        2 (0010)= high-to-low edge triggered
        4 (0100)= active high level-sensitive
        8 (1000)= active low level-sensitive

三個cell的情況

第一個值:中斷號

第二個值:觸發的型別

第三個值:優先順序,0級是最高的,7級是最低的;其中0級的中斷系統當做 FIQ處理。

DTS裝置樹描述檔案中什麼代表匯流排,什麼代表裝置

一個含有compatible屬性的節點就是一個裝置。包含一組裝置節點的父節點即為匯流排。