אפשר להשתמש במהדר של עץ המכשיר (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
כדי לדגום את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.
סימון שכבות-על שהוחלו
כדי לאפשר ל-
Vendor Test Suite (VTS) להעריך את תקינות האפליקציה של שכבת-העל, הספקים צריכים להוסיף פרמטר חדש בשורת הפקודה של הליבה, 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
על ה-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, צריך לוודא שה-bootloader יכול לבצע את הפעולות הבאות:
- מזהים את הלוח שבו הוא פועל ובוחרים את שכבות-העל המתאימות להחיל.
- מוסיפים את הפרמטר
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 שנוצר מוצגים צמתים או שינויים נוספים במאפיינים (kernel) של 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>; }; |
חותמת זמן סופית |
---|
/dts-v1/; / { a { phandle = <0x1>; }; b { phandle = <0x2>; }; c { phandle = <0x3>; prop = <0xfe>; }; __symbols__ { a = "/a"; b = "/b"; c = "/c"; }; }; |