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

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

ภาพซ้อนทับสามารถใช้กับโหนดจาก 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 ในบรรทัดคำสั่งของเคอร์เนล
    • พารามิเตอร์ต้องระบุดัชนีที่อิงตาม 0 ของ DTO จากอิมเมจพาร์ติชัน DTBO ที่ใช้กับ DT ฐาน (ในลำดับเดียวกัน)
    • ดัชนีต้องอ้างอิงถึงตำแหน่งของการซ้อนทับในพาร์ติชัน DTBO

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

ตรวจสอบพาร์ติชัน 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";
	};
};