אפשר להשתמש בקומפיילר של עץ המכשיר (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 במארח.
- יוצרים עותק של שכבת העל
.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 זמינים במאמר בנושא שכבות-על של עץ המכשיר.
אימות מחיצת 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"; }; }; |