Kompilacja i weryfikacja

Do kompilacji plików źródłowych drzewa urządzeń można użyć kompilatora drzewa urządzeń (DTC). Jednak przed zastosowaniem nakładki ID na docelowym głównym ID, należy również zweryfikować wynik, symulując zachowanie DTO.

Kompilowanie z DTC

Używając dtc do kompilacji .dts , musisz dodać opcję -@ , aby dodać węzeł __symbols__ w wynikowym .dtbo . Węzeł __symbols__ zawiera listę wszystkich węzłów oznaczonych etykietą, do której biblioteka DTO może się odwoływać.

Przykładowe polecenie do zbudowania głównego DT .dts :

dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts

Przykładowe polecenie do zbudowania nakładki DT .dts :

dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts

Sprawdź wyniki DTO na hoście

Weryfikacja może pomóc w identyfikacji błędów, które mogą wystąpić podczas umieszczania nakładki ID na głównym ID. Przed aktualizacją celu możesz zweryfikować wynik nałożenia ID na hoście, symulując zachowanie DTO za pomocą /include/ w .dts .

Rysunek 1. Użyj składni /include/ do symulacji 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 dowolną nazwę pliku).
  2. Utwórz kopię głównego .dts . W kopii, po ostatnim wierszu, dołącz składnię dołączania 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 dowolną nazwę pliku).
  3. Użyj dtc , aby skompilować my_main_dt_with_include.dts , aby uzyskać scalony ID, który powinien mieć taki sam wynik jak DTO. 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 DTO w Androidzie 9

Android 9 wymaga partycji nakładki obiektów blob drzewa urządzeń (DTBO). Aby dodać węzły lub wprowadzić zmiany we właściwościach w SoC DT, bootloader musi dynamicznie nakładać ID specyficzne dla urządzenia na SoC DT.

Wskazanie zastosowanych nakładek

Aby umożliwić Vendor Test Suite (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 systemie Android 12 korzystającym z jądra w wersji 5.10 lub nowszej ten parametr przechodzi przez bootconfig. Na przykład parametr androidboot.dtbo_idx=x,y,z zgłasza x , y i z jako liczone od zera indeksy nakładek drzewa urządzeń (DTO) z partycji DTBO zastosowanej (w tej kolejności) przez bootloader do bazy Drzewo urządzeń (DT).

Nakładki mogą dotyczyć węzłów z głównego drzewa urządzenia lub dodawać nowe węzły, ale nie mogą odnosić się do węzła dodanego w poprzedniej nakładce. To ograniczenie jest konieczne, ponieważ aplikacja nakładki nie łączy tablicy symboli nakładek z główną tablicą symboli DT (brak łączenia pozwala uniknąć konfliktów 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 ID, jeśli zostanie podjęta próba zastosowania overlay_2 do wynikowego ID, aplikacja nakładki zakończy się niepowodzeniem z błędem, że symbol e nie jest obecny w tablicy symboli dla podstawowego ID.

main.dts nakładka_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. Kiedy overlay_1 jest stosowany do podstawowego ID, a następnie nakładany jest overlay_2 , wartość właściwości prop w węźle e (ustawiona przez overlay_1.dts ) jest zastępowana wartością ustawioną przez overlay_2.dts .

main.dts nakładka_1.dts nakładka_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 zaimplementować wymaganą partycję DTBO, upewnij się, że bootloader może wykonać następujące czynności:

  1. Zidentyfikuj płytę, na której działa, i wybierz odpowiednią nakładkę (nakładki), którą chcesz zastosować.
  2. Dołącz parametr androidboot.dtbo_idx do wiersza polecenia jądra.
    • Parametr musi wskazywać liczone od zera indeksy DTO z obrazu partycji DTBO zastosowane do podstawowego ID (w tej samej kolejności).
    • Indeksy muszą odnosić się do pozycji nakładki w partycji DTBO.

Szczegółowe informacje na temat struktury partycji DTBO można znaleźć w sekcji Nakładki drzewa urządzeń na stronie source.android.com.

Walidacja partycji DTBO

Za pomocą VTS można zweryfikować:

  • Istnienie parametru wiersza poleceń jądra androidboot.dtbo_idx (poprzez sprawdzenie, czy Init automatycznie ustawił odpowiednią właściwość systemową ro.boot.dtbo_idx ).
  • Poprawność właściwości systemowej ro.boot.dtbo_idx (poprzez sprawdzenie, czy właściwość określa co najmniej jeden prawidłowy indeks obrazu DTBO).
  • Ważność partycji DTBO (sprawdza również nakładki w partycji DTBO, które są stosowane do podstawowego DT).
  • Dodatkowe węzły lub zmiany właściwości w wynikowym DT są prezentowane jądru Linux.

Na przykład w poniższych nakładkach i ostatecznym 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 walidacji.

Nakładka ID przy indeksie 3 Nakładka ID przy indeksie 5
[overlay_1.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xfe>; };
[overlay_2.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
Końcowy ID
/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

	c {
		phandle = <0x3>;
		prop = <0xfe>;
	};

	__symbols__ {
		a = "/a";
		b = "/b";
		c = "/c";
	};
};