संकलन और सत्यापन

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

डीटीसी के साथ संकलन

.dts को संकलित करने के लिए dtc का उपयोग करते समय, आपको परिणामी .dtbo में __symbols__ नोड जोड़ने के लिए विकल्प -@ जोड़ना होगा। __symbols__ नोड में एक लेबल के साथ चिह्नित सभी नोड्स की एक सूची होती है, जिसे डीटीओ पुस्तकालय संदर्भ के लिए उपयोग कर सकता है।

मुख्य डीटी .dts बनाने के लिए नमूना आदेश:

dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts

ओवरले डीटी .dts बनाने के लिए नमूना आदेश:

dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts

होस्ट पर डीटीओ परिणाम सत्यापित करें

सत्यापन आपको उन त्रुटियों की पहचान करने में मदद कर सकता है जो ओवरले डीटी को मुख्य डीटी पर रखते समय हो सकती हैं। लक्ष्य को अपडेट करने से पहले, आप .dts में /include/ का उपयोग करके डीटीओ के व्यवहार का अनुकरण करके मेजबान पर डीटी को ओवरले करने के परिणाम को सत्यापित कर सकते हैं।

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

एंड्रॉइड 9 में डीटीओ सत्यापित करना

एंड्रॉइड 9 को डिवाइस ट्री ब्लॉब ओवरले (डीटीबीओ) विभाजन की आवश्यकता है। एसओसी डीटी में नोड्स जोड़ने या गुणों में परिवर्तन करने के लिए, बूटलोडर को एसओसी डीटी पर एक डिवाइस विशिष्ट डीटी को गतिशील रूप से ओवरले करना होगा।

लागू किए गए ओवरले का संकेत

ओवरले एप्लिकेशन की शुद्धता का आकलन करने के लिए विक्रेता टेस्ट सूट (वीटीएस) को सक्षम करने के लिए, विक्रेताओं को एक नया कर्नेल कमांड लाइन पैरामीटर androidboot.dtbo_idx जोड़ना होगा जो DTBO पार्टीशन से चुने गए ओवरले को इंगित करता है। Android 12 में कर्नेल संस्करण 5.10 या उच्चतर का उपयोग करते हुए, यह पैरामीटर bootconfig से होकर गुजरता है। उदाहरण के लिए, पैरामीटर androidboot.dtbo_idx=x,y,z रिपोर्ट x , y और z डिवाइस ट्री ओवरले (DTOs) के शून्य-आधारित सूचकांक के रूप में DTBO विभाजन से बूटलोडर द्वारा आधार पर लागू (उस क्रम में) डिवाइस ट्री (डीटी)।

ओवरले मुख्य डिवाइस ट्री से नोड्स पर लागू हो सकते हैं या नए नोड्स जोड़ सकते हैं, लेकिन पिछले ओवरले में जोड़े गए नोड को संदर्भित नहीं कर सकते । यह प्रतिबंध आवश्यक है क्योंकि ओवरले एप्लिकेशन मुख्य डीटी प्रतीक तालिका के साथ ओवरले प्रतीक तालिका को मर्ज नहीं करता है (विलय नहीं होने से प्रतीक नामों में टकराव और ओवरले के बीच निर्भरता की जटिलता से बचा जाता है)।

उदाहरण: अमान्य ओवरले

इस उदाहरण में, overlay_2.dts नोड e को संदर्भित करता है, जिसे overlay_1.dts द्वारा जोड़ा गया था। overlay_1 को मुख्य डीटी पर लागू करने के बाद, यदि परिणामी डीटी पर overlay_2 लागू करने का प्रयास किया जाता है, तो ओवरले एप्लिकेशन एक त्रुटि के साथ विफल हो जाएगा कि प्रतीक e आधार डीटी के लिए प्रतीक तालिका में मौजूद नहीं है।

main.dts ओवरले_1.डीटीएस ओवरले_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 मुख्य DTS से केवल नोड b को संदर्भित करता है। जब overlay_1 को आधार DT पर लागू किया जाता है, उसके बाद overlay_2 के अनुप्रयोग के बाद, नोड e ( overlay_1.dts द्वारा सेट) में संपत्ति prop का मान overlay_2.dts द्वारा निर्धारित मान से अधिलेखित हो जाता है।

main.dts ओवरले_1.डीटीएस ओवरले_2.डीटीएस
[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 विभाजन छवि से DTO के शून्य-आधारित सूचकांकों ने इसे आधार DT (उसी क्रम में) पर लागू किया।
    • सूचकांकों को DTBO विभाजन में ओवरले की स्थिति का उल्लेख करना चाहिए।

DTBO विभाजन की संरचना के विवरण के लिए, source.android.com पर डिवाइस ट्री ओवरले देखें।

DTBO विभाजन का सत्यापन

आप निम्नलिखित को सत्यापित करने के लिए वीटीएस का उपयोग कर सकते हैं:

  • कर्नेल कमांड लाइन पैरामीटर का अस्तित्व androidboot.dtbo_idx (यह जाँच कर कि Init ने स्वचालित रूप से संबंधित ro.boot.dtbo_idx सिस्टम गुण सेट किया है)।
  • ro.boot.dtbo_idx सिस्टम गुण की वैधता (जाँच करके कि गुण कम से कम एक मान्य DTBO छवि अनुक्रमणिका निर्दिष्ट करता है)।
  • DTBO विभाजन की वैधता (DTBO विभाजन में ओवरले को भी सत्यापित करता है जो आधार DT पर लागू होते हैं)।
  • परिणामी डीटी में अतिरिक्त नोड्स या संपत्ति परिवर्तन लिनक्स कर्नेल में प्रस्तुत किए जाते हैं।

उदाहरण के लिए, निम्नलिखित ओवरले और अंतिम डीटी में, androidboot.dtbo_idx=5,3 को कर्नेल कमांड लाइन में जोड़ने से सत्यापन पास हो जाता है लेकिन androidboot.dtbo_idx=3,5 को कर्नेल कमांड लाइन में जोड़ने से सत्यापन पास नहीं होता है।

इंडेक्स 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";
	};
};