รูปแบบแหล่งที่มาของแผนผังอุปกรณ์ (DTS) คือการแสดงแผนผังอุปกรณ์ (DT) เป็นข้อความ คอมไพเลอร์ Device Tree (DTC) จะประมวลผลรูปแบบนี้ให้เป็น DT แบบไบนารี ซึ่งเป็นรูปแบบที่เคอร์เนล Linux คาดไว้
ใช้ข้อมูลอ้างอิง
โปรเจ็กต์ DTC (คอมไพเลอร์ต้นไม้อุปกรณ์ + แพตช์การวางซ้อน) จะอธิบายรูปแบบ DTS ใน dtc-format.txt และ manual.txt
รูปแบบและกฎของ DTO อธิบายไว้ใน dt-object-internal.txt
เอกสารเหล่านี้อธิบายวิธีอัปเดต DT หลักโดยใช้โหนด fragment@x
และไวยากรณ์ __overlay__
ใน DT การวางซ้อน เช่น
/ { fragment@0 { target = <&some_node>; __overlay__ { some_prop = "okay"; ... }; }; };
อย่างไรก็ตาม Google ขอแนะนําอย่างยิ่งให้คุณไม่ใช้ fragment@x
และไวยากรณ์ __overlay__
และใช้ไวยากรณ์อ้างอิงแทน เช่น
&some_node { some_prop = "okay"; ... };
dtc
จะคอมไพล์ไวยากรณ์อ้างอิงให้เป็นออบเจ็กต์เดียวกับด้านบนโดยใช้ไวยากรณ์ __overlay__
รูปแบบคำสั่งนี้ไม่บังคับให้คุณต้องระบุหมายเลขของข้อมูลโค้ด ทำให้อ่านและเขียน DTS การวางซ้อนได้ง่ายๆ หาก dtc
ไม่รองรับไวยากรณ์ที่ง่ายขึ้นนี้ ให้ใช้ dtc ใน AOSP
ใช้ป้ายกำกับ
หากต้องการอนุญาตการอ้างอิงที่ไม่ระบุซึ่งไม่มีอยู่ ณ เวลาคอมไพล์ ไฟล์ DT .dts
ของการวางซ้อนต้องมีแท็ก /plugin/
ในส่วนหัว เช่น
/dts-v1/; /plugin/;
จากที่นี่ คุณสามารถกําหนดเป้าหมายโหนดที่จะวางซ้อนกันโดยใช้ข้อมูลอ้างอิง ซึ่งเป็นเส้นทางโหนดแบบสัมบูรณ์ที่มีเครื่องหมายแอมเพอร์แซนด์ (&) นําหน้า เช่น สําหรับ node@0
ใน DT หลัก ให้ทำดังนี้
กำหนดป้ายกำกับใน DT หลัก ... | ... จากนั้นใช้ป้ายกำกับ |
---|---|
[my_main_dt.dts] /dts-v1/; / { my_node: node@0 { status = "disabled"; my_child: child@0 { value = <0xffffffff>; }; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node { status = "okay"; }; &my_child { value = <0x1>; }; |
ลบล้าง
หากพร็อพเพอร์ตี้เป้าหมายอ้างอิงมีอยู่ใน DT หลัก ระบบจะลบล้างพร็อพเพอร์ตี้นั้นหลังจาก DTO มิเช่นนั้น ระบบจะเพิ่มพร็อพเพอร์ตี้นั้นต่อท้าย เช่น
main.dts | overlay.dts | ผลลัพธ์ที่ผสานรวม |
---|---|---|
[my_main_dt.dts] /dts-v1/; / { compatible = "corp,foo"; my_node: node@0 { status = "disabled"; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node { status = "okay"; }; |
/dts-v1/; / { compatible = "corp,foo"; ... node@0 { linux,phandle = <0x1>; phandle = <0x1>; status = "okay"; }; }; |
ต่อท้าย
หากพร็อพเพอร์ตี้เป้าหมายอ้างอิงไม่อยู่ใน DT หลัก ระบบจะเพิ่มพร็อพเพอร์ตี้นั้นต่อท้าย DTO เช่น
main.dts | overlay.dts | ผลลัพธ์ที่ผสานรวม |
---|---|---|
[my_main_dt.dts] /dts-v1/; / { compatible = "corp,foo"; my_node: node@0 { status = "okay"; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node { new_prop = "bar"; }; |
/dts-v1/; / { compatible = "corp,foo"; ... node@0 { linux,phandle = <0x1>; phandle = <0x1>; status = "okay"; new_prop = "bar"; }; }; |
โหนดย่อย
ตัวอย่างไวยากรณ์ของโหนดย่อย
main.dts | overlay.dts | ผลลัพธ์ที่ผสานรวม |
---|---|---|
[my_main_dt.dts] /dts-v1/; / { compatible = "corp,foo"; my_nodes: nodes { compatible = "corp,bar"; node@0 { status = "disabled"; }; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_nodes { new_prop1 = "abc"; node@0 { status = "okay"; new_prop2 = "xyz"; }; }; |
/dts-v1/; / { compatible = "corp,foo"; ... nodes { linux,phandle = <0x1>; phandle = <0x1>; compatible = "corp,bar"; new_prop1 = "abc"; node@0 { linux,phandle = <0x2>; phandle = <0x2>; status = "okay"; new_prop2 = "xyz"; }; }; }; |