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

डिवाइस ट्री सोर्स (डीटीएस) फ़ाइलों को कंपाइल करने के लिए, डिवाइस ट्री कंपाइलर (डीटीसी) का इस्तेमाल किया जा सकता है. हालांकि, टारगेट मेन डीटी पर ओवरले डिवाइस ट्री (डीटी) लागू करने से पहले, आपको डिवाइस ट्री ओवरले (डीटीओ) के व्यवहार को सिम्युलेट करके नतीजे की पुष्टि भी करनी चाहिए.

डीटीसी के साथ कंपाइल करें

.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/ सिंटैक्स का इस्तेमाल करें.

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

  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 कर्नल को डीटी में मौजूद अतिरिक्त नोड या प्रॉपर्टी में हुए बदलावों के बारे में बताया जाता है.

उदाहरण के लिए, यहां दिए गए ओवरले और फ़ाइनल डीटी में, कर्नल कमांड लाइन में 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";
	};
};