術語和縮略語
本文檔使用了以下術語和縮略語
Dts:DTS即Device Tree Source,是一個文本形式的文件,用於描述硬件信息。一般都是固定信息,無法變更,無法overlay。
Dtsi:可以理解為dts的公共部分,添加、變更非常靈活。Dtsi包含在dts中。
-
Dtb:Dtb編譯出來的二進制
-
Dtbo:Overlay編譯出來的二進制
-
dtbo-base:指定overlay是已哪個dtb為base來覆蓋的。
-
Node:樹的節點
-
Property:屬性
一、設備樹(Device Tree)簡介
1. 設備樹由來
linux內核源碼中,之前充斥着大量的平台相關(platform Device)配置,而這些代碼大多是雜亂且重復的,這使得ARM體系結構的代碼維護者和內核維護者在發布一個新的版本的時候有大量的工作要做,以至於LinusTorvalds 在2011年3月17日的ARM Linux郵件列表中宣稱“Gaah.Guys,this whole ARM thing is a f*cking pain in the ass”這使得整個ARM社區不得不重新慎重考慮平台配置,於是設備樹(Device Tree,DT)被ARM社區采用。需要說明的是,設備樹最初是由開發固件(Open Firmware)使用的用來向客戶程序(通常是一個操作系統)傳遞數據的通信方法中的一部分內容。在運行時,客戶程序通過設備樹發現設備的拓撲結構,這樣就不需要把硬件信息硬編碼到程序中。
2. 設備樹的作用
設備樹是一個描述硬件的數據結構,甚至你可以將其看成一個大結構體(這個結構體就是平台,成員就是具體的設備),需要注意的是設備樹並不能解決所有的硬件配置問題(例如:機器識別),它只是提供一種語言,將硬件的配置從linux內核的源碼中提取出來。
Linux使用設備樹的主要原因如下
A:平台識別
B:實時配置
C:設備植入
二、設備樹解耦目標
目標一 vendor相關修改,完全獨立出來,禁止在soc原生的dtsi中修改,只允許以dtbo的方式存在;
目標二 同基線項目dtbo要共二進制
三、設備樹解耦框架設計
四、設備樹代碼架構
五、設備樹overlay規則
該節內容為overlay機制原生規則,羅列出來幫助驅動工程師解決各種異常問題。
規則1:對於同一個節點的設置情況,dts中的配置會覆蓋dtsi中的配置;
規則2:對於節點的修改,先引用后修改;例如原生節點定義如下:
需要在reserved-memory節點中添加一個新的節點或者直接修改reserved-memory節點的屬性,都需要先引用reserved_memory節點(注意節點的引用名與節點名可以不一致)
如上案例中,引用reserved-memory節點,並刪除了ranges屬性,刪除了hyp_mem節點,新增了kboot_uboot_logmem節點;
規則3:只有引用申明的節點,在dtsi中“&節點名”才會生效,否則引用點將不生效;例如:firmware節點下fstab 節點的定義如下
對於同一個節點的設置情況,dts文件中的內容會覆蓋dtsi中的。
六、調試手段
在調試的過程中,沒有達到預期時,需要先確定修改有沒有編譯到對應的dtbo.img中,就需要反編譯dtbo.img
- 反編譯工具
反編譯工具代碼中自帶,只需要初始化一下環境變量就可以使用。初始化指令如下:
- 反編譯dtb.img
dtc-I dtb -O dts dtb.img -o dtsi.txt
- 反編譯dtbo.img
mkdtimgdump dtbo.img -b dtbo
dtc -I dtb -O dts dtbo.00 -o dtsi.txt