הידור ואימות

אפשר להשתמש בקומפיילר של עץ המכשיר (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 הראשי. לפני שמעדכנים את היעד, אפשר לאמת את התוצאה של שכבת-העל של 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 זמינים במאמר Device tree overlays.

אימות מחיצת 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>; };
Final DT

‪/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

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