如何使用 Yocto 将文件部署到 /boot 分区

How to deploy files to /boot partition with Yocto

我正在尝试将一些二进制文件部署到 RPi CM3 的 Yocto 映像中的 /boot,但它会将它们部署到错误的位置。

do_install() {
    install -d ${D}/boot/overlays
    install -m 0664 ${WORKDIR}/*.dtb ${D}/boot/overlays/
    install -m 0664 ${WORKDIR}/*.dtbo ${D}/boot/overlays/
}

文件部署到最终镜像的/分区的/boot,但没有部署到/boot分区。所以它们在启动时不可用。

我已经搜索并研究了 Poky 发行版的内核配方(和 类),但我没有找到它使用的机制如何确保将文件部署到启动映像(而不是到根映像中的 /boot 目录)。

感谢任何帮助:)

更新#1

在我的 local.conf 中,我做了:

IMAGE_BOOT_FILES_append = " \
  overlays/3dlab-nano-player.dtbo \
  overlays/adau1977-adc.dtbo \
  ...
"

在我的 rpi3-overlays.bb

do_deploy() {
    install -d ${DEPLOYDIR}/${PN}
    install -m 0664 ${WORKDIR}/*.dtb ${DEPLOYDIR}/${PN}
    install -m 0664 ${WORKDIR}/*.dtbo ${DEPLOYDIR}/${PN}

    touch ${DEPLOYDIR}/${PN}/${PN}-${PV}.stamp
}

使用此映像构建,但文件仍未部署在 /boot 分区中。 使用 RPI_KERNEL_DEVICETREE_OVERLAYS 我得到一个构建错误,因为内核配方试图像 dts 文件一样构建 dtbo 文件。

RPI 映像是使用 sdimage-raspberrypi.wks WIC wks 文件创建的。它包含:

part /boot --source bootimg-partition ...

所以它使用 bootimg-partition.py wic 插件来生成 /boot 分区。它复制由 IMAGE_BOOT_FILES 变量定义的每个文件。

看来你想添加一些devicetree覆盖,所以你需要修改machine configuration and more specifically RPI_KERNEL_DEVICETREE_OVERLAYS variable. IMAGE_BOOT_FILES variable is set in rpi-base.inc

如果您没有定义任何自定义机器或自定义发行版,您可以将其添加到 local.conf:

RPI_KERNEL_DEVICETREE_OVERLAYS_append = " <deploy-path>/<dto-path>"

你可以看到here如何在部署目录中添加文件。

经过数小时的调查后发现,将文件部署到 / 以外的其他分区并不容易。我现在采用了 post 处理脚本的方式来装载最终图像,部署附加文件并卸载它。

# Ensure the first loopback device is free to use
sudo -n losetup -d /dev/loop0 || true

# Create a loopback device for the given image
sudo -n losetup -Pf ../deploy/images/bapi/ba.rootfs.rpi-sdimg

# Mount the loopback device
mkdir -p tmp
sudo -n mount /dev/loop0p1 tmp

# Deploy files
sudo -n cp -n ../../meta-ba-rpi-cm3/recipes-core/rpi3-overlays/files/* tmp/overlays/
sudo -n cp ../../conf/config.txt tmp/config.txt
sudo -n cp ../../conf/cmdline.txt tmp/cmdline.txt

# Unmount the image and free the loopback device
sudo -n umount tmp
sudo -n losetup -d /dev/loop0