डिवाइस ट्री सोर्स (डीटीएस) फ़ाइलों को कंपाइल करने के लिए, डिवाइस ट्री कंपाइलर (डीटीसी) का इस्तेमाल किया जा सकता है. हालांकि, टारगेट किए गए मुख्य 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
को ज़ीरो-आधारित इंडेक्स के तौर पर रिपोर्ट करता है. ये इंडेक्स, DTBO पार्टीशन के DTOs के होते हैं. इन्हें बूटलोडर, बेस DT पर लागू करता है.
ओवरले, मुख्य डेटाटेंप्लेट के नोड पर लागू किए जा सकते हैं या नए नोड जोड़े जा सकते हैं. हालांकि, किसी पिछले ओवरले में जोड़े गए नोड का रेफ़रंस नहीं दिया जा सकता. यह पाबंदी ज़रूरी है, क्योंकि ओवरले ऐप्लिकेशन, ओवरले सिंबल टेबल को मुख्य DT सिंबल टेबल के साथ मर्ज नहीं करता. मर्ज न करने से, सिंबल के नामों में होने वाले संघर्ष और ओवरले के बीच डिपेंडेंसी की समस्या से बचा जा सकता है.
उदाहरण: अमान्य ओवरले
इस उदाहरण में, overlay_2.dts
का मतलब नोड
e
से है , जिसे
overlay_1.dts
ने जोड़ा था. मुख्य डीटी पर overlay_1
लागू करने के बाद, अगर नतीजे वाले डीटी पर overlay_2
लागू करने की कोशिश की जाती है, तो ओवरले ऐप्लिकेशन गड़बड़ी के साथ बंद हो जाता है. गड़बड़ी का मैसेज यह होता है कि मुख्य डीटी के लिए, सिंबल टेबल में सिंबल e
मौजूद नहीं है.
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
सिर्फ़ मुख्य DTS के नोड b
को रेफ़र करता है. जब
overlay_1
को बेस डीटी पर लागू किया जाता है, फिर उसके बाद overlay_2
के ऐप्लिकेशन को लागू किया जाता है, तो नोड e
(overlay_1.dts
से सेट की गई) में मौजूद प्रॉपर्टी prop
की वैल्यू, 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
सिस्टम प्रॉपर्टी की वैधता (यह देखकर कि प्रॉपर्टी में कम से कम एक मान्य डीटीबीओ इमेज इंडेक्स दिया गया हो).- डीटीबीओ सेक्शन की पुष्टि (इसमें डीटीबीओ सेक्शन में मौजूद उन ओवरले की पुष्टि भी की जाती है जो बेस डीटी पर लागू होते हैं).
- डीटी में अतिरिक्त नोड या प्रॉपर्टी में किए गए बदलाव, 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"; }; }; |