Search code examples
clinuxlinux-kernelarmembedded-linux

How to modify kernel DTB file


Summary

I am currently compiling the Linux kernel (kernel, modules and DTB) with some custom drivers for a custom board. Occasionally I'll compile the kernel and realize that the compatibility string in the DTB file is not what the custom driver is looking for. Right now the only way i can remedy this is modify the DTS or kernel driver so the strings match and then recompile the kernel again. Is there are way I can just edit the DTB file to update the compatibility string?

Failed Attempts

I have been able to decompile the DTB file back to a DTS file using the command:

dtc -I dtb -o <filename>.dts -<filename>.dtb

However if I modify the DTS file and recompile using the command:

dtc -I dts -o <filename>.dtb -<filename>.dts

The kernel will not load the recompiled DTB file


Solution

  • 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:

    1. Just run make dtbs which automatically handles all of this
    2. Manually run the preprocessor (cpp -nostdinc -I <include dir> -undef -x assembler-with-cpp ...) and then compile the output with dtc.