如何在Yocto中更改u-boot的配置

13

使用Yocto项目为iMX6开发板构建Linux,并且我想要修改用于构建iMX开发板的u-boot-imx(iMX开发板的u-boot)的.config文件 - 例如,将自动引导延迟更改为1秒。

我可以编辑配置文件(例如,找到构建目录并运行make menuconfig),但是当我运行bitbake重新构建映像时,它会再次用默认值覆盖.config文件。有许多xxx_defconfig文件,我不知道它正在使用哪个。

我遵循了此指南进行内核配置(使用Yocto项目)。我对.config文件进行了更改,并将其复制到我的层并将其重命名为“defconfig”。我创建了一个新层,其中包含以扩展(u-boot-imx的配方)。

这是我的:

FILESEXTRAPATHS_prepend := "${THISDIR}:"

SRC_URI += "file://defconfig"

我也将它添加到我的layer.conf文件中的"BBFILES"中。
我按照以下步骤重新构建了u-boot:
bitbake -f -D u-boot-imx -c compile

当我这样做时,构建目录中的.config文件会恢复为默认配置(而不是我的修改版本),生成的u-boot二进制文件也没有更改(启动延迟仍然为3秒)。 我认为我的层正在被处理,因为我在输出中看到了这个:
DEBUG: Appending .bbappend file /home/bob/yocto/morty/sources/meta-mylayer/imx/meta-bsp/recipes-bsp/u-boot/u-boot-imx_2017.03.bbappend to /home/bob/yocto/morty/sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-bsp/u-boot/u-boot-imx_2017.03.bb

我看不到任何调试输出,表明有错误(例如找不到我的defconfig文件)。

我该如何使用Yocto对u-boot配置进行此类更改?

===== 编辑 =====

我按照下面LetoThe2nd的答案中的说明进行操作。这是我发现的:

bitbake-layers show-appends

有用! 在我看到的层中:

u-boot-imx_2017.03.bb:
  /home/bob/yocto/morty/sources/meta-mylayer/imx/meta-bsp/recipes-bsp/u-boot/u-boot-imx_2017.03.bbappend

所以看起来它找到了这个层。

bitbake -e -c clean u-boot-imx | tee build.log

在build.log中搜索"SRC_URI",我找到了这个:

# $SRC_URI [6 operations]
...
# pre-expansion value:
#   "${UBOOT_SRC};branch=${SRCBRANCH} file://defconfig"
SRC_URI="git://git.freescale.com/imx/uboot-imx.git;protocol=git;branch=imx_v2017.03_4.9.11_1.0.0_ga file://defconfig"
file://defconfig来自我的bbappend文件。
通过grep UBOOT_MACHINE,我找到了:
# $UBOOT_MACHINE [2 operations]
...
UBOOT_MACHINE=" mx6ull_14x14_evk_config"

这看起来是正确的!

我检查了u-boot-imx构建目录中的.config文件;它仍然是不正确的

(我比较了我的层中defconfig文件中CONFIG_BOOTDELAY的值与u-boot-imx构建目录中的.config文件中的值)。

===== 编辑2 =====

