您可以使用裝置樹狀結構編譯器 (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 分區選取的疊加層。在使用核心 5.10 以上版本的 Android 12 中,這個參數會傳遞 bootconfig。舉例來說,androidboot.dtbo_idx=x,y,z
參數會將 x
、y
和 z
回報為系統啟動載入程式向基本 DT 套用的 DTBO 分區 DTO 的零型索引。
疊加層可套用至主要資料表的節點,或新增節點,但不能參照先前疊加層中新增的節點。這項限制是必要的,因為疊加應用程式不會將疊加符號表與主要 DT 符號表合併 (不合併可避免符號名稱發生衝突,並避免疊加層之間的依附元件複雜化)。
範例:無效的疊加層
在本範例中,overlay_2.dts
是指由 overlay_1.dts
新增的節點 e
。將 overlay_1
套用至主要 DT 後,如果嘗試將 overlay_2
套用至產生的 DT,覆蓋應用程式會失敗,並顯示錯誤訊息,指出基礎 DT 的符號表中沒有 e
符號。
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
參數附加至核心指令列。- 該參數必須指出從 DTBO 分割區映像檔套用至基礎 DT 的 DTO 的零起索引 (以相同順序)。
- 索引必須參照 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"; }; }; |