Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

編譯與驗證

您可以使用設備樹編譯器(DTC)來編譯設備樹源文件。但是,在將覆蓋DT應用到目標主DT之前,還應該通過模擬DTO的行為來驗證結果。

用DTC編譯

使用dtc編譯.dts ,必須添加選項-@在結果.dtbo添加__symbols__節點。 __symbols__節點包含所有標記有標籤的節點的列表,DTO庫可將其用作引用。

構建主DT .dts示例命令:

第444章

構建覆蓋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.dtsmy_overlay_dt_wo_header.dts (或所需的任何文件名)。
  2. 創建主要.dts的副本。在副本的最後一行之後,為在步驟1中創建的文件添加include語法。例如:
    /include/ "my_overlay_dt_wo_header.dts"
    
    將文件my_main_dt_with_include.dtsmy_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分區中選擇的覆蓋。例如,參數androidboot. dtbo_idx=x,y,z報告xyz從DTBO分區設備樹疊加(DTO的)的基於零的指數施加(以該順序)由引導加載程序到基部設備樹(DT)。

覆蓋可以應用於主設備樹中的節點,也可以添加新節點,但是不能引用先前覆蓋中添加的節點。此限制是必需的,因為覆蓋應用程序不會將覆蓋符號表與主DT符號表合併(不合併避免符號名稱衝突和覆蓋之間的依存關係複雜)。

示例:無效的疊加層

在此示例中, overlay_2.dts引用節點e ,該節點由overlay_1.dts添加。在將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>;
    };
};
593

示例:有效的疊加層

在此示例中, 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分區,請確保引導加載程序可以執行以下操作:

  1. 確定正在運行的電路板,然後選擇要應用的相應覆蓋層。
  2. androidboot.dtbo_idx參數附加到內核命令行。
    • 該參數必須指示DTO應用於基礎DT的DTBO分區映像中DTO的從零開始的索引(順序相同)。
    • 索引必須引用疊加層在DTBO分區中的位置。

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

驗證DTBO分區

您可以使用VTS驗證以下內容:

  • 內核命令行參數androidboot.dtbo_idx (通過檢查Init是否已自動設置相應的ro.boot.dtbo_idx系統屬性)。
  • ro.boot.dtbo_idx系統屬性的有效性(通過檢查該屬性是否指定了至少一個有效的DTBO映像索引)。
  • DTBO分區的有效性(還驗證DTBO分區中應用於基本DT的疊加層)。
  • 結果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";
	};
};