如何在Yocto中使用自己的设备树和修改后的内核配置?

16

我正在使用yocto构建自己的"嵌入式Linux"。该系统基于SAMA5D3x-MB + SAMA5D3x-CM(RONETIX)和SAMA5D35。我有两个问题:

1.) 修改设备树

我基于以下命令生成了一个映像: MACHINE ??= "sama5d3xek"

在生成过程中,我在deploy目录下找到了两个适用于5D35的设备树文件:

  • zImage--4.1+git0+19291d7be4-r0-sama5d35ek-.dtb
  • zImage--4.1+git0+19291d7be4-r0-sama5d35ek-revc-.dtb

因为主板是revD型号,所以我使用了zImage--4.1+git0+19291d7be4-r0-sama5d35ek-.dtb文件。

在这个文件中只定义了can0和i2c1。

我想同时使用can1和i2c0。为此,我认为需要创建一个自己的dts文件,并将其包含在内核构建过程中。

目前,我将dts文件放在我的meta-test配方中。有什么办法可以将其复制/打补丁到内核中吗?

2.) 更改内核配置

我使用以下命令检查内核: bitbake virtual/kernel -c menuconfig

因为我没有使用SAMA5D2等,只使用控制台,所以我停用了这些内核配置。我将新的“.config”保存为“my.config”,放入了my-recipe目录中。我有一个类似于问题1的问题 - 怎么将其打补丁/复制到内核中?

我是yocto和内核开发的新手。有什么办法可以做到这一点吗?

3个回答

43

如果你正在使用最新的Yocto项目版本,你可以使用recipetool来做大部分工作。你有两个选项,你可以使用现有的recipetool命令和少量手动工作,或者你可以使用meta-mentor中提供的recipetool插件,该插件提供了一些针对内核的特定命令来为您完成这些工作。

层设置

首先,您需要有一个图层来存储您的更改。如果您已经创建了一个图层,您可以使用它,否则我们可以创建一个并将其添加到我们的配置中:

$ yocto-layer create local 1
$ bitbake-layers add-layer meta-local

选项一:使用来自meta-mentor的recipetool插件

设置

首先,克隆meta-mentor:

$ git clone https://github.com/MentorEmbedded/meta-mentor

接下来,您可以将 meta-mel 添加到您的配置中:

$ bitbake-layers add-layer path/to/meta-mentor/meta-mel

或者将 meta-mentor/meta-mel/lib 复制到您自己的层中:

$ cp -a path/to/meta-mentor/meta-mel/lib meta-local/

设备树

$ recipetool kernel_add_dts meta-local /path/to/your.dts

内核配置

$ recipetool kernel_add_fragments meta-local /path/to/your.cfg
或者:
$ recipetool kernel_set_defconfig meta-local /path/to/the/defconfig

选项二:手动

在下面的部分,请确保 your-machine-name 替换成 sama5d3xek。在以下的 recipetool 命令中,传递 '-m your-machine-name' 参数可以使得食谱中的更改只针对您的机器进行,而不会影响到使用该食谱的任何其他设备。如果您知道该食谱仅用于您的机器,则可以省略此参数,但最好保留它,因为某些BSP层将同一内核食谱用于多台设备。例如,linux-yocto 用于许多设备。

设备树

假设您有一个 .dts 文件需要使用:

$ recipetool appendsrcfile -wm your-machine-name path/to/meta-local virtual/kernel /path/to/your.dts 'arch/${ARCH}/boot/dts/your.dts'

这将在meta-local中创建.bbpappend文件,并将.dts添加到SRC_URI中,将其放置在内核源代码树中的适当路径下。下一步是编辑它创建的附加文件并将.dtbs添加到KERNEL_DEVICETREE变量中,即:

KERNEL_DEVICETREE += "your.dtb"

如果内核配方包括recipes-kernel/linux/linux-dtb.inc,那么KERNEL_DEVICETREE中的任何.dtb文件将使用内核的构建系统从它们的.dts文件创建。一些内核不包括linux-dtb.inc,在这种情况下,您可以在附加项中自行添加:

