คุณใช้คอมไพเลอร์ 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 ในโฮสต์
- สร้างสำเนาของภาพซ้อนทับ
.dtsในสำเนา ให้นำส่วนหัวบรรทัดแรกออก ตัวอย่าง บันทึกไฟล์เป็น/dts-v1/; /plugin/;
my_overlay_dt_wo_header.dts(หรือชื่อไฟล์ใดก็ได้ที่คุณต้องการ) - สร้างสำเนาของ
.dtsหลัก ในสำเนา ให้เพิ่มไวยากรณ์ include สำหรับไฟล์ที่คุณสร้างในขั้นตอนที่ 1 ต่อท้ายบรรทัดสุดท้าย เช่น บันทึกไฟล์เป็น/include/ "my_overlay_dt_wo_header.dts"
my_main_dt_with_include.dts(หรือชื่อไฟล์ใดก็ได้ที่คุณต้องการ) - ใช้
dtcเพื่อรวบรวมmy_main_dt_with_include.dtsเพื่อรับ DT ที่ผสาน ซึ่งควร เป็นผลลัพธ์เดียวกันกับ DTO เช่นdtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- ใช้
dtcเพื่อทิ้งmy_merged_dt.dtodtc -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 ทำสิ่งต่อไปนี้ได้
- ระบุบอร์ดที่กำลังใช้งานอยู่ แล้วเลือกการซ้อนทับที่เกี่ยวข้อง เพื่อนำไปใช้
- ต่อท้ายพารามิเตอร์
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";
};
};
|