使用Yocto/bitbake快速重建设备树是否可行?

28
所以,每次我修改设备树时,通常会在自定义配方中更改dts并重新构建映像。重建需要很长时间,因为它要重新构建整个内核,然后需要构建映像,最后部署到目标设备。
有没有我忽略的技巧只重建设备树?
更新:
我已经将g0hl1n的答案标记为正确答案,因为这是我的问题的答案。但是,我发现在Yocto中处理内核非常麻烦:奇怪的、冗长的路径和文件被覆盖的风险,内核源代码在tmp/work-shared中,而内核正在tmp/work中构建。
相反,我已将内核开发移出Yocto。 Yocto具有创建SDK的良好工具(请参见populate_sdk任务),有了它,可以轻松设置用于内核开发的环境,进行快速重建和手动(或脚本)部署。完成工作后,可以使用git diff将更改移动到配方中。
以下页面上的说明非常有帮助:http://jumpnowtek.com/beaglebone/Working-on-the-BeagleBone-kernel.html

我认为正确的答案是“不,没有正确的方法。请发送一个补丁”。 - Jérôme Pouiller
3个回答

35

据我所知,有两种不同的方法可以做到这一点。

  1. 内核方式:使用内核提供的脚本
  • 切换到您的内核源目录(<build dir>/tmp/work/<machine>/<kernel-name>/<kernel-version>/git/
  • 执行设备树编译器:./scripts/dtc/dtc -I dts -O dtb -o ./devicetree.dtb path/to/devicetree.dts
  1. Bitbake方式:使用内核的部署作业
  • 调用 $ bitbake <kernel-name> -f -c deploy
  • 生成的设备树blob可以在以下位置找到:<build dir>/tmp/work/<machine>/<kernel-name>/<kernel-version>/build/arch/arm/boot/dts/)

至少对于我来说,在快速测试中这两个版本都有效。

更新: 我刚刚发现了第三个使用Yocto构建dtb的版本。 那个版本使用了Yocto的内核构建devshell。 更多信息请参见原作者页面:https://splefty.blogspot.co.at/2015/09/compiling-device-tree-using-yocto.html


1
谢谢。有三个好的选择。我更喜欢第二种方法,因为它最能保证与正常构建相同。而且我不能轻易使用devshell,因为我想自动化它。现在,为了让它完美,我想运行两个任务:“bitbake <kernel-name> -f -c unpack”来复制所有的dts和dtsi文件,然后跟着运行“bitbake <kernel-name> -f -c deploy”来构建dtb。但不幸的是,“unpack”命令会导致“deploy”命令重新构建整个内核。如果能强制运行一个不重新构建内核的“deploy”命令就太完美了! - Jonatan
$TMPDIR修改文件不能被视为一种选项。 - Jérôme Pouiller
3
对我来说,使用“bitbake <kernel-name> -f -c deploy”总是会导致整个内核重新构建,这与只使用“bitbake <kernel-name>”具有相同的效果。我正在使用Freescale内核linux-fslc。 meta-xilinx层非常好,因为它提供了一个单独的配方来构建设备树:https://github.com/Xilinx/meta-xilinx/tree/master/meta-xilinx-bsp/recipes-bsp/device-tree - Jetski S-type
1
或者运行 bitbake virtual/kernel -f -c deploy - User55412

4

对我来说,使用bitbake重新生成设备树的方法如下:

命令:$ bitbake <kernel-name> -f -c compile

例如:$ bitbake linux-fslc -f -c compile

已在yocto sumo中进行了测试。


请纠正我,但这将重建整个内核。问题是如何快速编译设备树。 - Jonatan
2
不会,它会触发内核的Makefile,但如果源代码树没有改变(除了设备树),那么内核二进制文件就不会重新生成。 - Tobias Braune

0
我发现重新构建dtb最方便的方法是将我的自定义构建步骤添加到我的内核配方中。
do_recompile_dtb() {
    cd ${B}
    oe_runmake freescale/imx8mp-evk.dtb
}
addtask recompile_dtb before do_compile after do_configure


每次需要重新编译我的设备树时,我都会运行它。
bitbake virtual/kernel -c recompile_dtb

每一轮编译仍然会有一些不必要的任务被执行,但相比重新编译内核,这仍然要好得多。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接