1. 程式人生 > >裝置樹快速入門

裝置樹快速入門

A devicetree is a data structure for describing hardware.

一個用於描述硬體的資料結構。

https://www.devicetree.org/

基本概念

Dtsi——類似於c語言的標頭檔案

Dts——類似於c語言的原始檔

Dtb——類似於c語言的編譯產物、二進位制檔案

使用device tree,使用者需要了解自己的硬體配置和系統執行引數,並把這些資訊組織成device tree source file。DT是描述系統中的硬體資訊,那些可以被動態探測到的硬體裝置不需要描述。通過dtc(device tree compiler),可以將dts變成適合機器處理的dtb(device tree blob)。

Linux核心從3.x開始引入裝置樹的概念,用於實現驅動程式碼與裝置資訊相分離。在裝置樹出現以前,所有關於裝置的具體資訊都要寫在驅動裡,一旦外圍裝置變化,驅動程式碼就要重寫。

裝置樹主要有三個作用:

1、識別平臺單板 2、執行引數配置 3、裝置構建

語法

1、裝置樹語法格式

DT的基本單元是node(節點),這些node被組織成樹狀結構。每個node包含了若干個property/value,描述node的一些特性。一個裝置樹只能有一個root node(根節點),其名字必須是‘/’。引用裝置樹某個節點,可以使用全路徑,也可以使用控制代碼等方式。

一個Node被定義為如下形式:

[label:] node-name[@unit-address] { 

[properties [= value] ] 

[child nodes] 

}

A.[]——表示可選項

B.label:——標籤,方便dts檔案的引用,通過符號‘&’進行引用

C.node-name——節點名字

[email protected]——如果node沒有reg屬性,不需要該選項;如果有就必須和reg第 一個地址相等(The unit-address must match the first address specified in the

reg property of the node——摘自Devicetree Specification Release v0.2,章節2.2.1 Node Names)。Unit-address具體格式和裝置掛在哪個bus上相關。比如:對於cpu, 其unit-address就是從0開始編址;如果是串列埠控制器,其就是暫存器地址。

E.property——裝置屬性

非標準的屬性名字應該以該公司或者組織名稱開頭,比如:fsl,channel-fifo-len=<?>; zrevmm,vdev = "proxy";

也定義了一些標準的屬性:“compatible”,“model”,"device_type"都是用來表示 節點基本資訊的,compatible = "virtio,mmio";

F.= value——屬性的定義是多種多樣的,可以是空值、整型或者字串。

G.child nodes——和Node格式一樣

2、常見屬性例項

“compatible”屬性是用來匹配驅動的,他的型別是字串陣列,每個字串表示一種裝置的型別,從具體到一般。舉個例子就比較清楚了,比如某個串列埠控制器節點的屬性”compatible = “fsl,mpc8641-uart”, “ns16550"“。第一個字串“fsl,mpc8641-uart”前邊部分是廠商(推測是frescale),後邊部分是控制器具體型號,這個形式也是規範建議的標準寫法。第二個字串ns16550表示一類符合同一標準的串列埠控制器,比第一個字串表示的範圍更大。核心匹配驅動時首先看是否有匹配第一個字串的驅動,如果沒有的話再匹配第二個(如果有更多的,依次類推,所以優先匹配前邊的)。

"model"屬性用來表示裝置的型號,用字串表示,不像"compatible"用多個字串,只需一個就夠了。

"device_type"屬性用來表示裝置型別,用字串表示。

@後地址和reg後第一個地址關係說明。它兩數值必須得一致。

 

下面舉一個例項節點分析:

對應的dts原始碼

/{

  cpus{

    [email protected]{

    };

    [email protected]{

    };

  };

  [email protected]{

  };

  [email protected]{

  };

  [email protected]{

  };

  [email protected]{

  };

};