কম্পাইল এবং যাচাই

আপনি ডিভাইস ট্রি সোর্স (DTS) ফাইলগুলো কম্পাইল করার জন্য ডিভাইস ট্রি কম্পাইলার (DTC) ব্যবহার করতে পারেন। তবে, টার্গেট মেইন ডিভাইস ট্রি (DT)-তে ওভারলে ডিভাইস ট্রি (DT) প্রয়োগ করার আগে, ডিভাইস ট্রি ওভারলে (DTO)-এর আচরণ সিমুলেট করে ফলাফলটিও যাচাই করে নেওয়া উচিত।

DTC দিয়ে সংকলন করুন

dtc ব্যবহার করে .dts কম্পাইল করার সময়, ফলাফলস্বরূপ প্রাপ্ত .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/ ব্যবহার করে ডিটিও-র আচরণ সিমুলেট করার মাধ্যমে হোস্টে ডিটি ওভারলে করার ফলাফল যাচাই করতে পারেন।

চিত্র ১। হোস্টে DTO অনুকরণ করতে /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
    

অ্যান্ড্রয়েড ৯-এ ডিটিও যাচাই করুন

অ্যান্ড্রয়েড ৯-এর জন্য একটি ডিভাইস ট্রি ব্লব ওভারলে (DTBO) পার্টিশন প্রয়োজন। SoC DT-তে নোড যোগ করতে বা এর প্রোপার্টি পরিবর্তন করতে, বুটলোডারকে অবশ্যই SoC DT-এর উপর ডায়নামিকভাবে একটি ডিভাইস-নির্দিষ্ট DT ওভারলে করতে হয়।

প্রয়োগকৃত ওভারলেগুলি নির্দেশ করুন

ওভারলে অ্যাপের সঠিকতা যাচাই করার জন্য ভেন্ডর টেস্ট স্যুট (VTS)-কে সক্ষম করতে, ভেন্ডরদের অবশ্যই androidboot.dtbo_idx একটি নতুন কার্নেল কমান্ড লাইন প্যারামিটার যোগ করতে হবে, যা DTBO পার্টিশন থেকে নির্বাচিত ওভারলেগুলোকে নির্দেশ করে। কার্নেল সংস্করণ 5.10 বা তার বেশি ব্যবহার করে অ্যান্ড্রয়েড 12-এ, এই প্যারামিটারটি bootconfig-এর মাধ্যমে পাস হয়। উদাহরণস্বরূপ, androidboot.dtbo_idx=x,y,z প্যারামিটারটি x , y এবং z DTBO পার্টিশন থেকে বুটলোডার দ্বারা বেস DT-তে প্রয়োগ করা DTO-গুলোর (ঐ ক্রমে) জিরো-বেসড ইনডেক্স হিসেবে রিপোর্ট করে।

ওভারলেগুলি মূল ডিটি (DT)-র নোডগুলিতে প্রয়োগ করা যেতে পারে বা নতুন নোড যোগ করতে পারে, কিন্তু পূর্ববর্তী কোনো ওভারলেতে যোগ করা নোডকে উল্লেখ করতে পারে না । এই সীমাবদ্ধতাটি প্রয়োজনীয়, কারণ ওভারলে অ্যাপটি ওভারলে সিম্বল টেবিলকে মূল ডিটি সিম্বল টেবিলের সাথে একীভূত করে না (একীভূত না করার ফলে সিম্বলের নামে দ্বন্দ্ব এবং ওভারলেগুলির মধ্যে নির্ভরশীলতার জটিলতা এড়ানো যায়)।

উদাহরণ: অবৈধ ওভারলে

এই উদাহরণে, overlay_2.dts ফাইলটি e নোডকে নির্দেশ করে, যা overlay_1.dts দ্বারা যোগ করা হয়েছিল। মূল DT-তে overlay_1 প্রয়োগ করার পর, যদি ফলস্বরূপ DT-তে overlay_2 প্রয়োগ করার চেষ্টা করা হয়, তাহলে ওভারলে অ্যাপ্লিকেশনটি একটি ত্রুটি দেখিয়ে ব্যর্থ হয়, কারণ মূল DT-এর সিম্বল টেবিলে e সিম্বলটি উপস্থিত থাকে না।

main.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 কে নির্দেশ করে। যখন বেস DT-তে overlay_1 প্রয়োগ করা হয় এবং তারপরে overlay_2 প্রয়োগ করা হয়, তখন নোড e তে থাকা prop প্রপার্টির মান (যা overlay_1.dts দ্বারা সেট করা হয়েছিল) overlay_2.dts দ্বারা সেট করা মান দিয়ে ওভাররাইট হয়ে যায়।

main.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 প্যারামিটারটি যুক্ত করুন।
    • প্যারামিটারটিতে অবশ্যই বেস DT-তে প্রয়োগ করা DTBO পার্টিশন ইমেজ থেকে DTO-গুলোর জিরো-বেসড ইন্ডেক্স (একই ক্রমে) নির্দেশ করতে হবে।
    • সূচকগুলিকে অবশ্যই DTBO পার্টিশনে ওভারলেটির অবস্থান নির্দেশ করতে হবে।

DTBO পার্টিশনের গঠন সম্পর্কে বিস্তারিত জানতে, ডিভাইস ট্রি ওভারলে দেখুন।

DTBO পার্টিশনটি যাচাই করুন

আপনি VTS ব্যবহার করে নিম্নলিখিত বিষয়গুলো যাচাই করতে পারেন:

  • কার্নেল কমান্ড লাইন প্যারামিটার androidboot.dtbo_idx এর অস্তিত্ব (এটি যাচাই করার মাধ্যমে যে Init স্বয়ংক্রিয়ভাবে সংশ্লিষ্ট ro.boot.dtbo_idx সিস্টেম প্রপার্টিটি সেট আপ করেছে)।
  • ro.boot.dtbo_idx সিস্টেম প্রপার্টির বৈধতা (প্রপার্টিটি অন্তত একটি বৈধ DTBO ইমেজ ইনডেক্স নির্দিষ্ট করে কিনা তা যাচাই করার মাধ্যমে)।
  • DTBO পার্টিশনের বৈধতা (এটি DTBO পার্টিশনে থাকা সেই ওভারলেগুলিও যাচাই করে যা বেস DT-তে প্রয়োগ করা হয়েছে)।
  • ফলস্বরূপ DT-তে থাকা অতিরিক্ত নোড বা বৈশিষ্ট্যের পরিবর্তনগুলো লিনাক্স কার্নেলের কাছে উপস্থাপন করা হয়।

উদাহরণস্বরূপ, নিম্নলিখিত ওভারলে এবং ফাইনাল ডিটি-তে, কার্নেল কমান্ড লাইনে 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";
	};
};