คอมไพล์และยืนยัน

คุณสามารถใช้คอมไพเลอร์แผนผังอุปกรณ์ (DTC) เพื่อคอมไพเลอร์แหล่งที่มาของแผนผังอุปกรณ์ (DTS) อย่างไรก็ตาม ก่อนที่จะใช้โครงสร้างอุปกรณ์ซ้อนทับ (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 หลัก ในสำเนา หลังส่วน บรรทัดสุดท้าย ให้ใส่ไวยากรณ์ include สำหรับไฟล์ที่คุณสร้างในขั้นตอนที่ 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 ต้องใช้การวางซ้อน BLOB ของแผนผังอุปกรณ์ (DTBO) พาร์ติชัน วิธีเพิ่มโหนดหรือเปลี่ยนแปลงพร็อพเพอร์ตี้ใน SoC DT ตัว Bootloader จะต้องวางซ้อน DT เฉพาะอุปกรณ์แบบไดนามิก SoC DT

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

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

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

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

ในตัวอย่างนี้ overlay_2.dts หมายถึงโหนด e ซึ่งเพิ่มโดย overlay_1.dts หลังจากใช้ overlay_1 กับ DT หลัก หากมีการพยายามใช้ overlay_2 กับ DT ผลลัพธ์ แอปซ้อนทับทำงานไม่สำเร็จโดยมีข้อผิดพลาดที่สัญลักษณ์ ไม่มี e ในตารางสัญลักษณ์ของ DT พื้นฐาน

Main.dts การซ้อนทับ_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

Main.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 ที่จำเป็น ให้ตรวจสอบว่า Bootloader สามารถดำเนินการ ดังต่อไปนี้:

  1. ระบุบอร์ดที่สมาชิกใช้อยู่และเลือกบอร์ดที่เหมาะสม โฆษณาซ้อนทับที่จะใช้
  2. เพิ่มพารามิเตอร์ androidboot.dtbo_idx ต่อท้ายเคอร์เนล บรรทัดคำสั่ง
    • พารามิเตอร์ต้องระบุดัชนีฐาน 0 ของ DTO จากอิมเมจพาร์ติชัน DTBO ที่ใช้กับ DT พื้นฐาน (ใน คำสั่งซื้อ)
    • ดัชนีต้องอ้างอิงตำแหน่งของการวางซ้อนใน DTBO พาร์ติชัน

โปรดดูรายละเอียดเกี่ยวกับโครงสร้างของพาร์ติชัน DTBO ที่การวางซ้อนแผนผังอุปกรณ์

ตรวจสอบพาร์ติชัน DTBO

คุณใช้ VTS เพื่อยืนยันสิ่งต่อไปนี้ได้

  • การมีอยู่ของพารามิเตอร์บรรทัดคำสั่งเคอร์เนล androidboot.dtbo_idx (โดยการตรวจสอบว่า Init มี ตั้งค่าระบบ ro.boot.dtbo_idx ที่เกี่ยวข้องโดยอัตโนมัติ )
  • อายุการใช้งานของพร็อพเพอร์ตี้ระบบ ro.boot.dtbo_idx (โดย ตรวจสอบว่าพร็อพเพอร์ตี้ระบุอิมเมจ DTBO ที่ถูกต้องอย่างน้อย 1 รายการ ดัชนี)
  • อายุการใช้งานของพาร์ติชัน 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";

	};
};