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

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

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

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

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

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

ในตัวอย่างนี้ 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 ที่จำเป็น ให้ตรวจสอบว่าบูตโหลดเดอร์ทําสิ่งต่อไปนี้ได้

  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";
	};
};