我按照LetoThe2nd答案下面的附录1建议进行操作。即:

  • 为构建我的evk板的u-boot-imx时使用的xxx_defconfig文件创建一个补丁(在本例中,[SOURCE DIR]/configs/mx6ull_14x14_evk_defconfig

  • 将补丁放在我的layer目录中与.bbappend文件一起

  • 更改.bbappend文件以使其看起来像这样:

_

FILESEXTRAPATHS_prepend := "${THISDIR}:"
SRC_URI += " file://mx6ull_14x14_evk_defconfig.patch;patchdir=${S}/configs "
  • 注意使用patchdir=${S}/configs - 这样bitbake就知道在哪里应用补丁,即[SOURCE DIR]/configs。参见这个问题

这很有效!(即我放在补丁中的调整后的自动启动延迟在u-boot-imx中得到了使用)。

我没有尝试建议2,因为第一种方法听起来更好。


2
很高兴你解决了这个问题!另外提一下,patchdir设置只在您的补丁是在软件包的源目录树中的某个位置创建时才是必要的。如果在您的情况下将diff文件夹置于上一级目录中,则不再需要该设置。我认为这是最佳实践,但当然,在这种特殊情况下,它只是次要的。 - LetoThe2nd
@Jeremy 当你说“.config”时,你实际上指的是什么?哪个文件? - 71GA
3个回答

8

从技术上讲,您所描述的过程听起来是正确的。但是有几个障碍需要注意,分别是要检查的事项:

  1. 您的.bbappend是否被实际处理?

虽然您似乎已经确认了这一点(通过调试输出),但通常可以通过以下方式更轻松地进行检查:

bitbake-layers show-appends

这将为您提供当前构建环境中所有有效追加的完整详细列表。
2. .bbappend文件是否确实产生了期望的效果?
如果涉及多个配方,则可能会变得复杂,并相互覆盖。请使用以下命令进行检查:
bitbake -e u-boot-imx

为了看到实际发生的情况,最好将其与管道结合起来使用 less(或您选择的分页器),然后搜索修改后的值,例如 SRC_URI。

  1. 查找您的 u-boot 设备。

根据第 2 条提供的信息,这相当简单:检查名为的变量

UBOOT_MACHINE

作为 u-boot 真正应该看到的内容。

  1. 尽量不要告诉 bitbake 要做什么。

特别是组合使用 -f 和 -c 开关可能会产生意外的结果,因为基本上你在调整任务依赖关系。根据我的经验,可以尝试以下操作:

bitbake -c clean u-boot-imx && bitbake u-boot-imx

应该会更好,因为它涵盖了整个构建依赖项,包括配置、打补丁等等。

编辑/附加说明

我已经与OE开发人员核实过,主要问题在于defconfig机制是(linux-)内核特定的,这也是为什么它在内核开发手册中有所解释的原因。

因此,要将您的配置放入实际构建中,有一个半个解决方案。

  1. 正确的方法:

准备一个u-boot源代码的补丁。在您的情况下,这可能只是对已经使用的defconfig文件进行轻微修改。将补丁以规范格式添加到SRC_URI中,然后它应该会自动被拾取并起作用。

  1. hackish(未经测试,因此只是一半)的方式:

以完整格式(而不是精简版本的defconfig)准备您的配置。然后将其添加到SRC_URI中,并通过.bbappend中的额外任务使用它:

do_compile_prepend() {
  cp YOURFILENAME ${S}/.config
}

这应该在编译开始前直接注入新配置。可能需要一些调整,但是你肯定明白了思路。另一种方法是将您的defconfig注入原始文件中。

话虽如此,我强烈推荐使用第一种方式。


你的附加方法1很好用!我已经在问题中添加了注释(编辑2),说明了我如何应用它。 - Jeremy
只是为了补充LetoThe2nd的回答。应用配置文件支持的第二种方法确实可行,更多信息可以在这里找到:https://community.nxp.com/thread/376369基本上,您有自己的defconfig/.config文件,将其作为Yocto配方中的SRC_URI包含。然后,您对主defconfig/.config进行字符串比较以获取您的配置添加,并适当地应用它。这是为了确保没有相同配置设置的重复。我以前使用过这种方法,如果需要,可以发布解决方案。 - Brendan

4

可以将defconfig作为常规文件添加,这里提供一个有效的bbappend示例:

PR = "r7"
BRANCH = "ti-u-boot-2020.01"
SRCREV = "ae8ceb7b6e3acb4bc90f730e33dafc7b65066591"
FILESEXTRAPATHS_prepend := "${THISDIR}:" 

SRC_URI +=  "file://0001-Add-am335x-cmpc30-target.patch \
         file://am335x-cmpc30.dts;subdir=git/arch/arm/dts \
         file://am335x_cmpc30_defconfig;subdir=git/configs/ \
        "

因此,“file://am335x_cmpc30_defconfig;subdir = git / configs /”行实际上将整个defconfig放入u-boot源代码中。

谢谢!这非常有用,因为创建补丁需要很长时间,而这只需要一小部分时间!如果您想创建新文件,这是一个更好的解决方案。对于更改现有文件,我仍然必须坚持使用补丁... - 71GA

3
不必将整个私有的.config文件复制到u-boot构建文件夹中,如果需要在defconfig内更改某些设置,则sed也可以完美地在do_compile_prepend方法中使用。示例:
do_configure_prepend() {
        sed -i -e 's,CONFIG_DEFAULT_DEVICE_TREE=,CONFIG_DEFAULT_DEVICE_TREE= ${BOARD_DEVICE_TREE},g'  ${S}configs/mx7ulp_evk_defconfig
}

搜索和替换模式中可以使用空格。 ${BOARD_DEVICE_TREE} 可以在 Yocto 配置文件之一中定义。这种方法也适用于已经使用基于配方的补丁列表修补过的源文件/头文件。


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