कंपाइल करके पुष्टि करें

डिवाइस ट्री सोर्स (डीटीएस) फ़ाइलों को कंपाइल करने के लिए, डिवाइस ट्री कंपाइलर (डीटीसी) का इस्तेमाल किया जा सकता है. हालांकि, टारगेट किए गए मुख्य 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/ का इस्तेमाल करें.

  1. ओवरले .dts की कॉपी बनाएं. कॉपी में, पहली लाइन का हेडर हटाएं. उदाहरण:
    /dts-v1/;
    /plugin/;
    
    फ़ाइल को my_overlay_dt_wo_header.dts या अपनी पसंद के किसी भी नाम से सेव करें.
  2. मुख्य .dts की कॉपी बनाएं. कॉपी में, आखिरी लाइन के बाद, पहले चरण में बनाई गई फ़ाइल के लिए शामिल करें सिंटैक्स जोड़ें. उदाहरण के लिए:
    /include/ "my_overlay_dt_wo_header.dts"
    
    फ़ाइल को my_main_dt_with_include.dts या अपनी पसंद के किसी भी नाम से सेव करें.
  3. मर्ज किया गया DT पाने के लिए, dtc का इस्तेमाल करके my_main_dt_with_include.dts को कंपाइल करें. यह नतीजा, DTO जैसा ही होना चाहिए. उदाहरण के लिए:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. 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 पार्टीशन लागू करने के लिए, पक्का करें कि बूटलोडर ये काम कर सकता हो:

  1. यह पता लगाएं कि यह किस बोर्ड पर चल रहा है और लागू किए जाने वाले उन ओवरले को चुनें.
  2. 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";
	};
};