הידור ואימות

אפשר להשתמש בקומפיילר של עץ המכשיר (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 כדי ליצור dump של my_merged_dt.dto.
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

אימות DTO ב-Android 9

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

חיווי של שכבות-על שהוחלו

כדי לאפשר ל- Vendor Test Suite (VTS) להעריך את התקינות של אפליקציית שכבת העל, הספקים צריכים להוסיף פרמטר חדש בשורת הפקודה של ליבת המערכת, androidboot.dtbo_idx, שמציין את שכבות העל שנבחרו ממחיצת DTBO. ב-Android בגרסה 12, באמצעות ליבה בגרסה 5.10 ואילך, הפרמטר הזה מועבר דרך bootconfig. לדוגמה, הפרמטר androidboot.dtbo_idx=x,y,z מדווח על x, y ו-z בתור האינדקסים מבוססי-האפס של אובייקטי ה-DTO ממחיצת ה-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 לשורת הפקודה של ליבת המערכת.
    • הפרמטר צריך לציין את האינדקסים מבוססי-האפס של אובייקטי ה-DTO מתמונת המחיצה של ה-DTBO שאליה הוא הוחל על ה-DT הבסיסי (באותו סדר).
    • האינדקסים צריכים להתייחס למיקום של שכבת העל במחיצה DTBO.

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

אימות מחיצת 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>; };
תאריך סופי

‪/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

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