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

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

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

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

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