Do kompilowania plików źródłowych drzewa urządzeń (DTS) możesz użyć kompilatora drzewa urządzeń (DTC). Zanim jednak zastosujesz nakładkę drzewa urządzeń (DT) na docelowe główne drzewo urządzeń, sprawdź wynik, symulując działanie nakładki drzewa urządzeń (DTO).
Kompilowanie za pomocą DTC
Podczas kompilowania .dts
za pomocą dtc
musisz dodać opcję -@
, aby dodać węzeł __symbols__
w wynikowym .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 drzewa decyzyjnego .dts
:
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
Przykładowe polecenie do utworzenia 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 identyfikowaniu błędów, które mogą wystąpić podczas umieszczania nakładki DT na głównym DT. Zanim zaktualizujesz cel, możesz sprawdzić wynik nałożenia DT na hosta, symulując zachowanie DTO za pomocą /include/
w .dts
.
Rysunek 1. Użyj składni /include/, aby symulować DTO na hoście.
- Utwórz kopię nakładki
.dts
. W kopii usuń nagłówek pierwszego wiersza. Przykład: Zapisz plik jako/dts-v1/; /plugin/;
my_overlay_dt_wo_header.dts
(lub pod 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. Na przykład: Zapisz plik jako/include/ "my_overlay_dt_wo_header.dts"
my_main_dt_with_include.dts
(lub pod 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
- Użyj
dtc
, aby zrzucićmy_merged_dt.dto
.dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
Weryfikacja nakładek drzewa urządzeń w Androidzie 9
Android 9 wymaga partycji nakładki DTBO (Device Tree Blob Overlay). Aby dodać węzły lub wprowadzić zmiany we właściwościach w DT SoC, program rozruchowy musi dynamicznie nakładać DT specyficzne dla urządzenia na DT SoC.
Wskazywanie zastosowanych nakładek
Aby umożliwić
pakietowi testów dostawców (VTS) ocenę poprawności aplikacji nakładki, dostawcy muszą dodać nowy parametr wiersza poleceń jądra androidboot.dtbo_idx
, który wskazuje nakładki 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
zgłasza
x
, y
i z
jako indeksy od zera
nakładek drzewa urządzeń z partycji DTBO zastosowanych (w tej kolejności)
przez program rozruchowy do podstawowego drzewa urządzeń.
Nakładki mogą być stosowane do węzłów z głównego drzewa urządzeń 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 łączy tabeli symboli nakładki z główną tabelą symboli DT (niełączenie zapobiega konfliktom w nazwach symboli i komplikowaniu 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 się niepowodzeniem z błędem, że symbol e
nie występuje w tabeli symboli dla 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 pliku DTS. Gdy do podstawowego DT zostanie zastosowany element overlay_1
, 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>; }; }; |
Wdrażanie partycji DTBO
Aby wdrożyć wymaganą partycję DTBO, upewnij się, że program rozruchowy może wykonać te czynności:
- Określ płytkę, na której działa, i wybierz odpowiednie nakładki do zastosowania.
- Do wiersza poleceń jądra dodaj parametr
androidboot.dtbo_idx
.- 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 na drzewo urządzeń.
Sprawdzanie partycji DTBO
Za pomocą VTS możesz sprawdzić:
- Istnienie parametru wiersza poleceń jądra
androidboot.dtbo_idx
(sprawdzając, czyInit
automatycznie skonfigurował odpowiednią właściwość systemuro.boot.dtbo_idx
). - Sprawdzanie prawidłowości właściwości systemowej
ro.boot.dtbo_idx
(poprzez sprawdzenie, czy właściwość określa co najmniej 1 prawidłowy indeks obrazu DTBO). - Prawidłowość partycji DTBO (sprawdza też nakładki w partycji DTBO, które są stosowane do podstawowego drzewa urządzeń).
- Dodatkowe węzły lub zmiany właściwości w wynikowym DT są przekazywane do jądra systemu Linux.
Na przykład w przypadku tych nakładek i ostatecznego 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 w indeksie 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>; }; |
Ostateczna stawka DT |
---|
/dts-v1/; / { a { phandle = <0x1>; }; b { phandle = <0x2>; }; c { phandle = <0x3>; prop = <0xfe>; }; __symbols__ { a = "/a"; b = "/b"; c = "/c"; }; }; |