Kompilowanie i weryfikacja

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.

  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 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. Przykład:
    /include/ "my_overlay_dt_wo_header.dts"
    
    Zapisz plik jako my_main_dt_with_include.dts (lub 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. Aby wyodrębnić dane z my_merged_dt.dto, użyj polecenia dtc.
    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, yz 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:

  1. Zidentyfikuj tablicę, na której działa, i wybierz odpowiednie nakładki, które chcesz zastosować.
  2. 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, czy Init automatycznie skonfigurował odpowiednią właściwość systemu ro.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";
	};
};