คุณสามารถใช้คอมไพเลอร์ 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 ในโฮสต์
- สร้างสำเนาของการวางซ้อน
.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.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 ที่จำเป็น ให้ตรวจสอบว่าบูตโหลดเดอร์ทําสิ่งต่อไปนี้ได้
- ระบุกระดานที่เล่นเกมและเลือกการวางซ้อนที่เกี่ยวข้องเพื่อนำมาใช้
- ต่อท้ายพารามิเตอร์
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"; }; }; |