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

How to use an own device tree and modified kernel config in Yocto?

我正在努力用 yocto 构建自己的 "embeeded linux"。它基于 SAMA5D3x-MB + SAMA5D3x-CM(RONETIX) 和 SAMA5D35。我有两个问题:

1.) 改变设备树

我基于以下内容构建映像:MACHINE ??= "sama5d3xek"

生成过程后,我在部署目录中找到了 5D35 的两个设备树文件:

因为主板是revD我用的是zImage--4.1+git0+19291d7be4-r0-sama5d35ek-.dtb.

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

我也喜欢用can1和i2c0。为此,我认为我需要创建一个自己的 dts 文件并将其包含到内核构建过程中。

到目前为止,我将 dts 文件放在我的元测试配方中。想法如何copy/patch将其放入内核?

2.) 更改内核配置

我检查了内核 bitbake virtual/kernel -c menuconfig

因为我没有使用 SAMA5D2 等,我只使用了控制台,所以我停用了这些内核配置。我将新的“.config”保存到 "my.config" 到我的食谱目录中。我有类似问题 1 - How to patch/copy it into the kernel?

我是 yocto 和内核黑客的新手。知道怎么做吗?

如果您使用的是最近的 Yocto 项目版本,则可以使用 recipetool 来完成大部分相关工作。您有两个选择,您可以使用现有的 recipetool 命令和少量手动工作,或者您可以使用 meta-mentor 中的 recipetool 插件,它提供了一些特定于内核的命令来为您执行此操作。

图层设置

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

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

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

设置

首先,克隆元导师:

$ 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

选项二:手动

在下面的部分中,很明显在您的情况下,您的计算机名称应该是 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 中创建一个 .bbappend 并将 .dts 添加到 SRC_URI,将其放置在内核源代码树中的适当路径中。下一步是编辑它创建的追加并将 .dts 的 .dtb 添加到 KERNEL_DEVICETREE 变量,即:

KERNEL_DEVICETREE += "your.dtb"

如果内核配方包括 recipes-kernel/linux/linux-dtb.inc,KERNEL_DEVICETREE 中的任何 .dtb 文件都将使用内核的构建系统从其 .dts 文件创建。一些内核不包括 linux-dtb.inc,在这种情况下你可以自己在 append 中这样做:

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

关于这个问题,出于教育目的,我尝试将设备树添加到 x86 体系结构(内核 5.2.20)。要启用设备树编译器,需要对配置进行以下添加:

CONFIG_COMPILE_TEST=y    
CONFIG_OF=y    
CONFIG_OF_ALL_DTBS=y

此外,要在运行时启用设备树支持,还需要这样做:

CONFIG_OF_UNITTEST=y    

检查你的内核配置是否合并没有问题的一个方便的地方是文件
内核源代码/.kernel-meta/cfg/merge_config_build.log

如果您想为 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