如何修改内核DTB文件
How to modify kernel DTB file
总结
我目前正在编译 Linux 内核(内核、模块和 DTB),其中包含一些用于自定义板的自定义驱动程序。偶尔我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容。现在我唯一可以补救的方法是修改 DTS 或内核驱动程序,使字符串匹配,然后再次重新编译内核。有什么方法可以只编辑 DTB 文件来更新兼容性字符串吗?
尝试失败
我已经能够使用以下命令将 DTB 文件反编译回 DTS 文件:
dtc -I dtb -o <filename>.dts -<filename>.dtb
但是,如果我修改 DTS 文件并使用以下命令重新编译:
dtc -I dts -o <filename>.dtb -<filename>.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
另一种方法可能只是使用 make dtbs
这将调用 dtc。 arch/arm/boot/dts/Makefile
列出应该是哪些 DTB
在构建时生成
这是另一种编译方式。 make 会将它放在内核树的这个位置 /arch/arm/boot/dts
只是想用 2 年的经验来更新这个主题。
Linux 存储库中的 DTS 文件是 DTS 和 C 预处理器指令(#include、#define 等)的混合体。因此,当编译原始 DTB 时,预处理器链接到引用的文件以创建纯 DTS 文件。 dtc
将单个 DTS 文件转换为 DTB 文件。
所以如果你想修改一个内核DTS文件并编译它,那么你有两个选择:
- 只需 运行
make dtbs
即可自动处理所有这些
- 手动运行预处理器(
cpp -nostdinc -I <include dir> -undef -x assembler-with-cpp ...
)然后用dtc
编译输出。
总结
我目前正在编译 Linux 内核(内核、模块和 DTB),其中包含一些用于自定义板的自定义驱动程序。偶尔我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容。现在我唯一可以补救的方法是修改 DTS 或内核驱动程序,使字符串匹配,然后再次重新编译内核。有什么方法可以只编辑 DTB 文件来更新兼容性字符串吗?
尝试失败
我已经能够使用以下命令将 DTB 文件反编译回 DTS 文件:
dtc -I dtb -o <filename>.dts -<filename>.dtb
但是,如果我修改 DTS 文件并使用以下命令重新编译:
dtc -I dts -o <filename>.dtb -<filename>.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
另一种方法可能只是使用 make dtbs
这将调用 dtc。 arch/arm/boot/dts/Makefile
列出应该是哪些 DTB
在构建时生成
这是另一种编译方式。 make 会将它放在内核树的这个位置 /arch/arm/boot/dts
只是想用 2 年的经验来更新这个主题。
Linux 存储库中的 DTS 文件是 DTS 和 C 预处理器指令(#include、#define 等)的混合体。因此,当编译原始 DTB 时,预处理器链接到引用的文件以创建纯 DTS 文件。 dtc
将单个 DTS 文件转换为 DTB 文件。
所以如果你想修改一个内核DTS文件并编译它,那么你有两个选择:
- 只需 运行
make dtbs
即可自动处理所有这些 - 手动运行预处理器(
cpp -nostdinc -I <include dir> -undef -x assembler-with-cpp ...
)然后用dtc
编译输出。