הידור ואימות

אפשר להשתמש מהדר עץ מכשירים (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 הראשי. בעותק, אחרי בשורה האחרונה, מוסיפים את תחביר ההכללה של הקובץ שיצרתם בשלב 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). כדי להוסיף צמתים או לבצע שינויים במאפיינים ב-SoC העברת נתונים, תוכנת האתחול חייבת ליצור שכבת-על באופן דינמי DT ספציפי למכשיר את SoC DT.

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

כדי להפעיל את האפשרות חבילת הבדיקה של הספק (VTS) כדי להעריך את הנכונות של שכבת-על אפליקציה, הספקים חייבים להוסיף פרמטר ליבה (kernel) חדש של שורת פקודה 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 על העברת השיחה הראשית, אם נעשה ניסיון להחיל את overlay_2 כתוצאה מכך, אפליקציית שכבת-העל נכשלה עם שגיאה שהסמל e לא נמצא בטבלת הסמלים של DT בבסיס

Main.dts שכבת-על_1.dts שכבת-על_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 שכבת-על_1.dts שכבת-על_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) בשורת הפקודה.
    • הפרמטר חייב לציין את האינדקסים המבוססים על אפס של DTO. מתמונת מחיצת ה-DTBO שהוחלה על ה-DT הבסיסי (באותו מיקום הזמנה).
    • האינדקסים חייבים להתייחס למיקום של שכבת-העל ב-DTBO מחיצה.

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

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

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

  • קיום של פרמטר שורת הפקודה הליבה androidboot.dtbo_idx (על ידי בדיקה של-Init יש להגדיר אוטומטית את מערכת ro.boot.dtbo_idx המתאימה נכס).
  • התוקף של מאפיין המערכת ro.boot.dtbo_idx (לפי שהמאפיין מציין לפחות תמונת DTBO תקינה אחת אינדקס).
  • תוקף מחיצת ה-DTBO (מאמת גם את שכבות-העל ב-DTBO) מחיצה שתחול על ה-DT הבסיסי).
  • ב-DT שנוצר מוצגים צמתים או שינויים נוספים במאפיינים (property) לליבה (kernel) של Linux.

לדוגמה, בשכבות-העל הבאות וב-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>;
		PRO = <0xfe>;
	};

	__סמלים__ {
		a = "/a";
		b = "/b";
		c = "/c";
	};
};