کامپایل و تایید کنید

شما می‌توانید از کامپایلر درخت دستگاه (DTC) برای کامپایل فایل‌های منبع درخت دستگاه (DTS) استفاده کنید. با این حال، قبل از اعمال درخت دستگاه پوششی (DT) بر روی DT اصلی هدف، باید نتیجه را با شبیه‌سازی رفتار درخت دستگاه پوششی (DTO) نیز تأیید کنید.

کامپایل با DTC

هنگام استفاده از dtc برای کامپایل فایل .dts ، باید گزینه -@ برای اضافه کردن یک گره __symbols__ در فایل .dtbo حاصل اضافه کنید. گره __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 را روی میزبان تأیید کنید

تأیید می‌تواند به شما در شناسایی خطاهایی که ممکن است هنگام قرار دادن DT پوششی روی DT اصلی رخ دهد، کمک کند. قبل از به‌روزرسانی هدف، می‌توانید نتیجه‌ی پوشش DT روی میزبان را با شبیه‌سازی رفتار DTO با استفاده از /include/ در .dts تأیید کنید.

شکل ۱. از سینتکس /include/ برای شبیه‌سازی DTO روی میزبان استفاده کنید.

  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. از dtc برای کامپایل my_main_dt_with_include.dts استفاده کنید تا DT ادغام‌شده را دریافت کنید، که باید همان نتیجه 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
    

تأیید DTO در اندروید ۹

اندروید ۹ به یک پارتیشن پوشش درختی دستگاه (DTBO) نیاز دارد. برای اضافه کردن گره‌ها یا ایجاد تغییر در ویژگی‌های SoC DT، بوت‌لودر باید به صورت پویا یک DT خاص دستگاه را روی SoC DT پوشش دهد.

پوشش‌های اعمال‌شده را مشخص کنید

برای اینکه مجموعه تست فروشنده (VTS) بتواند صحت برنامه overlay را ارزیابی کند، فروشندگان باید یک پارامتر خط فرمان جدید androidboot.dtbo_idx به هسته اضافه کنند که نشان‌دهنده overlayهای انتخاب شده از پارتیشن DTBO است. در اندروید ۱۲ با استفاده از نسخه هسته ۵.۱۰ یا بالاتر، این پارامتر از bootconfig عبور می‌کند. به عنوان مثال، پارامتر androidboot.dtbo_idx=x,y,z x ، y و z را به عنوان شاخص‌های مبتنی بر صفر DTOها از پارتیشن DTBO که (به همین ترتیب) توسط بوت لودر به DT پایه اعمال شده است، گزارش می‌دهد.

همپوشانی‌ها می‌توانند به گره‌های DT اصلی اعمال شوند یا گره‌های جدیدی اضافه کنند، اما نمی‌توانند به گره‌ای که در یک همپوشانی قبلی اضافه شده است، اشاره کنند. این محدودیت ضروری است زیرا برنامه همپوشانی، جدول نمادهای همپوشانی را با جدول نمادهای DT اصلی ادغام نمی‌کند (عدم ادغام از تداخل در نام نمادها و پیچیدگی وابستگی‌ها بین همپوشانی‌ها جلوگیری می‌کند).

مثال: پوشش‌های نامعتبر

در این مثال، overlay_2.dts به گره e اشاره دارد که توسط overlay_1.dts اضافه شده است. پس از اعمال overlay_1 به DT اصلی، اگر تلاشی برای اعمال overlay_2 به DT حاصل انجام شود، برنامه overlay با خطایی مبنی بر عدم وجود نماد e در جدول نماد برای DT پایه، با شکست مواجه می‌شود.

فایل اصلی.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 فقط به گره b از DTS اصلی اشاره دارد. وقتی overlay_1 به DT پایه اعمال می‌شود و سپس overlay_2 اعمال می‌شود، مقدار property prop در گره e (که توسط overlay_1.dts تنظیم شده است) توسط مقداری که توسط overlay_2.dts تنظیم شده است، بازنویسی می‌شود.

فایل اصلی.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 را به خط فرمان هسته اضافه کنید.
    • این پارامتر باید شاخص‌های مبتنی بر صفر DTOها را از تصویر پارتیشن DTBO که به DT پایه اعمال شده است (به همان ترتیب) نشان دهد.
    • شاخص‌ها باید به موقعیت لایه پوششی در پارتیشن DTBO اشاره کنند.

برای جزئیات بیشتر در مورد ساختار پارتیشن DTBO، به پوشش‌های درخت دستگاه مراجعه کنید.

پارتیشن DTBO را اعتبارسنجی کنید

شما می‌توانید از VTS برای تأیید موارد زیر استفاده کنید:

  • وجود پارامتر خط فرمان هسته androidboot.dtbo_idx (با بررسی اینکه Init به طور خودکار ویژگی سیستمی ro.boot.dtbo_idx مربوطه را تنظیم کرده است).
  • اعتبار ویژگی سیستم ro.boot.dtbo_idx (با بررسی اینکه این ویژگی حداقل یک شاخص تصویر DTBO معتبر را مشخص می‌کند).
  • اعتبار پارتیشن DTBO (همچنین پوشش‌های موجود در پارتیشن DTBO که به DT پایه اعمال می‌شوند را تأیید می‌کند).
  • گره‌های اضافی یا تغییرات ویژگی در DT حاصل به هسته لینوکس ارائه می‌شوند.

برای مثال، در پوشش‌های زیر و DT نهایی، اضافه کردن androidboot.dtbo_idx=5,3 به خط فرمان هسته، اعتبارسنجی را با موفقیت پشت سر می‌گذارد اما اضافه کردن androidboot.dtbo_idx=3,5 به خط فرمان هسته، اعتبارسنجی را با موفقیت پشت سر نمی‌گذارد.

DT را در اندیس ۳ روی هم قرار دهید DT را در اندیس ۵ روی هم قرار دهید
[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";
	};
};