डिवाइस ट्री सोर्स (डीटीएस) फ़ाइलों को कंपाइल करने के लिए, डिवाइस ट्री कंपाइलर (डीटीसी) का इस्तेमाल किया जा सकता है. हालांकि, टारगेट किए गए मुख्य DT पर ओवरले डिवाइस ट्री (DT) लागू करने से पहले, आपको डिवाइस ट्री ओवरले (DTO) के व्यवहार को सिम्युलेट करके, नतीजे की पुष्टि भी करनी चाहिए.
डीटीसी की मदद से कंपाइल करना
.dts
को कंपाइल करने के लिए dtc
का इस्तेमाल करते समय, आपको .dtbo
में __symbols__
नोड जोड़ने के लिए, -@
विकल्प जोड़ना होगा. __symbols__
नोड में, लेबल के साथ मार्क किए गए सभी नोड की सूची होती है. डीटीओ लाइब्रेरी, रेफ़रंस के लिए इसका इस्तेमाल कर सकती है.
मुख्य 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
होस्ट पर डीटीओ के नतीजों की पुष्टि करना
पुष्टि से आपको उन गड़बड़ियों की पहचान करने में मदद मिल सकती है जो ओवरले डीटी को मुख्य डीटी पर लगाते समय हो सकती हैं. टारगेट को अपडेट करने से पहले, होस्ट पर डीटी को ओवरले करने के नतीजे की पुष्टि की जा सकती है. इसके लिए, .dts
में /include/
का इस्तेमाल करके डीटीओ के व्यवहार को सिम्युलेट करें.
पहली इमेज. होस्ट पर डीटीओ को सिम्युलेट करने के लिए, सिंटैक्स /include/ का इस्तेमाल करें.
- ओवरले
.dts
की एक कॉपी बनाएं. कॉपी में, पहली लाइन का हेडर हटाएं. उदाहरण:/dts-v1/; /plugin/;
फ़ाइल कोmy_overlay_dt_wo_header.dts
(या अपनी पसंद के किसी भी फ़ाइल नाम) के तौर पर सेव करें. - मुख्य
.dts
की कॉपी बनाएं. कॉपी में, आखिरी लाइन के बाद, पहले चरण में बनाई गई फ़ाइल के लिए शामिल करें सिंटैक्स जोड़ें. उदाहरण के लिए:/include/ "my_overlay_dt_wo_header.dts"
फ़ाइल कोmy_main_dt_with_include.dts
(या अपनी पसंद का कोई भी नाम) के तौर पर सेव करें. - मर्ज किया गया DT पाने के लिए,
dtc
का इस्तेमाल करकेmy_main_dt_with_include.dts
को कंपाइल करें. यह नतीजा, DTO जैसा ही होना चाहिए. उदाहरण के लिए:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
my_merged_dt.dto
को डंप करने के लिए,dtc
का इस्तेमाल करें.dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
Android 9 में डीटीओ की पुष्टि करें
Android 9 के लिए, डिवाइस ट्री ब्लॉब ओवरले (DTBO) सेक्शन होना ज़रूरी है. SoC DT में नोड जोड़ने या प्रॉपर्टी में बदलाव करने के लिए, बूटलोडर को डिवाइस के हिसाब से DT को SoC DT पर डाइनैमिक तौर पर ओवरले करना होगा.
लागू किए गए ओवरले दिखाना
ओवरले ऐप्लिकेशन के सही होने का आकलन करने के लिए,
वेंडर टेस्ट सुइट (वीटीएस) को चालू करने के लिए, वेंडर को एक नया कर्नेल कमांड लाइन पैरामीटर androidboot.dtbo_idx
जोड़ना होगा. इससे, DTBO से चुने गए ओवरले के बारे में पता चलता है. Android 12 में, 5.10 या इसके बाद के वर्शन वाले कर्नेल का इस्तेमाल करने पर, यह पैरामीटर bootconfig से गुज़रता है.
उदाहरण के लिए, पैरामीटर androidboot.dtbo_idx=x,y,z
,
x
, y
, और z
को
डीटीओ के शून्य-आधारित इंडेक्स के तौर पर, बूटलोडर के बेस डीटी पर लागू किए गए डीटीबीओ पार्टीशन (इसी क्रम में) के तौर पर दिखाता है.
ओवरले, मुख्य डेटाटेंप्लेट के नोड पर लागू किए जा सकते हैं या नए नोड जोड़े जा सकते हैं. हालांकि, किसी पिछले ओवरले में जोड़े गए नोड का रेफ़रंस नहीं दिया जा सकता. यह पाबंदी ज़रूरी है, क्योंकि ओवरले ऐप्लिकेशन, ओवरले सिंबल टेबल को मुख्य DT सिंबल टेबल के साथ मर्ज नहीं करता. मर्ज न करने से, सिंबल के नामों में होने वाले संघर्ष और ओवरले के बीच डिपेंडेंसी की समस्या से बचा जा सकता है.
उदाहरण: अमान्य ओवरले
इस उदाहरण में, overlay_2.dts
से नोड का मतलब है
e
, जिसे
overlay_1.dts
ने जोड़ा था. मुख्य डीटी पर overlay_1
लागू करने के बाद, अगर नतीजे वाले डीटी पर overlay_2
लागू करने की कोशिश की जाती है, तो ओवरले ऐप्लिकेशन गड़बड़ी के साथ बंद हो जाता है. गड़बड़ी का मैसेज यह होता है कि मुख्य डीटी के लिए, सिंबल टेबल में सिंबल e
मौजूद नहीं है.
main.dts | overlay_1.dts | ओवरले_2.डीटीएस |
---|---|---|
[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
के बारे में बताता है. जब
overlay_1
को बुनियादी डीटी पर लागू किया जाता है, फिर overlay_2
के ऐप्लिकेशन के बाद, e
नोड में प्रॉपर्टी prop
की वैल्यू (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
पैरामीटर को कर्नेल कमांड लाइन में जोड़ें.- पैरामीटर में, DTBO के उस सेगमेंट की इमेज से डीटीओ के शून्य-आधारित इंडेक्स की जानकारी होनी चाहिए जिसे बेस डीटी पर लागू किया गया है. साथ ही, यह जानकारी उसी क्रम में होनी चाहिए.
- इंडेक्स, DTBO पार्टीशन में ओवरले की पोज़िशन के बारे में बताते हैं.
DTBO पार्टीशन के स्ट्रक्चर के बारे में जानने के लिए, डिवाइस ट्री ओवरले देखें.
DTBO पार्टीशन की पुष्टि करना
वीटीएस का इस्तेमाल करके, इन चीज़ों की पुष्टि की जा सकती है:
- कर्नेल कमांड लाइन पैरामीटर
androidboot.dtbo_idx
मौजूद है. यह जांच करके देखें किInit
ने इससे जुड़ीro.boot.dtbo_idx
सिस्टम प्रॉपर्टी अपने-आप सेट अप कर ली है. ro.boot.dtbo_idx
सिस्टम प्रॉपर्टी की वैधता (यह जांच करके कि प्रॉपर्टी कम से कम एक मान्य DTBO इमेज इंडेक्स तय करती है).- DTBO विभाजन की वैधता (यह DTBO विभाजन में ओवरले की भी पुष्टि करता है जो बेस DT पर लागू होता है).
- डीटी में अतिरिक्त नोड या प्रॉपर्टी में किए गए बदलाव, Linux kernel को दिखाए जाते हैं.
उदाहरण के लिए, नीचे दिए गए ओवरले और फ़ाइनल डीटी में, कर्नेल कमांड लाइन में androidboot.dtbo_idx=5,3
जोड़ने पर पुष्टि हो जाती है, लेकिन कर्नेल कमांड लाइन में androidboot.dtbo_idx=3,5
जोड़ने पर पुष्टि नहीं होती.
इंडेक्स 3 पर DT को ओवरले करना | इंडेक्स 5 पर ओवरले डीटी |
---|---|
[overlay_1.dts] /dts-v1/; /plugin/; &c { prop = <0xfe>; }; |
[overlay_2.dts] /dts-v1/; /plugin/; &c { prop = <0xff>; }; |
फ़ाइनल डीटी |
---|
/dts-v1/; / { a { phandle = <0x1>; }; b { phandle = <0x2>; }; c { phandle = <0x3>; prop = <0xfe>; }; __symbols__ { a = "/a"; b = "/b"; c = "/c"; }; }; |