如何在 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 的两个设备树文件:
- 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 文件放在我的元测试配方中。想法如何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
我正在努力用 yocto 构建自己的 "embeeded linux"。它基于 SAMA5D3x-MB + SAMA5D3x-CM(RONETIX) 和 SAMA5D35。我有两个问题:
1.) 改变设备树
我基于以下内容构建映像:MACHINE ??= "sama5d3xek"
生成过程后,我在部署目录中找到了 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 文件放在我的元测试配方中。想法如何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