डिवाइस ट्री सोर्स (डीटीएस) फ़ाइलों को कंपाइल करने के लिए, डिवाइस ट्री कंपाइलर (डीटीसी) का इस्तेमाल किया जा सकता है. हालांकि, टारगेट मेन डीटी पर ओवरले डिवाइस ट्री (डीटी) लागू करने से पहले, आपको डिवाइस ट्री ओवरले (डीटीओ) के व्यवहार को सिम्युलेट करके नतीजे की पुष्टि भी करनी चाहिए.
डीटीसी के साथ कंपाइल करें
.dts
को कंपाइल करने के लिए dtc
का इस्तेमाल करते समय, आपको -@
विकल्प जोड़ना होगा. इससे, नतीजे के तौर पर मिले .dtbo
में __symbols__
नोड जोड़ा जा सकेगा. __symbols__
नोड में, लेबल किए गए सभी नोड की सूची होती है. DTO लाइब्रेरी, इस सूची का इस्तेमाल रेफ़रंस के लिए कर सकती है.
मुख्य डीटी .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 के नतीजों की पुष्टि करना
पुष्टि करने से, आपको उन गड़बड़ियों का पता लगाने में मदद मिल सकती है जो मुख्य डीटी पर ओवरले डीटी को रखते समय हो सकती हैं. टारगेट अपडेट करने से पहले, होस्ट पर डीटी ओवरले करने के नतीजे की पुष्टि की जा सकती है. इसके लिए, .dts
में /include/
का इस्तेमाल करके, डीटीओ के व्यवहार का सिम्युलेशन करें.
पहली इमेज. होस्ट पर डीटीओ का सिम्युलेशन करने के लिए, /include/ सिंटैक्स का इस्तेमाल करें.
- ओवरले
.dts
की कॉपी बनाएं. कॉपी में, पहली लाइन का हेडर हटाएं. उदाहरण: फ़ाइल को/dts-v1/; /plugin/;
my_overlay_dt_wo_header.dts
के तौर पर सेव करें. इसके अलावा, फ़ाइल को किसी भी नाम से सेव किया जा सकता है. - मुख्य
.dts
की कॉपी बनाएं. कॉपी में, आखिरी लाइन के बाद, पहले चरण में बनाई गई फ़ाइल के लिए include सिंटैक्स जोड़ें. उदाहरण के लिए: फ़ाइल को/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 में DTO की पुष्टि करना
Android 9 के लिए, डिवाइस ट्री ब्लॉब ओवरले (डीटीबीओ) पार्टिशन की ज़रूरत होती है. SoC DT में नोड जोड़ने या प्रॉपर्टी में बदलाव करने के लिए, बूटलोडर को SoC DT पर डिवाइस के हिसाब से DT को डाइनैमिक तौर पर ओवरले करना होगा.
इस्तेमाल किए गए ओवरले दिखाएं
वेंडर टेस्ट सुइट (वीटीएस) को ओवरले ऐप्लिकेशन की जांच करने की अनुमति देने के लिए, वेंडर को एक नया कर्नल कमांड लाइन पैरामीटर androidboot.dtbo_idx
जोड़ना होगा. इससे पता चलेगा कि DTBO पार्टीशन से कौनसे ओवरले चुने गए हैं. Android 12 में, कर्नेल वर्शन 5.10 या इसके बाद के वर्शन का इस्तेमाल करने पर, यह पैरामीटर बूट कॉन्फ़िगरेशन से होकर गुज़रता है.
उदाहरण के लिए, पैरामीटर androidboot.dtbo_idx=x,y,z
, DTBO पार्टीशन से लागू किए गए DTO के ज़ीरो-आधारित इंडेक्स के तौर पर x
, y
, और z
रिपोर्ट करता है. इन्हें बूटलोडर, बेस 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
में मौजूद प्रॉपर्टी 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 पार्टिशन को लागू करने के लिए, पक्का करें कि बूटलोडर ये काम कर सकता हो:
- उस बोर्ड की पहचान करें जिस पर यह चल रहा है. इसके बाद, लागू किए जाने वाले ओवरले चुनें.
androidboot.dtbo_idx
पैरामीटर को कर्नेल कमांड लाइन में जोड़ें.- इस पैरामीटर से, DTBO पार्टीशन इमेज के उन डीटीओ के ज़ीरो-आधारित इंडेक्स का पता चलना चाहिए जिन्हें बेस डीटी पर लागू किया गया है. ये इंडेक्स उसी क्रम में होने चाहिए.
- इंडेक्स, DTBO पार्टीशन में ओवरले की पोज़िशन के बारे में बताते हैं.
DTBO पार्टीशन के स्ट्रक्चर के बारे में जानने के लिए, डिवाइस ट्री ओवरले देखें.
DTBO पार्टीशन की पुष्टि करना
वीटीएस का इस्तेमाल करके, इनकी पुष्टि की जा सकती है:
- कर्नल कमांड लाइन पैरामीटर मौजूद है या नहीं
androidboot.dtbo_idx
. इसके लिए, यह देखा जाता है किInit
नेro.boot.dtbo_idx
सिस्टम प्रॉपर्टी को अपने-आप सेट अप किया है या नहीं. ro.boot.dtbo_idx
सिस्टम प्रॉपर्टी की वैधता. इसके लिए, यह जांच की जाती है कि प्रॉपर्टी में कम से कम एक मान्य DTBO इमेज इंडेक्स मौजूद है या नहीं.- DTBO पार्टिशन की वैधता (यह DTBO पार्टिशन में मौजूद उन ओवरले की भी पुष्टि करता है जो बेस DT पर लागू होते हैं).
- इसके बाद, Linux कर्नल को डीटी में मौजूद अतिरिक्त नोड या प्रॉपर्टी में हुए बदलावों के बारे में बताया जाता है.
उदाहरण के लिए, यहां दिए गए ओवरले और फ़ाइनल डीटी में, कर्नल कमांड लाइन में androidboot.dtbo_idx=5,3
जोड़ने पर पुष्टि हो जाती है. हालांकि, कर्नल कमांड लाइन में androidboot.dtbo_idx=3,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"; }; }; |