Kompilacja i weryfikacja

Do kompilowania plików źródłowych drzewa urządzeń można użyć kompilatora drzewa urządzeń (DTC). Jednakże przed nałożeniem nakładki ID na docelowy główny ID należy również zweryfikować wynik poprzez symulację zachowania DTO.

Kompilacja 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ą, których biblioteka DTO może używać jako odniesień.

Przykładowe polecenie do zbudowania głównego pliku 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 zidentyfikowaniu błędów, które mogą wystąpić podczas umieszczania nakładki ID na głównym ID. Przed aktualizacją celu możesz sprawdzić wynik nałożenia DT 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 pod nazwą my_overlay_dt_wo_header.dts (lub dowolną inną nazwą).
  2. Utwórz kopię głównego .dts . W kopii po ostatniej linii dołącz składnię dołączania 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ą inną nazwę).
  3. Użyj dtc do skompilowania my_main_dt_with_include.dts , aby uzyskać połączony identyfikator ID, który powinien być takim samym wynikiem 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ć plik 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 Device Tree Blob Overlay (DTBO). Aby dodać węzły lub wprowadzić zmiany we właściwościach SoC DT, program ładujący musi dynamicznie nakładać identyfikator specyficzny dla urządzenia na identyfikator SoC DT.

Wskazanie zastosowanych nakładek

Aby umożliwić Vendor Test Suite (VTS) ocenę poprawności aplikacji nakładek, 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 raportuje x z y indeksy od zera nakładek drzewa urządzeń (DTO) z partycji DTBO zastosowane (w tej kolejności) przez program ładujący do bazy Drzewo urządzeń (DT).

Nakładki mogą dotyczyć węzłów z głównego drzewa urządzeń 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 tabeli symboli nakładki z główną tablicą symboli ID (niescalanie pozwala uniknąć konfliktów w nazwach symboli i komplikacji zależności pomię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 . Jeśli po nałożeniu overlay_1 na główny ID zostanie podjęta próba zastosowania overlay_2 na powstałym ID, aplikacja nakładki zakończy się niepowodzeniem z powodu błędu polegającego na tym, że symbolu e nie ma w tablicy symboli podstawowego ID.

główne.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 zostanie zastosowany do bazowego ID, a następnie zostanie zastosowany overlay_2 , wartość właściwości prop w węźle e (ustawiona przez overlay_1.dts ) zostanie nadpisana przez wartość ustawioną przez overlay_2.dts .

główne.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>;
      };
};

Implementacja partycji DTBO

Aby zaimplementować wymaganą partycję DTBO, upewnij się, że program ładujący może wykonać następujące czynności:

  1. Zidentyfikuj płytę, na której działa, i wybierz odpowiednią nakładkę(-y), która ma zostać zastosowana.
  2. Dołącz parametr androidboot.dtbo_idx do wiersza poleceń jądra.
    • Parametr musi wskazywać od zera indeksy DTO z obrazu partycji DTBO zastosowanego do podstawowego ID (w tej samej kolejności).
    • Indeksy muszą odnosić się do położenia nakładki w przegrodzie DTBO.

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

Sprawdzanie poprawności partycji DTBO

Możesz użyć VTS, aby zweryfikować następujące kwestie:

  • Istnienie parametru wiersza poleceń jądra androidboot.dtbo_idx (poprzez sprawdzenie, czy Init automatycznie skonfigurował odpowiednią właściwość systemową ro.boot.dtbo_idx ).
  • Ważność właściwości systemowej ro.boot.dtbo_idx (poprzez sprawdzenie, czy właściwość określa przynajmniej jeden ważny indeks obrazu DTBO).
  • Ważność partycji DTBO (weryfikuje również nakładki w partycji DTBO, które są stosowane do bazowego DT).
  • Dodatkowe węzły lub zmiany właściwości w powstałym ID są prezentowane jądru Linuksa.

Na przykład w poniższych nakładkach i ostatecznym DT dodanie androidboot.dtbo_idx=5,3 do linii poleceń jądra przechodzi weryfikację, ale dodanie androidboot.dtbo_idx=3,5 do linii poleceń jądra nie przechodzi walidacji.

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

/dts-v1/;
/plugin/;

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

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
Ostateczny DT
/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

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