How to modify kernel DTB file
Why don't you generate new dtb?
DTB(Device tree blob/binary), is hardware database which represents the hardware components of the board.
U-boot pass the board information struct to the kernel, that is derived from the header file in U-Boot.
DTB is compiled by the special compiler that produces the binary in the proper form for U-Boot and Linux to understand.
DTC (Device Tree Compiler) it translates device tree file to the machine-readable binary that U-Boot and Linux kernel can understand.
The straightforward way to use DTC.
$ dtc -O dtb -o arm_board.dtb -b 0 arm_board.dts
to get the device tree in text from the dtb.
dtc -I dtb -O dts arm_board.dtb
board.dts is binary created by the above command. -O
specifies the output format. -o
flag is output file. -b 0
specifies physical boot CPU.
Then do
$ make ARCH=arm arm_board.dtb
Another approach might be just use make dtbs
this will call dtc. arch/arm/boot/dts/Makefile
lists which DTBs should be
generated at build time
This another way to compile it. make will put that in this location of kernel tree /arch/arm/boot/dts
Have a look at this Device Tree for Dummies
Just want to update this with 2 years more experience on the subject.
The DTS files in the Linux repository are a mixture of DTS and C preprocessor directives (#include, #define, etc.). So when the original DTB is compiled, the preprocessor links to the referenced files to create a pure DTS file. dtc
converts the single DTS file into a DTB file.
So if you want to modify a kernel DTS file and compile it, then you have two options:
- Just run
make dtbs
which automatically handles all of this - Manually run the preprocessor (
cpp -nostdinc -I <include dir> -undef -x assembler-with-cpp ...
) and then compile the output withdtc
.