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

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

ओवरले, मुख्य डेटाटेंप्लेट के नोड पर लागू किए जा सकते हैं या नए नोड जोड़े जा सकते हैं. हालांकि, किसी पिछले ओवरले में जोड़े गए नोड का रेफ़रंस नहीं दिया जा सकता. यह पाबंदी ज़रूरी है, क्योंकि ओवरले ऐप्लिकेशन, ओवरले सिंबल टेबल को मुख्य 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 पार्टीशन लागू करने के लिए, पक्का करें कि बूटलोडर ये काम कर सकता हो:

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