實施 DTO

實現 DTO 涉及劃分設備樹、構建、分區和運行。在你有一個可行的實現之後,你還必須保持兩個 DT 之間的兼容性,並確定一個策略來確保每個 DT 分區的安全性。

劃分DT

首先將設備樹分為兩 (2) 部分:

  • 主DT 。 SoC 供應商提供的純 SoC 部分和默認配置。
  • 覆蓋 DT 。由 ODM/OEM 提供的設備特定配置。

劃分設備樹後,必須保證主DT和overlay DT的兼容性,使主DT和overlay DT合併為一個完整的設備DT。有關 DTO 格式和規則的詳細信息,請參閱DTO 語法。有關多個設備樹的詳細信息,請參閱多個 DT

構建主要和覆蓋 DT

要構建主 DT:

  1. 將主 DT .dts編譯成.dtb文件。
  2. .dtb文件閃存到引導加載程序運行時可訪問的分區(詳情如下)。

要構建覆蓋 DT:

  1. 將覆蓋 DT .dts編譯為.dtbo文件。雖然此文件格式與格式化為扁平設備樹的.dtb文件相同,但不同的文件擴展名將其與主 DT 區分開來。
  2. .dtbo文件閃存到引導加載程序運行時可訪問的分區(如下所述)。

有關使用 DTC 編譯和在主機上驗證 DTO 結果的詳細信息,請參閱編譯和驗證

對 DT 進行分區

在閃存中確定引導加載程序運行時可訪問且受信任的位置以放置.dtb.dtbo

主要 DT 的示例位置:

  • 引導分區的一部分,附加到內核 ( image.gz )。
  • 在專用分區 ( dtb .dtb

覆蓋 DT 的示例位置:

唯一分區
圖 1..dtbo放入唯一的分區,例如dtbo分區。
ODM 分區
圖 2..dtbo放入odm分區(僅當您的引導加載程序能夠從odm分區的文件系統加載數據時才這樣做)。

注意:覆蓋 DT 分區的大小取決於設備和主 DT blob 頂部所需的更改量。通常,8 MB 綽綽有餘,如果需要,還可以在未來增加空間。

對於支持無縫 (A/B) 更新的設備,A/B 主 DT 和覆蓋 DT 分區:

示例 1
圖 3. DTBO 分區 A/B,示例 1。
示例 2
圖 4. DTBO 分區 A/B,示例 2。

在引導加載程序中運行

跑步:

圖 5.引導加載程序中設備樹覆蓋的典型運行時實現。
  1. .dtb從存儲加載到內存中。
  2. .dtbo從存儲加載到內存中。
  3. .dtb.dtbo重疊以成為合併的 DT。
  4. 給定合併 DT 的內存地址,啟動內核。

保持兼容性

主 DTB(來自 SoC 供應商)被視為 DTBO 的 API 表面。將設備樹分為 SoC 通用部分和設備專用部分後,您必須在未來保持這兩個部分相互兼容,包括:

  • 主 DT 中的 DT 定義(例如節點、屬性、標籤) 。主 DT 中的任何定義更改都可能觸發覆蓋 DT 中的更改。例如,要更正主 DT 中的節點名稱,請定義一個映射到原始節點名稱的“別名”標籤(以避免覆蓋 DT 的更改)。
  • 覆蓋 DT 存儲位置(例如分區名稱、存儲格式)

確保安全

引導加載程序必須確保 DTB/DTBO 是安全的、未修改的和未損壞的。您可以使用任何解決方案來保護 DTB/DTBO,例如,VBoot 1.0 或AVB HASH 頁腳(VBoot 2.0) 中的引導映像簽名

  • 如果 DTB/DTBO 在唯一的分區中,您可以將該分區添加到 AVB 的信任鏈中。信任鏈從受硬件保護的信任根開始,進入引導加載程序,驗證 DTB/DTBO 分區的完整性和真實性。
  • 如果 DTB/DTBO 在現有分區中(例如odm分區),則該分區應該在 AVB 的信任鏈中。 (DTBO 分區可以與odm分區共享一個公鑰)。

有關詳細信息,請參閱驗證啟動