您可以使用裝置樹狀結構編譯器 (DTC) 編譯裝置樹狀結構來源 (DTS) 檔案。但在目標主要 DT 上套用重疊裝置樹狀結構 (DT) 之前, 也應模擬裝置樹狀結構疊加層 (DTO) 的行為來驗證結果。
使用 DTC 編譯
使用 dtc
編譯 .dts
時,您必須新增
-@
選項,在__symbols__
結果 .dtbo
。__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 結果
驗證程序可協助您找出將網站新增至 Google 帳戶後可能發生的錯誤
疊加在主要 DT 上的重疊 DT更新目標前,您可以
模擬 DTO 的行為,在主機上重疊 DT 結果,方法是使用
/include/
於 .dts
。
圖 1. 使用語法 /include/ 在主機上模擬 DTO。
- 建立疊加層
.dts
的副本。從副本中移除 第一行標題。範例:/dts-v1/; /plugin/;
將檔案儲存為my_overlay_dt_wo_header.dts
(或任何) 檔案名稱)。 - 建立主要
.dts
的副本。在文案中, 最後一行,並將您在步驟 1 建立的檔案 加入語法 中。 例如:/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:系統啟動載入程式必須動態疊加顯示裝置專屬的 DT SoC DT
表示套用的疊加層
如要啟用
供應商測試套件 (VTS),以評估重疊廣告的正確性
應用程式,供應商必須新增核心指令列參數
androidboot.dtbo_idx
:表示從
DTBO 分區。在使用核心版本的 Android 12 中
5.10 以上版本,這個參數會透過 bootconfig 傳送。
例如,androidboot.dtbo_idx=x,y,z
參數會回報
x
、y
和 z
為以零為基礎的索引
套用的 DTBO 分區的 DTO(按此順序)
才會由系統啟動載入程式改為基本 DT
重疊可以套用至主要 DT 中的節點或新增節點。 但「無法」參照前一個疊加層中加入的節點。這個 因為疊加層應用程式不會合併 與主要 DT 符號表的重疊符號表格 (未合併預防措施) 符號名稱上的衝突,以及這兩者之間存在依附元件的複雜性 疊加層)。
例如:無效的重疊元素
在這個範例中,overlay_2.dts
參照了節點
e
,由 新增
overlay_1.dts
。將 overlay_1
套用至
如果嘗試將 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
只參照節點
b
來自主要 DTS。時間
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 的零元索引 擷取自套用至基本 DT 的 DTBO 分區映像檔 (在同一處 順序)。
- 索引必須參照疊加層在 DTBO 中的位置
如要進一步瞭解 DTBO 分區的結構,請參閱裝置樹狀結構疊加層。
驗證 DTBO 分區
您可以使用 VTS 驗證以下項目:
- 具備核心指令列參數
androidboot.dtbo_idx
(確認Init
已 自動設定對應的ro.boot.dtbo_idx
系統 屬性)。 ro.boot.dtbo_idx
系統屬性的效力 ( 檢查屬性是否至少指定一張有效的 DTBO 圖片 索引)。- DTBO 分區的有效性 (同時驗證 DTBO 中的疊加層) 套用於基本 DT 的分區)。
- 產生的 DT 會顯示額外的節點或屬性變更 Linux kernel
例如,在下列疊加層和最終 DT 中,
androidboot.dtbo_idx=5,3
傳送至核心指令列
驗證,但將 androidboot.dtbo_idx=3,5
新增至核心
因此指令列不會通過驗證
將 DT 重疊在索引 3 | 將 DT 重疊於索引 5 |
---|---|
[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>; }; __符號__ { a = "/a"; b = "/b"; c = "/c"; }; }; |