require recipes-kernel/linux/linux-dtb.inc

内核配置

内核配置略微复杂,因为不同的内核配方之间配置方式略有不同。一些内核配方支持配置片段(仅是包含部分defconfig/.config的文本文件),而其他一些则需要完全覆盖配置。'linux-yocto'配方可以处理和使用片段,还有一些其他的配方也可以。

要查看正在使用哪个内核配方(顶部文件名将是所使用的文件名):

$ bitbake -e virtual/kernel | grep '^FILE='

如果您想使用配置片段,则可以手动创建一个片段,或者生成一个片段:

$ bitbake -c menuconfig virtual/kernel
$ bitbake -c diffconfig virtual/kernel

'diffconfig'任务将从menuconfig创建一个包含更改的片段,并打印其路径。

然后,您可以将其添加到内核中(尽管只有某些配方会使用它):

$ recipetool appendsrcfile -wWm your-machine-name meta-local virtual/kernel /path/to/your.cfg

为了覆盖整个配置,大多数食谱会遵守并使用“defconfig”源文件,因此:

$ recipetool appendsrcfile -Wm your-machine-name meta-local virtual/kernel /path/to/the/defconfig

注意:defconfig不会自动生成。请用menuconfig('.config')的结果替换defconfig。


我尝试了第二个选项,但失败了。我的本地机器是“sama5d3xek”。我用它替换了“meta-local”。recipetool无法找到“virtual/kernel”层。顺便说一下,bitbake可以找到“virtual/kernel”目标。有什么想法吗? - Stefan Jaritz
1
啊!非常抱歉,我忘记了-m参数需要输入机器名称,以使更改特定于该机器。这有点奇怪,因为我希望它只是默认为当前机器,而不需要指定。如果您添加机器名称,它应该按预期工作。即recipetool appendsrcfile -Wm sama5d3xek meta-local virtual/kernel /path/to/the/defconfig。我会更新答案以反映这一点。谢谢。 - kergoth
我仍然有一个内核配置的问题。bitbake -c menuconfig virtual/kernel -> 会生成一个新的“.config”文件。使用diffconfig将创建一个文件,我将其命名为myConfg.cfg。但是新构建的内核没有将其考虑在内。即使“defconfig”的大小约为7kB,“.config”的大小为79kB。有什么好的想法可以进行有效的配置吗? - Stefan Jaritz
正如答案中所提到的,diffconfig任务生成的是配置片段而不是defconfig,并且并非所有内核配方都遵守它们。要使用myConfig.cfg,请按照片段使用说明进行操作;要使用defconfig,请按照defconfig使用说明进行操作。您没有说内核构建是否考虑了片段或defconfig。您尝试使用哪一个? - kergoth
3
需要注意的是,配置片段必须使用.cfg扩展名。我认为这在poky/meta/classes/kernel-yocto.bbclass文件中有定义。花了一点时间我才意识到不能使用.config扩展名。 - Cody Piersall
显示剩余3条评论

3

如果你想要为linux-yocto内核生成补丁,devtool可能非常方便。其他内核可能不支持devtool。

## create kernel source patch
devtool modify virtual/kernel
# make some changes
cd ~/poky_sdk/workspace/sources/linux-yocto
vi init/calibrate.c
# test before patch
bitbake -C compile virtual/kernel
# create patch
git add .
git commit -m 'some fix'
devtool update-recipe -a ~/meta-mylayer/  linux-yocto
# clean the source
rm -rf workspace/sources/linux-yocto/

详细信息请参见devtool


1

与这个问题相关,为了教育目的,我尝试在x86体系结构(内核5.2.20)中添加设备树。 为了启用设备树编译器,需要进行以下配置:

CONFIG_COMPILE_TEST=y    
CONFIG_OF=y    
CONFIG_OF_ALL_DTBS=y

此外,为了在运行时启用设备树支持,还需要进行以下操作:
CONFIG_OF_UNITTEST=y    

一个方便的地方检查你的内核配置是否顺利合并的文件是
kernel-source/.kernel-meta/cfg/merge_config_build.log


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