裝置樹是乙個簡單的包含節點和屬性的樹結構。屬性通過鍵值對形式描述,乙個節點可以包含多個屬性或子節點,乙個簡單的 .dts 格式裝置樹如下所示。
/ ; child-node2 ;
};node2 ;
};};
顯然,上述例子的裝置樹一點用都沒有,因為它根本就沒有描述任何東西,但是它可以很直觀地告訴我們樹結構中的節點和屬性的情況。具體如下:
◆ 有乙個根節點「/」
◆ 有兩個子節點:node1 和 node2
◆ node1 有兩個子節點:child-node1 和 child-node2
◆ 分散在整個樹中的一些屬性
屬性是乙個簡單的鍵值對,它的值可以是空的或者是任意大小的位元組流。而這樣的資料結構中並不需要包含資料型別,下面是可以在dts檔案中表達的一些基本資料:
◆ 文字字串(包含』\0』結束符)用雙引號表示:
string-property = "a string";
◆ cells(32位無符號整數)用尖括號表示:
cell-property =<0xbeef 123 0xabcd1234>;
◆ 二進位制資料用方括號表示:
binary-property = [0x01
0x23
0x45
0x67];
◆ 型別不同的資料的組合也是可以的,但需要用逗號隔開:
mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>;
◆ 逗號同樣用於建立字串列表:
string-list = "red fish", "blue fish";
為了理解 device tree 到底是怎麼用的,我們將以乙個簡單的機器為例,一步步地建立起描述它的 device tree。
假設有這樣一台計算機(基於arm versatile),由「acme」製造並命名為」coyote』s revenge」:
◆ 乙個 32 位的 arm 處理器;
◆ 串列埠、spi 匯流排控制器、i2c 匯流排控制器、中斷控制器以及一些外部匯流排橋通過記憶體對映連線到到處理器的匯流排上;
◆ 256mb 的 sdram,基位址為 0;
◆ 兩個串列埠,基位址分別為 0x101f1000 和 0x101f2000;
◆ gpio 控制器,基位址為 0x101f3000;
◆ spi 控制器,基位址為 0x10170000,並且連線了 mmc 插槽(ss管腳連線到gpio #1);
◆ 外部匯流排橋,連線了以下裝置:
① 連線到外部匯流排的 smc smc91111 乙太網裝置,基位址為 0x10100000;
② i2c 控制器,基位址為 0x10160000,並連線了 maxim ds1338 實時時鐘(裝置從位址為1101000,即0x58);
③ 64mb 的 nor flash,基位址為 0x30000000;
首先搭建該機器 device tree 的基本框架,即乙個有效裝置樹的最小架構。在這一步,要唯一地標識這台計算機。
/dts-v1/;
/ ;
compatible 屬性指定了系統的名字,它的值是乙個","
格式的字串。為乙個特定裝置指定 compatible 值是很必要的,因為包含製造商名字可以避免命名空間衝突。作業系統會根據 compatible 值來決定如何執行這台計算機,所以在該屬性中填入正確的資料很重要。
理論上,compatible 是作業系統唯一標識一台機器的所有資料,如果所有機器細節都硬編碼,那麼 os 可以在頂層 compatible 屬性中專門查詢」acme,coyotes-revenge」。
接下來就要描述各個 cpu 了。先新增乙個「cpus」容器節點,再將每個 cpu 作為子節點新增進去。在這個例子中,是基於 arm 的雙核 cortex a9 處理器。
/dts-v1/;
/ ; cpu@1 ;
};};
類似於頂層 compatible 屬性,每個 cpu 節點中的 compatible 屬性也是乙個","
格式的字串,指定了 cpu 的確切型號。
後面會有更多的屬性被新增到 cpu 節點,因此我們首先需要先了解一些基本概念。
花些時間談談命名習慣是值得的。每個節點都必須有乙個[@]
格式的名稱。
是乙個最大長度為 31 個字元的 ascii 字串,一般來說,節點的命名是根據它所表示的裝置而定的。比如說,乙個表示 3com 乙太網介面卡的節點應該命名為 ethernet,而不是 3com509。
如果該節點所表示的裝置有相關裝置位址的話,則需要包含資訊。
通常是用來訪問裝置的首位址,並在節點的 reg 屬性中會被列出。後面我們還會詳細介紹 reg 屬性。
同級節點必須唯一地命名,但只要位址不相同,多個節點採用相同的命名是沒問題的(例如 serial@101f1000 和 serial@101f2000)。
關於節點命名的全部細節請參考 epapr 規範 2.2.1 節。
系統中的每個裝置都用裝置樹上的節點來表示,所以接下來就是要在裝置樹中為各個裝置新增裝置節點。現在我們新增的新節點先置為空,後面我們談到定址和中斷的時候再進行處理。
/dts-v1/;
/ ; cpu@1 ;
};serial@101f0000 ;
serial@101f2000 ;
gpio@101f3000 ;
interrupt-controller@10140000 ;
spi@10115000 ;
external-bus ;
i2c@1,0 ;
};flash@2,0 ;
};};
在上面這個樹中,已經為系統中的每個裝置新增了節點,並且裝置樹的層次結構反映了裝置是如何連線到系統的。例如,掛接在外部匯流排上的裝置是外部匯流排節點的子節點,i2c 裝置是 i2c 匯流排控制器節點的子節點。總的來說,裝置樹的層次結構是從 cpu 的角度來看的系統檢視。
現在這個裝置樹仍然是無效的,因為它缺少了描述裝置之間到底如何連線的資訊。後面我們會給它新增這些資料。
關於這個裝置樹有以下一些注意事項:
◆ 每個裝置節點都有乙個 compatible 屬性;
◆ flash 節點的 compatible 屬性有兩個字串;(下一節會說明為什麼)
◆ 之前提到的,節點命名應該反映裝置的型別,而不是特定型號;(請參考epapr規範2.2.2節的通用節點命名,應優先使用這些命名)
裝置樹中的每個節點都需要有 compatible 屬性,作業系統會通過這個 compatible 的值來決定用該裝置應該繫結哪個裝置驅動程式。
compatible 的值是乙個字串列表,列表中的第乙個字串用「,
」 格式準確描述相應裝置,後面的字串表示相容的其他裝置。
例如,freescale mpc8349 soc有乙個串列埠裝置實現了national semiconductor ns16550暫存器介面。因此mpc8349串列埠裝置的compatible屬性為:compatible = 「fsl,mpc8349-uart」, 「ns16550」。在這裡,fsl,mpc8349-uart指定了確切的裝置,ns16550表明它與national semiconductor 16550 uart是暫存器級相容的。
注:由於歷史原因,ns16550沒有製造商字首,所有新的compatible值都應使用製造商的字首。這種做法使得現有的裝置驅動程式可以繫結到乙個新裝置上,同時仍能唯一準確的識別硬體。
警告:不要使用萬用字元compatible值,如」fsl,mpc83xx-uart」等類似表達,晶元廠商總會改變並打破你的萬用字元假設,到時候再想修改就為時已晚了。相反,你應當選擇乙個特定的晶元實現,並與所有後續晶元保持相容。
可編址的裝置使用下面屬性來將位址資訊編碼進裝置樹:
◆reg
◆#address-cells
◆#size-cells
linux裝置樹學習筆記備忘 裝置樹格式
1 裝置樹格式 label node name unit address 例子 1150 fusb0 fusb30x 22 格式一 label property name value 格式二 label property name property取值方式只有3種 arrays of cells 1...
裝置樹 dts格式 語法
在之前提到過裝置樹就是平台匯流排中的平台裝置的衍生,是用於表述硬體裝置資源的,對於arm平台,裝置樹檔案存放在arch arm boot dts下,繫結文件存在documentation devicetree bindings下。我把jz2440 led 裝置樹之點亮led燈中的裝置樹檔案拷貝過來,...
裝置資料報格式
字段 型別 from 幀頭 len 長度 type 指令型別 content 指令內容 sum 校驗 傳送訊息型別 1位元組1位元組 1位元組變動 1位元組ping 0x5d bed 0100 null len type connect 0x5d bed 0701 48位pid len type c...