A device tree (DT) is a data structure of named nodes and properties that describe non-discoverable hardware. Kernels, such as the Linux kernel used in Android, use DTs to support a wide range of hardware configurations used by Android-powered devices. Hardware vendors supply their own Device Tree Source (DTS) files, which are compiled into the Device Tree Blob (DTB) file using the Device Tree Compiler. These files are then used by the bootloader. The DTB file contains a binary-formatted flattened device tree.
A device tree overlay (DTO) enables a central device tree blob (DTB) to be overlaid on the device tree. A bootloader using DTO can maintain the system-on-chip (SoC) DT and dynamically overlay a device-specific DT, adding nodes to the tree and making changes to properties in the existing tree.
Updates in Android 9 Release
In Android 9, the bootloader must not modify the properties defined in the device tree overlays before passing the unified device tree blob to the kernel.
Loading a device tree
Loading a device tree in bootloader involves building, partitioning, and running.
To create and flash the device tree blob:
1a. Use the device tree compiler (
dtc>) to compile device tree source (
.dts) into a device tree blob (
.dtb). The device tree blob is formatted as a flattened device tree. 1b. Flash the
.dtbfile into a bootloader runtime-accessible location (detailed below).
To partition, determine a bootloader runtime-accessible and trusted location in flash memory to put
.dtb. Example locations:
Boot Partition Unique Partition
To load the device tree blob and start the kernel:
.dtbfrom storage into memory. 3b. Start kernel using the memory address of the loaded DT.
This page details a typical bootloader workflow for loading a DT and provides a list of common DT terms. Other pages in this section describe how to implement bootloader support, how to compile, verify, and optimize your DTO, and how to use multiple DTs. You can also get details on DTO syntax and required DTO/DTBO partition formatting.