问题描述
我使用 buildroot (buildroot-2021.02.1
) 创建了一个基本映像,其中包含一些软件并选择了 RPI 固件以使用相机和一些 RaspBerry Pi 工具:Target packages --> Hardware handling --> Firmware --> ([x] rpi-firmware) --> Firmware to boot
如前所述 {{ 3}}。
但不包括工具 raspistill
、vcgencmd
、...。问题是如何包含它们,为什么不包含它们?
在某个时间点它一定可以正常工作,请参阅:here
更多详情:
>>> 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.elf
和 boot.vfat
(包含使工具工作的 RPI 硬件内容)与图像进行了比较在 buildroot/output/build/rpi-firmware-d016a6eb01c8c7326a89cb42809fed2a21525de5/boot
中,文件 fixup_x.dat
和 start_x.elf
来自那里。所以是根据提到的SO问题。并且没有任何地方表明 RaspBerry Pi 的工具已编译。它们仅位于此 tar 存档中。也许需要额外编译它们,而这个包并不是为了集成这些工具。
解决方法
我想出了解决方案,这可能对以后的参考有用,所以我把解决方案放在这里。
必须区分:
- “固件”(即问题中提到的 tar),在 buildroot 中使用
BR2_PACKAGE_RPI_FIRMWARE=y
打开。这会导致start.elf
和fixup.dat
包含来自此 tar 的正确数据。 tars 也包含所需的二进制文件的事实只是“巧合” - 所需的应用程序被打包为“userland”(请参阅here),如果在 buildroot 项目的根目录中的
# BR2_PACKAGE_RPI_USERLAND is not set
中找到.config
行并将此行替换为 {{ 1}} 应用程序(BR2_PACKAGE_RPI_USERLAND=y
、vcgencmd
、...)正在构建并包含在最终图像中(然而,我在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