אפשר להשתמש בקומפיילר של עץ המכשיר (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 במארח.
- יוצרים עותק של שכבת העל
.dts. בעותק, מסירים את הכותרת של השורה הראשונה. דוגמה: שומרים את הקובץ בשם/dts-v1/; /plugin/;
my_overlay_dt_wo_header.dts(או בכל שם קובץ אחר שרוצים). - יוצרים עותק של
.dtsהראשי. בעותק, אחרי השורה האחרונה, מוסיפים את תחביר ה-include לקובץ שיצרתם בשלב 1. לדוגמה: שומרים את הקובץ בשם/include/ "my_overlay_dt_wo_header.dts"
my_main_dt_with_include.dts(או בכל שם קובץ אחר שרוצים). - משתמשים ב-
dtcכדי לקמפל אתmy_main_dt_with_include.dtsולקבל את ה-DT הממוזג, שאמור להיות זהה לתוצאה של DTO. לדוגמה:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- משתמשים ב-
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 הנדרשת, צריך לוודא שמנהל האתחול יכול לבצע את הפעולות הבאות:
- מזהים את הלוח שבו הוא פועל ובוחרים את שכבות העל המתאימות להחלה.
- מוסיפים את הפרמטר
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";
};
};
|