DTS(裝置樹)入門
DTS即Device Tree Source 裝置樹原始碼, 是一種描述硬體的資料結構
DTS的載入過程
- 使用者根據解自己的硬體配置和系統執行引數,編寫DTS檔案
- DTC(Device Tree Compiler)將DTS檔案變成適合機器處理的DTB檔案(Device Tree binary )
- 系統啟動時,通過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>;
};
- 組織形式----------"<manufacturer>,<model>",manufacturer表徵了結點代表的確切裝置,特指。model表徵可相容的其他裝置,泛指。
- 作用-----------使用者驅動和裝置的繫結
name屬性
- 組織形式----------<name>[@<unit-address>],name指結點對應的裝置型別,@unit-address表示結點裝置的地址
- 作用-----------標識裝置,多個相同型別裝置結點的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>;
};
- 組織形式---------reg = <address1 length1 [address2 length2][address3 length3] ... >,
- 作用----------表明了裝置使用的一個地址範圍。父結點#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
- 組織形式---------片選0,偏移0,被對映到CPU地址空間的0x10100000~0x10110000中,地址長度為0x10000(第一行)。
- 作用---------地址轉換表,其中的每個專案是一個子地址、父地址以及在子地址空間的大小的對映。由子節點的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屬性的節點就是一個裝置。包含一組裝置節點的父節點即為匯流排。