Linux之設備樹解耦架構解讀-V1.0
術語和縮略語
本文檔使用了以下術語和縮略語
Dts:DTS即Device Tree Source,是一個文本形式的文件,用于描述硬件信息。一般都是固定信息,無法變更,無法overlay。
Dtsi:可以理解為dts的公共部分,添加、變更非常靈活。Dtsi包含在dts中。
Dtb:Dtb編譯出來的二進制
Dtbo:Overlay編譯出來的二進制
dtbo-base:指定overlay是已哪個dtb為base來覆蓋的。
Node:樹的節(jié)點
Property:屬性
一、設備樹(Device Tree)簡介
1. 設備樹由來
linux內核源碼中,之前充斥著大量的平臺相關(platform Device)配置,而這些代碼大多是雜亂且重復的,這使得ARM體系結構的代碼維護者和內核維護者在發(fā)布一個新的版本的時候有大量的工作要做,以至于LinusTorvalds 在2011年3月17日的ARM Linux郵件列表中宣稱“Gaah.Guys,this whole ARM thing is a f*cking pain in the ass”這使得整個ARM社區(qū)不得不重新慎重考慮平臺配置,于是設備樹(Device Tree,DT)被ARM社區(qū)采用。需要說明的是,設備樹最初是由開發(fā)固件(Open Firmware)使用的用來向客戶程序(通常是一個操作系統(tǒng))傳遞數(shù)據(jù)的通信方法中的一部分內容。在運行時,客戶程序通過設備樹發(fā)現(xiàn)設備的拓撲結構,這樣就不需要把硬件信息硬編碼到程序中。
2. 設備樹的作用
設備樹是一個描述硬件的數(shù)據(jù)結構,甚至你可以將其看成一個大結構體(這個結構體就是平臺,成員就是具體的設備),需要注意的是設備樹并不能解決所有的硬件配置問題(例如:機器識別),它只是提供一種語言,將硬件的配置從linux內核的源碼中提取出來。
Linux使用設備樹的主要原因如下
A:平臺識別
B:實時配置
C:設備植入
二、設備樹解耦目標
目標一 vendor相關修改,完全獨立出來,禁止在soc原生的dtsi中修改,只允許以dtbo的方式存在;
目標二 同基線項目dtbo要共二進制
三、設備樹解耦框架設計

設備樹識別原理及設備樹共二進制原理
項目號(Project No)與 PCB ID兩個變量同時與dtbo中的兩個屬性“dtsi_No”“pcb_No”完全匹配,就可以找到對應的dtbo文件。而dtbo可以通過Makefile的控制打包到dtbo.img中,這樣就實現(xiàn)了共二進制。
四、設備樹代碼架構

【文章福利】小編推薦自己的Linux內核技術交流群:【749907784】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ?


五、設備樹overlay規(guī)則
該節(jié)內容為overlay機制原生規(guī)則,羅列出來幫助驅動工程師解決各種異常問題。
規(guī)則1:對于同一個節(jié)點的設置情況,dts中的配置會覆蓋dtsi中的配置;
規(guī)則2:對于節(jié)點的修改,先引用后修改;例如原生節(jié)點定義如下:

需要在reserved-memory節(jié)點中添加一個新的節(jié)點或者直接修改reserved-memory節(jié)點的屬性,都需要先引用reserved_memory節(jié)點(注意節(jié)點的引用名與節(jié)點名可以不一致)

如上案例中,引用reserved-memory節(jié)點,并刪除了ranges屬性,刪除了hyp_mem節(jié)點,新增了kboot_uboot_logmem節(jié)點;
規(guī)則3:只有引用申明的節(jié)點,在dtsi中“&節(jié)點名”才會生效,否則引用點將不生效;例如:firmware節(jié)點下fstab 節(jié)點的定義如下

firmware:firmware中“:”之前的內容為引用申明。只有申明后才可以在其他地方引用。Firmware下的fstab 節(jié)點沒有引用聲明,在其他位置就不可以引用。如果要修改fstab節(jié)點里的屬性,引用firmware節(jié)點然后修改其中屬性,案例如下:

對于同一個節(jié)點的設置情況,dts文件中的內容會覆蓋dtsi中的。
六、調試手段
在調試的過程中,沒有達到預期時,需要先確定修改有沒有編譯到對應的dtbo.img中,就需要反編譯dtbo.img
1. 反編譯工具
反編譯工具代碼中自帶,只需要初始化一下環(huán)境變量就可以使用。初始化指令如下:

2. 反編譯dtb.img
3.?反編譯dtbo.img
原文作者:內核工匠
