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