对于大多数问题,我都有答案,尽管不如我希望的那么完整:
构建包含 .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.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 可能会出现问题。
至少目前这就是最好的答案。