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

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

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

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

मुख्य 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/ उपयोग करके DTO के व्यवहार का अनुकरण करके होस्ट पर DT को ओवरले करने के परिणाम को सत्यापित कर सकते हैं।

चित्र 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. मर्ज किए गए DT को प्राप्त करने के लिए my_main_dt_with_include.dts संकलित करने के लिए dtc उपयोग करें, जिसका परिणाम 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
    

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

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

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

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

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

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

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

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

मुख्य.डीटीएस ओवरले_1.dts ओवरले_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 विभाजन की संरचना के विवरण के लिए, source.android.com पर डिवाइस ट्री ओवरले देखें।

DTBO विभाजन को मान्य करना

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

  • कर्नेल कमांड लाइन पैरामीटर androidboot.dtbo_idx का अस्तित्व (यह जाँच कर कि Init ने स्वचालित रूप से संबंधित ro.boot.dtbo_idx सिस्टम प्रॉपर्टी सेट कर ली है)।
  • ro.boot.dtbo_idx सिस्टम प्रॉपर्टी की वैधता (यह जाँच कर कि प्रॉपर्टी कम से कम एक वैध 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";
	};
};