הידור ואימות

אפשר להשתמש במהדר של עץ המכשיר (DTC) כדי לקמפל את קובצי המקור של עץ המכשיר (DTS). עם זאת, לפני החלת עץ המכשיר (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 הראשי. בעותק, אחרי השורה האחרונה, מוסיפים את התחביר של 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 ב-Android 9

ב-Android 9 נדרש מחיצה של שכבת-על של blob של עץ המכשיר (DTBO). כדי להוסיף צמתים או לבצע שינויים בנכסים ב-DT של SoC, מנהל האתחול צריך להוסיף באופן דינמי DT ספציפי למכשיר על גבי ה-DT של SoC.

סימון שכבות-על שהוחלו

כדי לאפשר ל- Vendor Test Suite‏ (VTS) להעריך את תקינות האפליקציה של שכבת-העל, הספקים צריכים להוסיף פרמטר חדש בשורת הפקודה של הליבה, androidboot.dtbo_idx, שמציין את שכבות-העל שנבחרו מהמחיצה DTBO. ב-Android 12 עם גרסת ליבה (kernel) 5.10 ואילך, הפרמטר הזה עובר דרךbooconfig. לדוגמה, הפרמטר 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, צריך לוודא שה-bootloader יכול לבצע את הפעולות הבאות:

  1. מזהים את הלוח שבו הוא פועל ובוחרים את שכבות-העל המתאימות להחיל.
  2. מוסיפים את הפרמטר androidboot.dtbo_idx לשורת הפקודה של הליבה.
    • הפרמטר חייב לציין את האינדקסים שמתחילים בספרה אפס של ה-DTOs מתוך קובץ האימג' של מחיצה DTBO שהוחל על ה-DT הבסיסי (באותו סדר).
    • האינדקסים חייבים להתייחס למיקום של שכבת-העל במחיצת ה-DTBO.

לפרטים על המבנה של מחיצת ה-DTBO, אפשר לעיין במאמר שכבות-על של עץ המכשיר.

אימות מחיצת ה-DTBO

אפשר להשתמש ב-VTS כדי לאמת את הדברים הבאים:

  • קיומו של הפרמטר androidboot.dtbo_idx בשורת הפקודה של הליבה (על ידי בדיקה ש-Init הגדיר באופן אוטומטי את מאפיין המערכת התואם ro.boot.dtbo_idx).
  • תקינות המאפיין המערכתי ro.boot.dtbo_idx (על ידי בדיקה שהמאפיין מציין לפחות אינדקס אחד תקין של תמונה של DTBO).
  • תקינות המחיצה של DTBO (האימות כולל גם את שכבות-העל במחיצה של DTBO שחלות על DT הבסיסי).
  • ב-DT שנוצר מוצגים צמתים או שינויים נוספים במאפיינים (kernel) של 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";
	};
};