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

يمكنك استخدام Device Tree Compiler (DTC) لتجميع ملفات مصدر شجرة الأجهزة. ومع ذلك، قبل تطبيق تراكب 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 الرئيسي. قبل تحديث الهدف، يمكنك التحقق من نتيجة تراكب 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 للحصول على 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 قسم Device Tree Blob Overlay (DTBO). لإضافة عقد أو إجراء تغييرات على الخصائص في SoC DT، يجب أن يقوم أداة تحميل التشغيل بتراكب DT خاص بالجهاز ديناميكيًا فوق SoC DT.

مشيرا إلى التراكبات المطبقة

لتمكين مجموعة اختبار البائع (VTS) من تقييم صحة تطبيق التراكب، يجب على البائعين إضافة معلمة سطر أوامر kernel جديدة androidboot.dtbo_idx التي تشير إلى التراكبات المحددة من قسم DTBO. في نظام التشغيل Android 12 الذي يستخدم إصدار kernel 5.10 أو أحدث، تمر هذه المعلمة عبر bootconfig. على سبيل المثال، تُبلغ المعلمة androidboot.dtbo_idx=x,y,z عن x و y و z كمؤشرات صفرية لتراكبات شجرة الأجهزة (DTOs) من قسم DTBO المطبق (بهذا الترتيب) بواسطة أداة تحميل التشغيل على القاعدة شجرة الأجهزة (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 بسطر أوامر kernel.
    • يجب أن تشير المعلمة إلى المؤشرات الصفرية لـ DTOs من صورة قسم DTBO التي تم تطبيقها على DT الأساسي (بنفس الترتيب).
    • يجب أن تشير المؤشرات إلى موضع التراكب في قسم DTBO.

للحصول على تفاصيل حول بنية قسم DTBO، راجع تراكبات شجرة الأجهزة على source.android.com.

التحقق من صحة قسم DTBO

يمكنك استخدام VTS للتحقق مما يلي:

  • وجود معلمة سطر أوامر kernel androidboot.dtbo_idx (من خلال التحقق من أن Init قام تلقائيًا بإعداد خاصية النظام ro.boot.dtbo_idx المقابلة).
  • صلاحية خاصية النظام ro.boot.dtbo_idx (من خلال التحقق من أن الخاصية تحدد فهرس صورة DTBO صالحًا واحدًا على الأقل).
  • صلاحية قسم DTBO (يتحقق أيضًا من التراكبات الموجودة في قسم DTBO والتي يتم تطبيقها على DT الأساسي).
  • يتم تقديم العقد الإضافية أو تغييرات الخصائص في DT الناتج إلى Linux kernel.

على سبيل المثال، في التراكبات التالية وDT النهائية، تؤدي إضافة androidboot.dtbo_idx=5,3 إلى سطر أوامر kernel إلى تمرير التحقق من الصحة ولكن إضافة androidboot.dtbo_idx=3,5 إلى سطر أوامر kernel لا يؤدي إلى تمرير التحقق من الصحة.

تراكب 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";
	};
};