Kompilowanie i weryfikowanie

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/.dts.

Rysunek 1. Użyj składni /include/, aby symulować DTO na hoście.

  1. Utwórz kopię nakładki .dts. W kopii usuń nagłówek pierwszego wiersza. Przykład:
    /dts-v1/;
    /plugin/;
    
     Zapisz plik jako my_overlay_dt_wo_header.dts (lub pod dowolną inną nazwą).
  2. 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:
    /include/ "my_overlay_dt_wo_header.dts"
    
     Zapisz plik jako my_main_dt_with_include.dts (lub pod dowolną inną nazwą).
  3. Do skompilowania my_main_dt_with_include.dts użyj narzędzia dtc, 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
    
  4. 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, yz 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:

  1. Określ płytkę, na której działa, i wybierz odpowiednie nakładki do zastosowania.
  2. 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ądraandroidboot.dtbo_idx (sprawdzając, czy Init automatycznie skonfigurował odpowiednią właściwość systemu ro.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";
	};
};