הידור ואימות

אפשר להשתמש במהדר של עץ המכשיר (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.

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

כדי לאפשר ל חבילת הבדיקה של הספק (VTS) להעריך את הנכונות של אפליקציית שכבת-על, הספקים צריכים להוסיף פרמטר חדש של שורת הפקודה בליבה (kernel) androidboot.dtbo_idx שמציין את שכבות-העל שנבחרו ממחיצת ה-DTBO. ב-Android 12 עם גרסה 5.10 ואילך של הליבה, הפרמטר הזה עובר דרך bootconfig. לדוגמה, הפרמטר androidboot.dtbo_idx=x,y,z מדווח על x,‏ y ו-z כאינדקסים שמתחילים בספרה אפס של ה-DTOs מהמחיצה DTBO שהוחלו (באותו הסדר) על ידי מנהל האתחול על ה-DT הבסיסי.

אפשר להחיל שכבות-על על צמתים מה-DT הראשי או להוסיף צמתים חדשים, אבל לא אפשר להפנות לצומת שנוסף בשכבת-על קודמת. ההגבלה הזו נדרשת כי אפליקציית שכבת-העל לא ממזגת את טבלת הסמלים של שכבת-העל עם טבלת הסמלים הראשית של DT (האיחוד לא מתבצע כדי למנוע התנגשויות בשמות הסמלים ולמנוע סיבוך של יחסי התלות בין שכבות-העל).

דוגמה: שכבות-על לא תקינות

בדוגמה הזו, הערך overlay_2.dts מתייחס לצומת e שנוסף על ידי overlay_1.dts. אחרי החלת overlay_1 על ה-DT הראשי, אם יתבצע ניסיון להחיל את overlay_2 על ה-DT שנוצר, אפליקציית שכבת-העל תיכשל ותוצג שגיאה שהסמל e לא מופיע בטבלת הסמלים של ה-DT הבסיסי.

Main.dts שכבת-על_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 שכבת-על_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 שנוצר מוצגים לליבת 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>; };
DT סופי

/dts-v1/;
/ {

 a {
 phandle = <0x1>;
 };

 b {
 phandle = <0x2>;
 };

 c {
 phandle = <0x3>;
 PRO = <0xfe>;
 _mb};