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

6
当我使用Yocto Kirkstone为beaglebone-yocto机器构建core-image时,我会得到一个文件/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文件是有效的。我错了吗?


1
“我已经尝试将'mycustom.dtsi'编译成'mycustom.dtb'...编译成功了。”这并没有意义,也不太可能。 .dtsi 只是一个包含文件。 .dtb 文件是从 .dts 文件编译而来的。 - sawdust
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。这不像创建一个补丁那么整洁,而且如果您运行两次configure,它会将其附加两次,但我认为它不会造成任何伤害,而且它很清楚它试图做什么。

现在,在conf/local.conf文件中将您的mycustom.dtb添加到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.dtsmyincludes.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文件。
例如: 将你的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
}

我还没有尝试过,但那可能有效,谢谢。我不喜欢图像仍然使用am335x-boneblack.dtb,但它会与官方的.dtb不同,使得更改在某种程度上隐藏起来。 - undefined
也许我误解了,你最初的困扰只是与在运行时部署的叠加文件编译相关,而不是通过.dtsi包含文件进行实际的设备树修改? - undefined
我所描述的与dtb文件几乎没有关系,也与它们部署到文件系统无关。我所描述的都是在源文件级别上实现的,还没有进行任何编译。设备树背后的整个理念就是为了促进这种模块化。除非您正在以一种新颖的方式实现BeagleBone参考设计的定制版本,否则您应该始终从Ti的配置开始,然后继承/包含BeagleBone(Black)的包含文件;然后使用您的包含文件来禁用、启用和配置与您的构建特定的节点。 - undefined

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