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

คุณสามารถใช้คอมไพเลอร์ 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 หลัก (การไม่ผสานจะช่วยหลีกเลี่ยงความขัดแย้งในชื่อสัญลักษณ์และความซับซ้อนของความสัมพันธ์ระหว่างการวางซ้อน)

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

ในตัวอย่างนี้ 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";
	};
};