当我使用 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 文件是有效的。难道我错了?
我已经得到了大部分问题的答案,尽管没有我想要的那么完整:
使用 .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 可能会出现问题。
这是我得到的最好答案,至少目前是这样。
您是否应该能够简单地将 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
}