編譯並驗證

您可以使用裝置樹狀結構編譯器 (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。

  1. 建立疊加層 .dts 的副本。從副本中移除 第一行標題。範例:
    /dts-v1/;
    /plugin/;
    
    將檔案儲存為 my_overlay_dt_wo_header.dts (或任何) 檔案名稱)。
  2. 建立主要 .dts 的副本。在文案中, 最後一行,並將您在步驟 1 建立的檔案 加入語法 中。 例如:
    /include/ "my_overlay_dt_wo_header.dts"
    
    將檔案儲存為 my_main_dt_with_include.dts (或任何) 檔案名稱)。
  3. 使用 dtc 編譯 my_main_dt_with_include.dts 來取得合併的 DT, 與 DTO 相同的結果。例如:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. 使用 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 參數會回報 xyz 為以零為基礎的索引 套用的 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 分區,請確保系統啟動載入程式可以 包括:

  1. 找出正在執行的主機板,並選取對應的 我們要套用的
  2. 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";
	};
};