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