التجميع والتحقّق

يمكنك استخدام برنامج تجميع شجرة الأجهزة (DTC) لتجميع ملفات مصدر شجرة الأجهزة (DTS). ومع ذلك، قبل تطبيق شجرة الأجهزة (DT) المتراكبة على شجرة الأجهزة الرئيسية المستهدَفة، عليك أيضًا التحقّق من النتيجة من خلال محاكاة سلوك شجرة الأجهزة المتراكبة (DTO).

التجميع باستخدام DTC

عند استخدام dtc لتجميع .dts، يجب إضافة الخيار -@ لإضافة عقدة __symbols__ في .dtbo الناتج. تحتوي العقدة __symbols__ على قائمة بجميع العُقد التي تم وضع علامة عليها، ويمكن لمكتبة DTO استخدامها للمراجع.

نموذج للأمر لإنشاء جدول بيانات رئيسي .dts:

dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts

نموذج للأمر اللازم لإنشاء شجرة الأجهزة .dts:

dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts

التحقّق من نتائج DTO على المضيف

يمكن أن تساعدك عملية التحقّق في تحديد الأخطاء التي قد تحدث عند وضع جدول بيانات التراكب على جدول البيانات الرئيسي. قبل تعديل الهدف، يمكنك التحقّق من نتيجة تراكب DT على المضيف من خلال محاكاة سلوك DTO باستخدام /include/ في .dts.

الشكل 1. استخدِم بنية /include/ لمحاكاة DTO على المضيف.

  1. أنشئوا نسخة من المحتوى .dts. في النسخة، أزِل عنوان السطر الأول. مثال:
    /dts-v1/;
    /plugin/;
    
    احفظ الملف باسم my_overlay_dt_wo_header.dts (أو أي اسم ملف آخر تريده).
  2. أنشئ نسخة من .dts الرئيسية. في النسخة، بعد السطر الأخير، أضِف بنية التضمين للملف الذي أنشأته في الخطوة 1. مثلاً:
    /include/ "my_overlay_dt_wo_header.dts"
    
    احفظ الملف باسم my_main_dt_with_include.dts (أو أي اسم ملف آخر تريده).
  3. استخدِم dtc لتجميع my_main_dt_with_include.dts للحصول على جدول البيانات المدمج، والذي يجب أن يكون النتيجة نفسها التي تم الحصول عليها من 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. لإضافة عُقد أو إجراء تغييرات على المواقع في شجرة وصف الجهاز (DT) الخاصة بنظام على شريحة (SoC)، يجب أن يفرض برنامج التحميل طبقة ديناميكية من شجرة وصف الجهاز الخاصة بالجهاز على شجرة وصف الجهاز الخاصة بنظام على شريحة.

الإشارة إلى العناصر المركّبة التي تم تطبيقها

لتمكين مجموعة اختبارات المورّدين (VTS) من تقييم صحة تطبيق التراكب، على المورّدين إضافة مَعلمة جديدة لسطر أوامر النواة androidboot.dtbo_idx تشير إلى التراكبات المحدّدة من قسم DTBO. في نظام التشغيل Android 12 الذي يستخدم الإصدار 5.10 أو إصدارًا أحدث من النواة، يتم تمرير هذه المَعلمة من خلال bootconfig. على سبيل المثال، تعرض المَعلمة androidboot.dtbo_idx=x,y,z القيم x وy وz كفهارس مستندة إلى الصفر لوحدات نقل البيانات (DTO) من قسم DTBO الذي تم تطبيقه (بهذا الترتيب) بواسطة برنامج التشغيل على شجرة الأجهزة الأساسية.

يمكن أن تنطبق الطبقات المتراكبة على العُقد من شجرة الأجهزة الرئيسية أو أن تضيف عُقدًا جديدة، ولكن لا يمكنها الإشارة إلى عقدة تمت إضافتها في طبقة متراكبة سابقة. هذا القيد ضروري لأنّ تطبيق التراكب لا يدمج جدول رموز التراكب مع جدول رموز 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 التي يتم تطبيقها على شجرة الأجهزة الأساسية)
  • يتم عرض العُقد الإضافية أو تغييرات السمات في شجرة الأجهزة الناتجة لنواة Linux.

على سبيل المثال، في التراكبات التالية و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>; };
النتيجة النهائية

/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

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