Obrazy DTB

Implementacje Androida mogą zawierać obraz DTB (Device Tree Blob) do użytku przez program rozruchowy. Lokalizacja obrazu DTB (i opcje określania parametrów obrazu DTB) różnią się w zależności od wersji Androida.

  • W Androidzie 11 urządzenia korzystające z ogólnego obrazu jądra (GKI) muszą obsługiwać partycję rozruchową dostawcy, która zawiera wszystkie informacje specyficzne dla dostawcy przeniesione z partycji rozruchowej. Obraz DTB zawiera dane specyficzne dla dostawcy, dlatego jest teraz częścią partycji rozruchowej dostawcy. Aby określić parametry obrazu DTB, zapoznaj się z nagłówkiem rozruchu dostawcy.

  • W Androidzie 10 urządzenia mogą zawierać obraz DTB w partycji rozruchowej. Aby określić parametry obrazu DTB, zapoznaj się z sekcją Uwzględnianie obrazu DTB w obrazie rozruchowym.

  • W Androidzie 9 i starszych wersjach obraz DTB może znajdować się na własnej partycji lub być dołączony do jądra image.gz, aby utworzyć obraz jądra + DTB (który jest następnie przekazywany do mkbootimg w celu utworzenia boot.img).

Format obrazu DTB

W Androidzie 10 i nowszych wersjach obraz DTB musi być w jednym z tych formatów:

  • Połączone ze sobą bloki DT. Program rozruchowy używa pola totalsize w każdym nagłówku FDT do odczytywania i analizowania odpowiedniego bloku.

  • Partycje DTB/DTBO. Program rozruchowy może skutecznie wybrać prawidłowy blok DT, sprawdzając strukturę dt_table_entry (zawierającą pola id, rev i custom), która może zawierać informacje identyfikujące sprzęt. Więcej informacji znajdziesz w sekcji Partycje DTB/DTBO.

Uwzględnianie obrazu DTB w obrazie rozruchowym

Urządzenia z Androidem 10 mogą zawierać obraz DTB w obrazie rozruchowym. Dzięki temu Android nie musi obsługiwać skryptów, które dołączają obraz DTB do image.gz w jądrze, i umożliwia korzystanie z testu Vendor Test Suite (VTS) do weryfikowania (i standaryzowania) umieszczania DTB.

Ponadto w przypadku urządzeń bez A/B bezpieczniej jest umieścić DTB w obrazie przywracania systemu niż na osobnej partycji, aby zapobiec problemom spowodowanym przerwaniem aktualizacji OTA. Jeśli podczas aktualizacji OTA wystąpi problem po zaktualizowaniu partycji DTB (ale przed zakończeniem pełnej aktualizacji), urządzenie spróbuje uruchomić się w trybie odzyskiwania, aby dokończyć aktualizację OTA. Ponieważ jednak partycja DTB została już zaktualizowana, może wystąpić niezgodność z obrazem odzyskiwania (który nie został jeszcze zaktualizowany). Umieszczenie obrazu DTB w formacie obrazu rozruchowego zapobiega takim problemom, ponieważ obraz przywracania systemu jest samowystarczalny (tzn. nie zależy od innej partycji).

Struktura obrazu rozruchowego

Urządzenia z Androidem 10 mogą zawierać obraz DTB przy użyciu tej struktury obrazu rozruchowego.

Sekcja obrazu rozruchowego Liczba stron
Nagłówek rozruchowy (1 strona) 1
Jądro (l stron) l = (kernel_size + page_size - 1) / page_size
Ramdysk (m stron) m = (ramdisk_size + page_size - 1) / page_size
Program rozruchowy drugiego etapu (n stron) n = (second_size + page_size - 1) / page_size
DTBO odzyskiwania (o stron) o = (recovery_dtbo_size + page_size - 1) / page_size
DTB (p stron) p = (dtb_size + page_size - 1) / page_size

Ścieżka obrazu DTB

W przypadku urządzeń z Androidem 10 możesz użyć narzędzia mkbootimg.py i tych argumentów, aby określić ścieżkę do obrazu DTB.

Argument Opis
dtb Ścieżka do obrazu DTB, który ma zostać uwzględniony w obrazach rozruchowych/odzyskiwania.
dtb_offset Po dodaniu do argumentu base podaje fizyczny adres wczytywania dla końcowego drzewa urządzeń. Jeśli na przykład argument base ma wartość 0x10000000, a argument dtb_offset ma wartość 0x01000000, pole dtb_addr_field w nagłówku obrazu rozruchowego jest wypełniane wartością 0x11000000.

Do określenia ścieżki do obrazu DTB należy użyć zmiennej konfiguracji płyty BOARD_PREBUILT_DTBIMAGE_DIR. Jeśli w katalogu BOARD_PREBUILT_DTBIMAGE_DIR znajduje się więcej niż 1 plik z rozszerzeniem *.dtb, system kompilacji Androida łączy te pliki, aby utworzyć końcowy obraz DTB używany podczas tworzenia obrazu rozruchowego.

Aby przekazać argument dtb do mkbootimg.py z obrazem DTB z katalogu określonego przez BOARD_PREBUILT_DTBIMAGE_DIR, zmienna konfiguracji płyty BOARD_INCLUDE_DTB_IN_BOOTIMG musi mieć wartość true. Przykład:

BOARD_INCLUDE_DTB_IN_BOOTIMG := true

Do zmiennej konfiguracji płyty BOARD_MKBOOTIMG_ARGS możesz dołączyć argument dtb_offset z innymi przesunięciami i wersją nagłówka. Przykład:

BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)

Obsługa programu rozruchowego

Aby VTS działał prawidłowo na urządzeniach z Androidem 10, program rozruchowy musi obsługiwać zaktualizowany obraz rozruchowy i dodawać parametr wiersza poleceń jądra androidboot.dtb_idx, aby wskazywać indeks wybranego drzewa urządzeń (DT). Możesz określić tylko 1 indeks. Na przykład parametr androidboot.dtb_idx=N zgłasza N jako indeks od zera drzewa urządzeń wybranego przez program rozruchowy z zestawu DTB obecnych w obrazie rozruchowym.