如何在 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 中的某些设置,sed
在do_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 的配置的主要内容,如果未能解决你的问题,请参考以下文章