您可以使用裝置樹狀結構編譯器 (DTC) 編譯裝置樹狀結構來源 (DTS) 檔案。不過,在目標主要 DT 上套用疊加裝置樹狀結構 (DT) 之前,您也應模擬裝置樹狀結構疊加 (DTO) 的行為,驗證結果。
使用 DTC 編譯
使用 dtc 編譯 .dts 時,必須新增選項 -@,才能在產生的 .dtbo 中新增 __symbols__ 節點。__symbols__ 節點包含標示標籤的所有節點清單,DTO 程式庫可將這些節點用於參照。
建構主要 DT .dts 的範例指令:
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
建構疊加 DT .dts 的範例指令:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
在主機上驗證 DTO 結果
驗證可協助您找出在主要 DT 上放置疊加 DT 時可能發生的錯誤。更新目標前,您可以在 .dts 中使用 /include/ 模擬 DTO 的行為,驗證在主機上疊加 DT 的結果。

圖 1. 使用 /include/ 語法在主機上模擬 DTO。
- 建立疊加層「
.dts」的副本。在副本中,移除第一行標題。範例: 將檔案儲存為/dts-v1/; /plugin/;
my_overlay_dt_wo_header.dts(或任何您想要的檔案名稱)。 - 建立主要
.dts的副本。在副本中,於最後一行後方,附加您在步驟 1 中建立的檔案的 include 語法。例如: 將檔案儲存為/include/ "my_overlay_dt_wo_header.dts"
my_main_dt_with_include.dts(或任何您想要的檔案名稱)。 - 使用
dtc編譯my_main_dt_with_include.dts,取得合併的 DT,結果應與 DTO 相同。例如:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- 使用
dtc傾印my_merged_dt.dto。dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
在 Android 9 中驗證 DTO
Android 9 需要裝置樹狀結構 Blob 疊加 (DTBO) 分割區。如要在 SoC DT 中新增節點或變更屬性,開機載入器必須在 SoC DT 上動態疊加裝置專屬 DT。
指出套用的疊加層
如要啟用
供應商測試套件 (VTS) 來評估疊加應用程式的正確性,供應商必須新增核心指令列參數 androidboot.dtbo_idx,指出從 DTBO 分割區選取的疊加層。在 Android 12 中,如果使用核心版本 5.10 以上,這個參數會透過 bootconfig 傳遞。舉例來說,參數 androidboot.dtbo_idx=x,y,z 會將 DTBO 分區的 DTO (由開機載入程式依序套用至基本 DT) 以從零開始的索引回報為 x、y 和 z。
疊加層可套用至主要 DT 的節點或新增節點,但無法參照先前疊加層中新增的節點。由於疊加應用程式不會將疊加符號表與主要 DT 符號表合併 (避免符號名稱發生衝突,以及疊加層之間的依附元件複雜化),因此必須遵守這項限制。
示例:無效的重疊內容
在本範例中,overlay_2.dts 是指由 overlay_1.dts 新增的節點 e。將 overlay_1 套用至主要 DT 後,如果嘗試將 overlay_2 套用至產生的 DT,疊加應用程式會失敗,並顯示符號 e 不在基本 DT 的符號表中的錯誤訊息。
| main.dts | overlay_1.dts | overlay_2.dts |
|---|---|---|
[main.dts]
/dts-v1/;
/ {
a: a {};
b: b {};
c: c {};
};
|
[overlay_1.dts]
/dts-v1/;
/plugin/;
&b { ref1 = <&a>;
e: e {
prop = <0x0a>;
phandle = <0x04>;
};
};
|
[overlay_2.dts]
/dts-v1/;
/plugin/;
/* invalid! */
&e {
prop = <0x0b>;
};
|
範例:有效的疊加層
在本範例中,overlay_2.dts 僅指主要 DTS 中的節點 b。如果 overlay_1 套用至基本 DT,然後是 overlay_2 的應用程式,則節點 e 中的屬性 prop 值 (由 overlay_1.dts 設定) 會由 overlay_2.dts 設定的值覆寫。
| main.dts | overlay_1.dts | overlay_2.dts |
|---|---|---|
[final.dts]
/dts-v1/;
/ {
a: a {};
b: b {};
c: c {};
};
|
[overlay_1.dts]
/dts-v1/;
/plugin/;
&b { ref1 = <&a>;
e {
prop = <0x0c>;
};
};
|
[overlay_2.dts]
/dts-v1/;
/plugin/;
/* valid */
&b { ref1 = <&c>;
e {
prop = <0x0d>;
};
};
|
實作 DTBO 分區
如要實作必要的 DTBO 分區,請確保開機載入程式可以執行下列操作:
- 找出執行該測試的開發板,然後選取要套用的對應疊加層。
- 將
androidboot.dtbo_idx參數附加至核心指令列。- 這個參數必須指出 DTO 的從零開始計算的索引,這些 DTO 來自套用至基本 DT 的 DTBO 分區映像檔 (順序相同)。
- 索引必須參照 DTBO 分割區中疊加層的位置。
如要瞭解 DTBO 分區的結構,請參閱「裝置樹狀結構疊加」。
驗證 DTBO 分區
您可以使用 VTS 驗證下列項目:
- 核心指令列參數
androidboot.dtbo_idx的存在 (檢查Init是否已自動設定對應的ro.boot.dtbo_idx系統屬性)。 ro.boot.dtbo_idx系統屬性的有效性 (檢查屬性是否指定至少一個有效的 DTBO 映像檔索引)。- DTBO 分區的有效性 (也會驗證套用至基本 DT 的 DTBO 分區中的疊加層)。
- 產生的 DT 中其他節點或屬性變更會呈現給 Linux 核心。
舉例來說,在下列疊加層和最終 DT 中,將 androidboot.dtbo_idx=5,3 新增至核心指令列會通過驗證,但將 androidboot.dtbo_idx=3,5 新增至核心指令列則不會通過驗證。
| 在索引 3 處疊加 DT | 在索引 5 處疊加 DT |
|---|---|
[overlay_1.dts]
/dts-v1/;
/plugin/;
&c { prop = <0xfe>; };
|
[overlay_2.dts]
/dts-v1/;
/plugin/;
&c { prop = <0xff>; };
|
| 最終 DT |
|---|
/dts-v1/;
/ {
a {
phandle = <0x1>;
};
b {
phandle = <0x2>;
};
c {
phandle = <0x3>;
prop = <0xfe>;
};
__symbols__ {
a = "/a";
b = "/b";
c = "/c";
};
};
|