ترجمه و درستی‌سنجی

می‌توانید از کامپایلر ساختار درختی دستگاه (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 روی میزبان را درستی‌سنجی کنید.

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

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

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

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

برای فعال کردن «مجموعه آزمایشی فروشنده» (VTS) برای ارزیابی صحت برنامه رونهاد، فروشندگان باید پارامتر خط فرمان هسته جدیدی androidboot.dtbo_idx اضافه کنند که نشان دهد رونهادهای انتخاب‌شده از پارتیشن DTBO کدام‌اند. در Android 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 حاصل به هسته Linux ارائه می‌شود.

برای مثال، در رونهادهای زیر و 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>; };
نهایی DT

/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

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