Yocto Kirkstone Beaglebone Black 添加自定义设备树

问题描述 投票:0回答:2

当我使用 Yocto Kirkstone 为机器 beaglebone-yocto 构建核心映像时,我得到一个文件

/boot/extlinux/extlinux.conf
。该文件看起来像:

default Yocto
label Yocto
   kernel /zImage
   fdtdir /
append root=PARTUUID=f8fbccd5-02 rootwait console=ttyS0,115200

我可以在标签内添加

DEVICETREE /mycustom.dtb
,它将在下次启动时加载 mycustom.dtb 作为设备树。我不知道如何将其包含在 Yocto 构建中,因此
mycustm.dtsi
被编译并添加到 /boot 文件夹中。

我尝试将

mycustom.dts
编译为
mycustom.dtb
,配方如下:

inherit devicetree
FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
SRC_URI = " \
    file://mycustom.dts;subdir=git/overlays \
"
S = "${WORKDIR}/git/overlays"
COMPATIBLE_MACHINE = ".*(beaglebone).*"

它构建正确,但是当我在图像中使用它时,我收到错误:

No match for argument: mycustom
,因为
do_rootfs: Could not invoke dnf
。看起来 do_root 添加了
mycustom
作为命令的参数,导致命令失败。

我已经阅读了多个关于 向内核添加 dts 添加自定义 kernel_devicetree 的问题,但我还没有成功地实现它们,我一直认为一定有一种比修补 u-boot 和更简单的方法内核,因为手动修改 extlinux.conf 文件是有效的。难道我错了?

linux-kernel yocto device-tree yocto-recipe yocto-layer
2个回答
3
投票

我已经得到了大部分问题的答案,尽管没有我想要的那么完整:

使用 .dtsi 构建 .dts 包括:

在您自己的图层中,创建一个文件夹

meta-mylayer/recipes-kernel/linux/files
在文件中复制 mycustom.dts 和所有 myinclude.dtsi。 创建配方
meta-mylayer/recipes-kernel/linux/linux-yocto_%.bbappend
,将附加到您使用以下内容的任何 linux-yocto 内核:

FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
SRC_URI:append = " \
    file://mycustom.dts \
    file://myinclude.dtsi \
"

do_configure:append(){
 cp ${WORKDIR}/*.dt* ${S}/arch/arm/boot/dts
 echo 'dtb-$(CONFIG_SOC_AM33XX) += mycustom.dtb' >> ${S}/arch/arm/boot/dts/Makefile
}

该配方将修补 Makefile 以包含您的 mycustom.dtb。这并不像为其创建补丁那么简洁,如果您运行两次配置,它会附加两次,但我认为这不会造成任何损害,而且很清楚它正在尝试做什么。

现在将 mycustom.dtb 添加到

conf/local.conf
文件中的 KERNEL_DEVICETREE 变量中:

KERNEL_DEVICETREE:append = " mycustom.dtb"

我尝试将其添加到 bbappend 或图像配方中,但它不起作用。可能是因为内核没有检查这些食谱。

当您编译图像时,它现在会将

mycustom.dtb
添加到
/boot
文件夹中。如果您想检查是否走在正确的轨道上,请使用以下命令清理并配置内核:

bitbake -c cleanall virtual/kernel
bitbake -c configure virtual/kernel

您应该在最后一行找到文件

tmp/work-shared/beaglebone-yocto/kernel-source/arch/arm/boot/dts/Makefile
dtb-$(CONFIG_SOC_AM33XX) += mycustom.dtb
,文件夹
tmp/work-shared/beaglebone-yocto/kernel-source/arch/arm/boot/dts/
mycustom.dts
myincludes.dtsi
。当你编译内核时

bitbake virtual/kernel

mycustom.dtb
存在于
tmp/work/beaglebone_yocto-poky-linux-gnueabi/linux-yocto/5.15.54+gitAUTOINC+e4b95ec172_9aabbaa89f-r0/linux-beaglebone_yocto-standard-build/arch/arm/boot/dts/
您的内核版本可能不同。

当您启动映像时,它现在应该在 /boot 文件夹中显示

mycustom.dtb
。为了告诉u-boot使用
mycustom.dtb
,我想更改文件
/boot/extlinux/extlinux.conf
。为此,您可以使用以下命令创建自定义
extlinux.conf
文件:

default Yocto
label Yocto
   kernel /zImage
   fdtdir /
   DEVICETREE /mycustom.dtb
append root=/dev/mmcblk0p2 rootwait console=ttyS0,115200

并将其复制到

poky/meta-yocto-bsp/wic/myextlinux.conf
。最后修改文件
poky/meta-yocto-bsp/wic/beaglebone-yocto.wks
并在引导加载程序的最后一行中添加
--configfile myextlinux.conf
,使其显示为:

bootloader --append="console=ttyS0,115200" --configfile myextlinux.conf

Bitbake 您的图像,现在默认情况下它将使用您

mycustom.dtb

我尝试创建自己的 wks 文件,以便将其保留在我的层中,但出现错误,指出它找不到我的内核。 我也尝试创建自己的机器,但出现了其他错误。 我希望我不必使用

/dev/mmcblk0p2
,但我不知道是否可以或如何使用 PARTUUID。如果将映像刷新到 EMMC,则使用 /dev/mmcblk0p2 可能会出现问题。 这是我得到的最好答案,至少目前是这样。


0
投票

您是否应该能够简单地将 dtsi 添加到 boot/dts/ 目录,并附加 am335x-boneblack.dts 以及指向您的 .dtsi 文件的 include 语句?

即 将您的 dtsi 文件放入 meta-mylayer/recipes-kernel/linux/files/ 中,如上所述,然后放入您的 meta-mylayer/recipes-kernel/linux/linux-yocto_%.bbappend

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
 
SRC_URI_append = " \
        file://am335x-boneblack-your-custom.dtsi \
"
 
do_configure_append() {
        cp ${WORKDIR}/am335x-boneblack-your-custom.dtsi ${B}/source/arch/${ARCH}/boot/dts
        echo '/include/ "am335x-boneblack-your-custom.dtsi"' >> ${B}/source/arch/${ARCH}/boot/dts/am335x-boneblack.dts
}
© www.soinside.com 2019 - 2024. All rights reserved.