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

Posted

技术标签:

【中文标题】如何在 Yocto 中更改 u-boot 的配置【英文标题】:How to change the config of u-boot in Yocto 【发布时间】:2018-04-13 07:39:34 【问题描述】:

使用 Yocto 项目为 iMX6 开发板构建 linux,我想更改用于构建 u-boot-imx(iMX 开发板的 u-boot)的 .config - 例如例如,将自动启动延迟更改为 1 秒。

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

我跟随this guide 使用 Yocto 项目进行内核配置。我对 .config 文件进行了更改,并将其复制到我的图层并重命名为“defconfig”。我用 u-boot-imx_2017.03.bbappend 创建了一个新层来扩展 u-boot-imx_2017.03.bb(u-boot-imx 的配方)。

这是我的 u-boot-imx_2017.03.bbappend

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。

寻找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

使用 .bbappend 将补丁放在我的图层目录中

将 .bbappend 更改为如下所示:

_

FILESEXTRAPATHS_prepend := "$THISDIR:"
SRC_URI += " file://mx6ull_14x14_evk_defconfig.patch;patchdir=$S/configs "
注意 patchdir=$S/configs 的使用 - 所以 bitbake 知道在哪里应用补丁,即 [SOURCE DIR]/configs。见this question

这行得通! (即我在补丁中调整的自动启动延迟用于 u-boot-imx)。

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

【问题讨论】:

很高兴你成功了!附带说明一下,仅当您的补丁是在要修补的软件包的源树的某个位置创建时,才需要使用 patchdir 设置。如果您在您的情况下执行 diff 一个目录级别,则不再需要该设置。我认为这是最佳实践,但当然在这种特殊情况和情况下它只是次要的。 @Jeremy 当您说“.config”时...您的实际意思是什么?哪个文件? 【参考方案1】:

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

    您的 .bbappend 是否真正得到处理?

虽然您似乎是这种情况(您通过调试输出发现),但通常更容易检查:

bitbake-layers show-appends

这将为您提供在当前构建情况下有效的所有附加的完整详细列表。

    .bbappend 真的有预期的效果吗?

如果涉及多个配方,事情可能会很复杂,并且会相互覆盖。检查与

bitbake -e u-boot-imx

看看实际发生了什么。这最好与通过管道连接到 less(或您选择的寻呼机)中,然后搜索修改后的值,例如 SRC_URI。

    找出你的u-boot机器是什么。

鉴于 2. 中的信息,这相当简单:检查名为的变量

UBOOT_MACHINE

因为这是 u-boot 真正应该看到的。

    尽量不要告诉 bitbake 做什么太详细。

特别是结合 -f 和 -c 开关可能会产生意想不到的结果,因为您基本上是在修改任务依赖关系。以我的经验,有些东西

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

应该会更好,因为它会遍历整个构建依赖项,包括配置、修补等。

编辑/补充

我已经检查过 OE 开发人员,主要问题是 defconfig 机制是(linux-)内核特定的,这也是内核开发手册中解释它的原因。

因此,要将您的配置用于实际构建,有一种半解决方案。

    正确方法:

为 u-boot 源准备补丁。在您的情况下,这可能只是对已在使用的 defconfig 文件的微小修改。拥有规范格式的补丁并将其添加到 SRC_URI,然后它应该会自动被拾取并执行此操作。

    hackish(未经测试,因此只有一半)方法:

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

do_compile_prepend() 
  cp YOURFILENAME $S/.config

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

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

【讨论】:

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

可以将 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 源代码中。

【讨论】:

谢谢!这非常有用,因为创建补丁确实需要很多时间,而这只是一小部分时间!如果您想创建新文件,这是一个更好的解决方案。为了更改现有文件,我仍然必须坚持使用补丁...【参考方案3】:

不必将整个私有.config 文件复制到u-boot 构建文件夹中,如果需要更改defconfig 中的某些设置,seddo_compile_prepend 方法中也可以正常工作。示例:

`

do_configure_prepend() 
        sed -i -e 's,CONFIG_DEFAULT_DEVICE_TREE=,CONFIG_DEFAULT_DEVICE_TREE= $BOARD_DEVICE_TREE,g'  $Sconfigs/mx7ulp_evk_defconfig

`

在搜索和替换模式中,空格是完全可以的。 $BOARD_DEVICE_TREE 可以在 Yocto 配置文件之一中定义。此方法也适用于已使用基于配方的补丁列表修补的源/头文件。

【讨论】:

以上是关于如何在 Yocto 中更改 u-boot 的配置的主要内容,如果未能解决你的问题,请参考以下文章

如何更改Yocto dora bitbake系统中的root密码?

在 Yocto 中使用 armhf 作为辅助工具链

如何在 yocto 中使用外部工具链

如何在 yocto 中设置系统日志?

如何管理yocto项目的meta层并在git中构建配置

如何在 Yocto 配方中获取 Bash 脚本