C语言 如何修改内核DTB文件

oug3syen  于 2023-02-18  发布在  其他
关注(0)|答案(3)|浏览(258)

摘要

我目前正在编译Linux内核(内核,modules和DTB),并为一个定制板提供了一些定制驱动程序。有时候我会编译内核,并意识到DTB文件中的兼容性字符串不是定制驱动程序所寻找的。现在唯一的补救方法是修改DTS或内核驱动程序,使字符串匹配,然后再次重新编译内核。是否有方法可以编辑DTB文件以更新兼容性字符串?

失败的尝试

我已经能够使用以下命令将DTB文件反编译回DTS文件:

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

但是,如果我修改DTS文件并使用以下命令重新编译:

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

内核将不加载重新编译的DTB文件

zfycwa2u

zfycwa2u1#

只是想更新这与2年以上的经验,在这个问题上。
Linux存储库中的DTS文件是DTSC预处理器指令(#include、#define等)的混合。因此,当编译原始DTB时,预处理器链接到引用的文件以创建纯DTS文件。dtc将单个DTS文件转换为DTB文件。
因此,如果要修改内核DTS文件并对其进行编译,则有两个选项:
1.只需运行make dtbs,它会自动处理所有这些问题
1.手动运行预处理器(cpp -nostdinc -I <include dir> -undef -x assembler-with-cpp ...),然后使用dtc编译输出。

wljmcqd8

wljmcqd82#

为什么不生成新的数字电视广播?
DTB(设备树blob/binary)是硬件数据库,代表板卡的硬件组件。
U-boot将板卡信息结构体传递给内核,该结构体是从U-Boot中的头文件中派生出来的。
DTB由特殊的编译器编译,该编译器以U-Boot和Linux能够理解的正确形式生成二进制文件。
DTC(Device Tree Compiler)将设备树文件转换为U-Boot和Linux内核可以理解的机器可读二进制文件。
直接使用DTC的方法。

$ dtc -O dtb -o arm_board.dtb -b 0 arm_board.dts

以从DTB获得文本形式的设备树。

dtc -I dtb -O dts arm_board.dtb

board.dts是由上述命令创建的二进制文件。-O指定输出格式。-o标志是输出文件。-b 0指定物理 Boot CPU。
那就做吧

$ make ARCH=arm arm_board.dtb

另一种方法可能只是使用make dtbs,这将调用dtc。arch/arm/boot/dts/Makefile列出了应在构建时生成的DTB。这是编译它的另一种方法。make将把它放在内核树/arch/arm/boot/dts的此位置
看看这个Device Tree for Dummies

gjmwrych

gjmwrych3#

使用yocto,您可以使用
bitbake <KERNEL-VERSION> -f -c compile
例如:
bitbake linux-stable -f -c compile
您将在此处找到结果:
build/tmp/work/<YOUR_MACHINE>-<YOUR-DISTRO>-linux-gnueabi/<KERNEL-RECIPE>/<KERNEL-VERSION>/linux-<YOUR-MACHINE>-standard-build/arch/<ARCH>/boot/dts/<YOUR-DTS-FILENAME>.dtb
你也可以在那里找到名为.<YOUR-DTS-FILENAME>.dtb.dts.tmp的预处理器的结果。这个文件包含了所有的include,对错误分析很有用。

相关问题