In the world of embedded Linux and firmware development, few acronyms provoke as much quiet respect—and occasional frustration—as DTB: the Device Tree Blob. While not firmware in the traditional sense (like UEFI or a bootloader binary), DTB firmware represents a crucial linkage layer: a hardware description format that bridges the rigid, fixed world of physical components with the flexible, portable world of operating system kernels.
Understanding the boot sequence clarifies why the DTB is so tightly coupled with firmware. Here is a typical boot flow for an ARMv8-based system: dtb firmware
$fdt_addr), and passes the address to the kernel via the r2 register (ARM32) or device tree pointer (ARM64).If any step fails—wrong DTB, corrupted DTB, or firmware that doesn't pass the address correctly—the system hangs. DTB Firmware: The Skeleton Key of Modern Embedded
bootz $kernel_addr - $fdt_addr
A Device Tree Blob (DTB) is a compiled, binary form of a Device Tree Source (DTS) file. Think of it as a hardware blueprint written in a language the kernel can understand without recompilation. It describes: ROM Code (Boot ROM): Embedded in the SoC
The DTB is not executable code. It’s a structured data block (in flattend device tree format) that the bootloader loads into memory and passes to the kernel at boot.
The compiled .dtb file must be made available to your bootloader. In U-Boot, you typically:
uImage or Image.gz.zImage method).mtdparts for NAND).