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

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

کامپایل با DTC

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

نتایج DTO را در میزبان تأیید کنید

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

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

  1. یک کپی از همپوشانی .dts ایجاد کنید. در کپی، هدر خط اول را حذف کنید. مثال:
    /dts-v1/;
    /plugin/;
    
    فایل را به عنوان my_overlay_dt_wo_header.dts (یا هر نام فایلی که می خواهید) ذخیره کنید.
  2. یک کپی از .dts اصلی ایجاد کنید. در کپی، بعد از آخرین خط، دستور include را برای فایلی که در مرحله 1 ایجاد کردید اضافه کنید. به عنوان مثال:
    /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. از dtc برای حذف my_merged_dt.dto استفاده کنید.
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

DTO را در اندروید 9 تأیید کنید

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

پوشش های اعمال شده را نشان دهید

برای فعال کردن مجموعه تست فروشنده (VTS) برای ارزیابی درستی برنامه همپوشانی، فروشندگان باید یک پارامتر خط فرمان هسته جدید androidboot.dtbo_idx اضافه کنند که همپوشانی های انتخاب شده از پارتیشن DTBO را نشان می دهد. در اندروید 12 با استفاده از هسته نسخه 5.10 یا بالاتر، این پارامتر از طریق 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 حاصل شود، برنامه همپوشانی با خطای عدم وجود نماد e در جدول نماد DT پایه شکست می‌خورد.

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

برای پیاده سازی پارتیشن 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 در شاخص 3 روکش DT در شاخص 5
[overlay_1.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xfe>; };
[overlay_2.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
DT نهایی
/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

	c {
		phandle = <0x3>;
		prop = <0xfe>;
	};

	__symbols__ {
		a = "/a";
		b = "/b";
		c = "/c";
	};
};