树莓派“工具”raspistill、vcgencmd 等不包含在 buildroot 中

问题描述

我使用 buildroot (buildroot-2021.02.1) 创建了一个基本映像,其中包含一些软件并选择了 RPI 固件以使用相机和一些 RaspBerry Pi 工具:Target packages --> Hardware handling --> Firmware --> ([x] rpi-firmware) --> Firmware to boot 如前所述 {{ 3}}。

但不包括工具 raspistillvcgencmd、...。问题是如何包含它们,为什么不包含它们?

在某个时间点它一定可以正常工作,请参阅:here

更多详情:

buildroot 的日志中显示以下几行:

>>> rpi-firmware d016a6eb01c8c7326a89cb42809fed2a21525de5 Installing to target
comm: /home/ich/br/buildroot/output/build/rpi-firmware-d016a6eb01c8c7326a89cb42809fed2a21525de5/.files-list.before: No such file or directory
comm: /home/ich/br/buildroot/output/build/rpi-firmware-d016a6eb01c8c7326a89cb42809fed2a21525de5/.files-list-staging.before: No such file or directory
comm: /home/ich/br/buildroot/output/build/rpi-firmware-d016a6eb01c8c7326a89cb42809fed2a21525de5/.files-list-host.before: No such file or directory

在这个包中,二进制文件是存在的。它们是从 RaspberryPi camera with buildroot 下载的,其中 tars 包含实际的工具。但是它们不会被 buildroot 复制到最终映像中,而只是下载。正如错误消息所指出的那样,可能是因为缺少某些 files-list.txt 文件。也许这些文件将要复制的文件列入白名单。但我找不到关于此的文档。

对于 64 位构建,无法执行(然后手动下载的)tar 文件中的二进制文件,因为它们是 32 位可执行文件firmware-d016a6eb01c8c7326a89cb42809fed2a21525de5/opt/vc/bin/vcgencmd: ELF 32-bit LSB executable,ARM,EABI5 version 1 (SYSV),dynamically linked,interpreter /lib/ld-linux.so.3,for GNU/Linux 3.1.9,not stripped;在使用 buildroot 的 32 位构建上它也不起作用,因为缺少共享库,即使存档中的完整结构已像标准 RPI 映像一样放在 /opt/vc/{bin|lib|...} 下。

我不确定如何处理问题、诊断并解决问题。

编辑:也许这是两个不同的问题;我再次阅读了链接的 SO 问题,并将构建映像的 fixup.dat 中的文件 start.elfboot.vfat(包含使工具工作的 RPI 硬件内容)与图像进行了比较在 buildroot/output/build/rpi-firmware-d016a6eb01c8c7326a89cb42809fed2a21525de5/boot 中,文件 fixup_x.datstart_x.elf 来自那里。所以是根据提到的SO问题。并且没有任何地方表明 RaspBerry Pi 的工具已编译。它们位于此 tar 存档中。也许需要额外编译它们,而这个包并不是为了集成这些工具。

解决方法

我想出了解决方案,这可能对以后的参考有用,所以我把解决方案放在这里。

必须区分:

  • “固件”(即问题中提到的 tar),在 buildroot 中使用 BR2_PACKAGE_RPI_FIRMWARE=y 打开。这会导致 start.elffixup.dat 包含来自此 tar 的正确数据。 tars 也包含所需的二进制文件的事实只是“巧合”
  • 所需的应用程序被打包为“userland”(请参阅​​here),如果在 buildroot 项目的根目录中的 # BR2_PACKAGE_RPI_USERLAND is not set 中找到 .config 行并将此行替换为 {{ 1}} 应用程序(BR2_PACKAGE_RPI_USERLAND=yvcgencmd、...)正在构建并包含在最终图像中(然而,我在 raspistill 中找不到位置,但是这没问题,如果你直接修改vars)

因此,问题得到了解答。 但是:您可能会遇到一些问题;-) :


问题 1:运行 make menuconfig 时出现“分段错误”

对于raspistill,您可能会离开:

raspistill -o i.jpg

(带有空图像文件),请参阅 here 了解详情。

答案:这与缺少用于相机控制/视频解码“东西”的 mmal: mmal_vc_shm_init: could not initialize vc shared memory service mmal: mmal_vc_component_create: failed to initialise shm for 'vc.camera_info' (7:EIO) mmal: mmal_component_create_core: could not create component 'vc.camera_info' (7) mmal: Failed to create camera_info component Segmentation fault (或 /dev/vcsm)有关。如网络上某处所述,符号链接到 /dev/vcsm-csa 无济于事。

解决方案:我使用最新的 BR 和内核 5.10.x(/dev/vc-mem 并简单地“降级”到 buildroot-2021.02.1,重建它并出现 buildroot-2020.02.1一切正常。

问题 2:我想在 docker 容器中进行

答案:没问题。我使用了 /dev/vcsm(如建议的 here),它通过运行 balenalib/rpi-raspbian:latest 完美运行。为此,只需要合适的设备和支持。所以包 docker run --privileged --device=/dev/vchiq --rm -it balenalib/rpi-raspbian:latest 可以完全省略。

问题 3:它适用于 64 位吗?

答案: 否。我尝试了 buildroot 的最新版本 (BR2_PACKAGE_RPI_USERLAND=y) 和 2020 年 2 月的版本,以及 raspberrypi3_64_defconfig(或 {{1 }}) 不见了。 /dev/vcsm