Do kompilowania plików źródłowych drzewa urządzenia (DTS) możesz użyć kompilatora drzewa urządzenia (DTC). Jednak przed zastosowaniem nakładki na drzewo urządzeń (DT) na głównym docelowym DT należy też zweryfikować wynik, symulując zachowanie nakładki na drzewo urządzeń (DTO).
Kompilowanie za pomocą DTC
Jeśli używasz dtc
do kompilowania .dts
, musisz dodać opcję -@
, aby dodać węzeł __symbols__
w wynikającym .dtbo
. Węzeł __symbols__
zawiera listę wszystkich węzłów oznaczonych etykietą, których biblioteka DTO może używać do odwołań.
Przykładowe polecenie do utworzenia głównego pliku przenoszenia danych .dts
:
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
Przykładowe polecenie do tworzenia nakładki DT .dts
:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
Sprawdź wyniki nakładek drzewa urządzeń na hoście
Weryfikacja może pomóc w zidentyfikowaniu błędów, które mogą wystąpić podczas umieszczania nakładki DT na głównym DT. Zanim zaktualizujesz docelowe, możesz sprawdzić wynik nałożenia DT na hosta, symulując działanie DTO za pomocą funkcji /include/
w pliku .dts
.
Rysunek 1. Użyj składni /include/, aby symulować nakładki drzewa urządzeń na hoście.
- Utwórz kopię nakładki
.dts
. W kopii usuń nagłówek pierwszego wiersza. Przykład:/dts-v1/; /plugin/;
Zapisz plik jakomy_overlay_dt_wo_header.dts
(lub dowolną inną nazwę). - Utwórz kopię głównego pliku
.dts
. W kopii po ostatnim wierszu dodaj składnię include dla pliku utworzonego w kroku 1. Przykład:/include/ "my_overlay_dt_wo_header.dts"
Zapisz plik jakomy_main_dt_with_include.dts
(lub dowolną inną nazwę). - Do skompilowania
my_main_dt_with_include.dts
użyj narzędziadtc
, aby pobrać scalone drzewo urządzeń – wynik powinien być taki sam jak w przypadku nakładek drzewa urządzeń. Na przykład:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- Aby wyodrębnić dane z
my_merged_dt.dto
, użyj poleceniadtc
.dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
Weryfikacja organizacji DTO w Androidzie 9
Android 9 wymaga partycji bloba drzewa urządzenia (DTBO). Aby dodać węzły lub wprowadzić zmiany w właściwościach w pliku DT SoC, bootloader musi dynamicznie nakładać plik DT specyficzny dla urządzenia na plik DT SoC.
Wskazanie nałożonych nakładek
Aby umożliwić
pakietowi testów dostawcy (VTS) ocenę poprawności aplikacji nakładowej, dostawcy muszą dodać nowy parametr wiersza poleceń jądra androidboot.dtbo_idx
, który wskazuje nakłady wybrane z partycji DTBO. W Androidzie 12 z jądrem w wersji 5.10 lub nowszej ten parametr jest przekazywany przez bootconfig.
Na przykład parametr androidboot.dtbo_idx=x,y,z
zwraca wartości x
, y
i z
jako indeksy od zera nakładek drzewa urządzeń z partycji DTBO zastosowanej (w tej kolejności) przez bootloader do podstawowego przenoszenia danych.
Nakładki mogą być stosowane do węzłów z głównego DT lub dodawać nowe węzły, ale nie mogą odwoływać się do węzła dodanego w poprzedniej nakładce. To ograniczenie jest konieczne, ponieważ aplikacja nakładki nie scala tabeli symboli nakładki z główną tabelą symboli DT (niescalanie zapobiega konfliktom w nazwach symboli i komplikacji zależności między nakładkami).
Przykład: nieprawidłowe nakładki
W tym przykładzie overlay_2.dts
odnosi się do węzła e
, który został dodany przez overlay_1.dts
. Po zastosowaniu overlay_1
do głównego DT, jeśli zostanie podjęta próba zastosowania overlay_2
do wynikowego DT, aplikacja nakładki zakończy działanie z błędem, że symbol e
nie jest obecny w tabeli symboli podstawowego DT.
main.dts. | overlay_1.dts | nakładka_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>; }; |
Przykład: prawidłowe nakładki
W tym przykładzie overlay_2.dts
odnosi się tylko do węzła b
z głównego DTS. Gdy overlay_1
zostanie zastosowany do podstawowego DT, a następnie aplikacja overlay_2
, wartość właściwości prop
w węźle e
(ustawiona przez overlay_1.dts
) zostanie zastąpiona wartością ustawioną przez 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>; }; }; |
Wdrożenie partycji DTBO
Aby wdrożyć wymaganą partycję DTBO, upewnij się, że program rozruchowy może:
- Zidentyfikuj tablicę, na której działa, i wybierz odpowiednie nakładki, które chcesz zastosować.
- Dołącz parametr
androidboot.dtbo_idx
do wiersza poleceń jądra.- Parametr musi wskazywać indeksy nakładek drzewa urządzeń od zera. z obrazu partycji DTBO zastosowanego do podstawowego przenoszenia danych (w tym samym zamówienie).
- Indeksy muszą odnosić się do pozycji nakładki w partycji DTBO.
Szczegółowe informacje o strukturze partycji DTBO znajdziesz w artykule Nakładki w drzewie urządzenia.
Weryfikowanie partycji DTBO
VTS można używać do sprawdzania tych elementów:
- istnienie parametru wiersza poleceń jądra
androidboot.dtbo_idx
(poprzez sprawdzenie, czyInit
automatycznie skonfigurował odpowiednią właściwość systemuro.boot.dtbo_idx
); - Prawidłowość właściwości systemowej
ro.boot.dtbo_idx
(sprawdzając, czy określa ona co najmniej 1 prawidłowy indeks obrazów DTBO). - poprawność partycji DTBO (weryfikuje również nakładki w partycji DTBO zastosowane do podstawowego przenoszenia danych);
- Dodatkowe węzły lub zmiany właściwości w uzyskanym DT są prezentowane w jądrze Linuxa.
Na przykład w tych przesłonach i końcowym DT dodanie androidboot.dtbo_idx=5,3
do wiersza poleceń jądra przechodzi weryfikację, ale dodanie androidboot.dtbo_idx=3,5
do wiersza poleceń jądra nie przechodzi weryfikacji.
Nakładka DT na pozycji 3 | Nakładka DT w indeksie 5 |
---|---|
[overlay_1.dts] /dts-v1/; /plugin/; &c { prop = <0xfe>; }; |
[overlay_2.dts] /dts-v1/; /plugin/; &c { prop = <0xff>; }; |
Finał DT |
---|
/dts-v1/; / { a { phandle = <0x1>; }; b { phandle = <0x2>; }; c { phandle = <0x3>; prop = <0xfe>; }; __symbols__ { a = "/a"; b = "/b"; c = "/c"; }; }; |