รวบรวมและตรวจสอบ

คุณสามารถใช้ Device Tree Compiler (DTC) เพื่อคอมไพล์ไฟล์ Device Tree Source อย่างไรก็ตาม ก่อนที่จะใช้ 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 หลัก ก่อนอัปเดตเป้าหมาย คุณสามารถตรวจสอบผลลัพธ์ของการซ้อนทับ DT บนโฮสต์โดยจำลองการทำงานของ DTO โดยใช้ /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
    

กำลังยืนยัน DTO ใน Android 9

Android 9 ต้องใช้พาร์ติชั่น Device Tree Blob Overlay (DTBO) ในการเพิ่มโหนดหรือเปลี่ยนแปลงคุณสมบัติใน SoC DT ตัวโหลดบูตต้องวางซ้อน DT เฉพาะอุปกรณ์บน SoC DT แบบไดนามิก

ระบุการซ้อนทับที่ใช้

ในการเปิดใช้งาน Vendor Test Suite (VTS) เพื่อประเมินความถูกต้องของแอพพลิเคชั่นโอเวอร์เลย์ ผู้จำหน่ายต้องเพิ่มพารามิเตอร์บรรทัดคำสั่งเคอร์เนลใหม่ androidboot.dtbo_idx ที่ระบุโอเวอร์เลย์ที่เลือกจากพาร์ติชั่น DTBO ใน Android 12 ที่ใช้เคอร์เนลเวอร์ชัน 5.10 ขึ้นไป พารามิเตอร์นี้จะส่งผ่าน bootconfig ตัวอย่างเช่น พารามิเตอร์ androidboot.dtbo_idx=x,y,z รายงาน x , y และ z เป็นดัชนีแบบ zero-based ของ Device Tree Overlays (DTO) จากพาร์ติชัน DTBO ที่ใช้ (ตามลำดับ) โดย bootloader ไปยังฐาน แผนผังอุปกรณ์ (DT)

โอเวอร์เลย์ใช้ได้กับโหนดจากโครงสร้างอุปกรณ์หลักหรือเพิ่มโหนดใหม่ แต่ ไม่สามารถ อ้างอิงโหนดที่เพิ่มในโอเวอร์เลย์ก่อนหน้าได้ ข้อจำกัดนี้จำเป็นเนื่องจากแอปพลิเคชันโอเวอร์เลย์ไม่ผสานตารางสัญลักษณ์โอเวอร์เลย์กับตารางสัญลักษณ์ DT หลัก (การไม่ผสานเพื่อหลีกเลี่ยงความขัดแย้งในชื่อสัญลักษณ์และความซับซ้อนของการขึ้นต่อกันระหว่างโอเวอร์เลย์)

ตัวอย่าง: โอเวอร์เลย์ไม่ถูกต้อง

ในตัวอย่างนี้ overlay_2.dts อ้างถึง node e ซึ่งถูกเพิ่มโดย overlay_1.dts หลังจาก overlay_1 ถูกนำไปใช้กับ DT หลัก หากมีความพยายามในการใช้ 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 ค่าของคุณสมบัติ prop ในโหนด e (กำหนดโดย 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 ต่อท้ายบรรทัดรับคำสั่งเคอร์เนล
    • พารามิเตอร์ต้องระบุ ดัชนีฐานศูนย์ของ DTO จากอิมเมจพาร์ติชัน DTBO ที่ใช้กับ DT ฐาน (ในลำดับเดียวกัน)
    • ดัชนีต้องอ้างอิงถึงตำแหน่งของโอเวอร์เลย์ในพาร์ติชั่น DTBO

สำหรับรายละเอียดเกี่ยวกับโครงสร้างของพาร์ติชั่น DTBO โปรดดูที่ Device Tree Overlays บน 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 ลงในบรรทัดคำสั่งเคอร์เนลไม่ผ่านการตรวจสอบ

โอเวอร์เลย์ 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>;
	};

	__symbols__ {
		a = "/a";
		b = "/b";
		c = "/c";
	};
};