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

می توانید از Device Tree Compiler (DTC) برای کامپایل فایل های Device Tree Source استفاده کنید. با این حال، قبل از اعمال همپوشانی 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 به یک پارتیشن Device Tree Blob Overlay (DTBO) نیاز دارد. برای افزودن گره ها یا ایجاد تغییرات در ویژگی های SoC DT، بوت لودر باید به صورت پویا یک DT خاص دستگاه را روی SoC DT پوشش دهد.

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

برای فعال کردن مجموعه تست فروشنده (VTS) برای ارزیابی صحت برنامه همپوشانی، فروشندگان باید یک پارامتر خط فرمان هسته جدید androidboot.dtbo_idx اضافه کنند که همپوشانی های انتخاب شده از پارتیشن DTBO را نشان می دهد. در اندروید 12 با استفاده از هسته نسخه 5.10 یا بالاتر، این پارامتر از طریق bootconfig عبور می کند. به عنوان مثال، پارامتر androidboot.dtbo_idx=x,y,z x ، y و z را به عنوان شاخص‌های مبتنی بر صفر Device Tree Overlays (DTOs) از پارتیشن DTBO اعمال شده (به ترتیب) توسط بوت لودر به پایه گزارش می‌کند. درخت دستگاه (DT).

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

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

در این مثال، overlay_2.dts به گره e اشاره دارد که توسط overlay_1.dts اضافه شده است. پس از اعمال overlay_1 به DT اصلی، اگر تلاش شود overlay_2 روی DT حاصل اعمال شود، برنامه overlay با خطای عدم وجود نماد 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، به Device Tree Overlays در source.android.com مراجعه کنید.

اعتبار سنجی پارتیشن 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";
	};
};