編譯並驗證

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

  1. 建立覆疊 .dts 的副本。在副本中移除第一行標頭。示例:
    /dts-v1/;
    /plugin/;
    
    將檔案儲存為 my_overlay_dt_wo_header.dts (或任何您想要的檔案名稱)。
  2. 建立主要 .dts 的副本。在副本中,在最後一行之後,附加您在步驟 1 中建立的檔案的 include 語法。例如:
    /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 中的屬性,Bootloader 必須在 SoC DT 上動態重疊裝置專屬的 DT。

指示套用的疊加層

為讓 供應商測試套件 (VTS) 評估疊加應用程式的正確性,供應商必須新增核心指令列參數 androidboot.dtbo_idx,指出從 DTBO 分割區選取的疊加層。在使用核心版本 5.10 以上版本的 Android 12 中,這個參數會傳送至 bootconfig。舉例來說,參數 androidboot.dtbo_idx=x,y,z 會將 xyz 回報為 DTO 的零基索引,這些 DTO 是 bootloader 依序套用至基礎 DT 的 DTBO 分區。

疊加層可套用至主要資料表的節點,或新增節點,但不能參照先前疊加層中新增的節點。這項限制是必要的,因為疊加應用程式不會將疊加符號表與主要 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 分割區,請確保 Bootloader 可執行下列操作:

  1. 找出所執行的板子,然後選取要套用的對應疊加層。
  2. 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";
	};
};