如何在 Yocto 中更改 u-boot 的配置
How to change the config of u-boot in Yocto
使用 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,因为第一种方法听起来更好。
从技术上讲,您描述的过程对我来说是正确的。但是有几个障碍需要注意,分别是需要检查的事情:
- 你的 .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,然后它应该会被自动拾取并执行此操作。
- 骇人听闻的(未经测试,因此只有一半)方式:
准备完整格式的配置(不是 defconfig 精简版)。然后将其添加到 SRC_URI 并通过 .bbappend 中的附加任务使用它:
do_compile_prepend() {
cp YOURFILENAME ${S}/.config
}
这应该在编译开始之前直接注入新配置。它可能需要一些修补,但您肯定明白了。另一种方法是在原始文件上注入 defconfig。
话虽如此,强烈推荐第一种方式
无需将整个私有 .config
文件复制到 u-boot 构建文件夹中,如果需要更改 defconfig 中的某些设置,sed
在 [=13= 中运行良好] 法也。示例:
`
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 配置文件之一中定义。此方法也适用于已使用基于配方的补丁列表进行补丁的 source/header 文件。
可以将 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 源代码。
使用 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,因为第一种方法听起来更好。
从技术上讲,您描述的过程对我来说是正确的。但是有几个障碍需要注意,分别是需要检查的事情:
- 你的 .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,然后它应该会被自动拾取并执行此操作。
- 骇人听闻的(未经测试,因此只有一半)方式:
准备完整格式的配置(不是 defconfig 精简版)。然后将其添加到 SRC_URI 并通过 .bbappend 中的附加任务使用它:
do_compile_prepend() {
cp YOURFILENAME ${S}/.config
}
这应该在编译开始之前直接注入新配置。它可能需要一些修补,但您肯定明白了。另一种方法是在原始文件上注入 defconfig。
话虽如此,强烈推荐第一种方式
无需将整个私有 .config
文件复制到 u-boot 构建文件夹中,如果需要更改 defconfig 中的某些设置,sed
在 [=13= 中运行良好] 法也。示例:
`
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 配置文件之一中定义。此方法也适用于已使用基于配方的补丁列表进行补丁的 source/header 文件。
可以将 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 源代码。