Linux之裝置樹解耦架構解讀-V1.0
術語和縮略語
本文件使用了以下術語和縮略語
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