編譯和驗證

您可以使用設備樹編譯器 (DTC) 來編譯設備樹源文件。但是,在將覆蓋 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 結果

驗證可以幫助您識別在將覆蓋 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 中添加節點或更改屬性,引導加載程序必須在 SoC DT 上動態覆蓋特定於設備的 DT。

指示應用的疊加層

為了使銷售商測試套件(VTS)來評估疊加應用的正確性,銷售商必須添加新的內核命令行參數androidboot.dtbo_idx ,指示從DTBO分區中選擇的疊加層。在使用內核版本 5.10 或更高版本的 Android 12 中,此參數通過 bootconfig。例如,參數androidboot. dtbo_idx=x,y,z報告xyz從DTBO分區設備樹疊加(DTO的)的基於零的指數施加(以該順序)由引導加載程序到基部設備樹(DT)。

疊加可以申請節點從主設備樹或添加新節點,但不能指在先前的疊加增加了一個節點。此限制是必要的,因為覆蓋應用程序不會將覆蓋符號表與主 DT 符號表合併(不合併可避免符號名稱衝突以及覆蓋之間依賴關係的複雜化)。

示例:無效的疊加

在這個例子中, overlay_2.dts指節點e ,其通過加入overlay_1.dts 。後overlay_1被施加到主DT,如果試圖以應用overlay_2至所得DT,覆蓋應用程序將所述符號失敗,錯誤e不存在於用於基DT符號表。

主文件覆蓋_1.dts覆蓋_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 ,屬性的值prop在節點e (由集overlay_1.dts )由設置的值覆蓋overlay_2.dts

主文件覆蓋_1.dts覆蓋_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參數到內核的命令行。
    • 該參數必須指示它應用於基本 DT 的 DTBO 分區映像中 DTO 的從零開始的索引(以相同的順序)。
    • 索引必須指代覆蓋在 DTBO 分區中的位置。

有關DTBO分區的結構的詳細信息,請參閱設備樹疊加上source.android.com。

驗證 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";
	};
};