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 również 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 pliku .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 tworzenia głównego DT .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 tekście usuń nagłówek pierwszego wiersza. Przykład: Zapisz plik jako/dts-v1/; /plugin/;
my_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: Zapisz plik jako/include/ "my_overlay_dt_wo_header.dts"
my_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ń. Przykład:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- Aby wygenerować dane
my_merged_dt.dto
, użyj poleceniadtc
.dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
Weryfikacja nakładek 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 | 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>; }; |
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:
- Określ, na której planszy jest uruchomiony, i wybierz odpowiednie nakładki, które mają zostać zastosowane.
- 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 umożliwia weryfikację tych elementów:
- istnienie parametru wiersza poleceń jądra
androidboot.dtbo_idx
(sprawdzanie, czyInit
automatycznie skonfigurował odpowiednią właściwość systemuro.boot.dtbo_idx
); - poprawność właściwości systemowej
ro.boot.dtbo_idx
(sprawdź, czy właściwość zawiera co najmniej 1 prawidłowy indeks obrazu DTBO); - poprawność partycji DTBO (weryfikuje również nakładki w partycji DTBO zastosowane do podstawowego drzewa danych);
- Dodatkowe węzły lub zmiany właściwości w uzyskanym DT są prezentowane w jądrze systemu Linux.
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>; }; |
Final DT |
---|
/dts-v1/; / { a { phandle = <0x1>; }; b { phandle = <0x2>; }; c { phandle = <0x3>; prop = <0xfe>; }; __symbols__ { a = "/a"; b = "/b"; c = "/c"; }; }; |