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

คุณสามารถใช้ 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 เป็นดัชนีฐานศูนย์ของ Device Tree Overlays (DTO) จากพาร์ติชัน DTBO ที่ใช้ (ตามลำดับนั้น) โดย bootloader กับฐาน แผนผังอุปกรณ์ (DT)

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

ตัวอย่าง: การวางซ้อนไม่ถูกต้อง

ในตัวอย่างนี้ overlay_2.dts อ้างถึงโหนด 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>; };
ดีทีรอบสุดท้าย
/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

	c {
		phandle = <0x3>;
		prop = <0xfe>;
	};

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