C 如何修改内核DTB文件

C 如何修改内核DTB文件,c,linux,linux-kernel,arm,embedded-linux,C,Linux,Linux Kernel,Arm,Embedded Linux,摘要 我目前正在编译Linux内核(内核、模块和DTB),其中包含一些用于定制板的定制驱动程序。偶尔我会编译内核,并意识到DTB文件中的兼容性字符串不是定制驱动程序所需要的。现在我唯一可以补救的方法是修改DTS或内核驱动程序,使字符串匹配,然后重新编译内核。有没有办法编辑DTB文件来更新兼容性字符串 尝试失败 我已经能够使用以下命令将DTB文件反编译回DTS文件: dtc -I dtb -o <filename>.dts -<filename>.dtb dtc -I d

摘要

我目前正在编译Linux内核(内核、模块和DTB),其中包含一些用于定制板的定制驱动程序。偶尔我会编译内核,并意识到DTB文件中的兼容性字符串不是定制驱动程序所需要的。现在我唯一可以补救的方法是修改DTS或内核驱动程序,使字符串匹配,然后重新编译内核。有没有办法编辑DTB文件来更新兼容性字符串

尝试失败

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

dtc -I dtb -o <filename>.dts -<filename>.dtb
dtc -I dts -o <filename>.dtb -<filename>.dts
dtc-I dtb-o.dts-.dtb
但是,如果我修改DTS文件并使用命令重新编译:

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

内核不会加载重新编译的DTB文件,为什么不生成新的DTB

DTB(Device tree blob/binary)是硬件数据库,表示电路板的硬件组件

U-boot将线路板信息结构传递给内核,该结构源自U-boot中的头文件

DTB由特殊的编译器编译,该编译器以适当的形式生成二进制文件,以便U-Boot和Linux理解


DTC(设备树编译器)它将设备树文件转换为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指定物理引导CPU

那就做吧

$ make ARCH=arm arm_board.dtb

另一种方法可能是使用
生成DTB
这将调用dtc<代码>arch/arm/boot/dts/Makefile列出了应该使用哪些DTB 在构建时生成 这是编译它的另一种方法。make将把它放在内核树的这个位置
/arch/arm/boot/dts


看看这个

我只想用两年的经验来更新这个

Linux存储库中的DTS文件是DTSC预处理器指令(include、define等)的混合体。因此,当编译原始DTB时,预处理器链接到引用文件以创建纯DTS文件<代码>dtc将单个DTS文件转换为DTB文件

因此,如果您想修改内核DTS文件并对其进行编译,则有两个选项:

  • 只需运行
    makedtbs
    ,它就会自动处理所有这些问题
  • 手动运行预处理器(
    cpp-nostdinc-I-unde-x汇编程序和cpp…
    ),然后用
    dtc
    编译输出
    您能显示任何错误或内核日志吗?您应该使用-O标志来编译,-I是从设备树blob中获取文本形式的设备树。调用
    make
    肯定会起作用。不幸的是,我使用的是
    yocto
    构建系统,因此我需要制作一个额外的配方来公开该调用。我认为这是最好的选择,因为
    dtc
    (即使使用-O)仍然不适合我。