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

Kat*_*atu 6 linux-kernel device-tree yocto yocto-recipe yocto-layer

当我使用 Yocto Kirkstone 为机器 beaglebone-yocto 构建核心映像时,我得到一个文件/boot/extlinux/extlinux.conf. 该文件如下所示:

default Yocto
label Yocto
   kernel /zImage
   fdtdir /
append root=PARTUUID=f8fbccd5-02 rootwait console=ttyS0,115200
Run Code Online (Sandbox Code Playgroud)

我可以在标签 a 内附加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).*"
Run Code Online (Sandbox Code Playgroud)

它构建正确,但是当我在图像中使用它时,我收到错误:No match for argument: mycustom因为do_rootfs: Could not invoke dnf. 看起来 do_root 作为mycustom参数添加到命令中,导致命令失败。

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

Kat*_*atu 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
}
Run Code Online (Sandbox Code Playgroud)

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

现在将 mycustom.dtb 添加到conf/local.conf文件中的 KERNEL_DEVICETREE 变量中:

KERNEL_DEVICETREE:append = " mycustom.dtb"
Run Code Online (Sandbox Code Playgroud)

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

当您编译图像时,它将添加mycustom.dtb到该/boot文件夹​​中。如果您想检查是否处于正确的轨道上,请使用以下命令清理并配置内核:

bitbake -c cleanall virtual/kernel
bitbake -c configure virtual/kernel
Run Code Online (Sandbox Code Playgroud)

您应该在最后一行找到该文件tmp/work-shared/beaglebone-yocto/kernel-source/arch/arm/boot/dts/Makefile,并且该文件夹具有和。当你编译内核时dtb-$(CONFIG_SOC_AM33XX) += mycustom.dtbtmp/work-shared/beaglebone-yocto/kernel-source/arch/arm/boot/dts/mycustom.dtsmyincludes.dtsi

bitbake virtual/kernel
Run Code Online (Sandbox Code Playgroud)

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/可能有所不同。

当您启动映像时,它现在应该显示mycustom.dtb在 /boot 文件夹中。为了告诉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
Run Code Online (Sandbox Code Playgroud)

并将其复制到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
Run Code Online (Sandbox Code Playgroud)

Bitbake 你的图像,它现在将mycustom.dtb默认使用你。

我尝试创建自己的 wks 文件,以便将其保留在我的层中,但出现错误,指出它找不到我的内核。我也尝试创建自己的机器,但出现了其他错误。我希望我不必使用 PARTUUID /dev/mmcblk0p2,但我不知道是否可以或如何使用 PARTUUID。如果将映像刷新到 EMMC,则使用 /dev/mmcblk0p2 可能会出现问题。这是我得到的最好答案,至少目前是这样。