rpi-open-firmware:Raspberry Pi的开源VPU侧引导程序

2021-02-25 09:55:12

rpi-open-firmware是RPi VPU的小型固件,能够初始化UART,VPU PLL(PLLC)和ARM本身。它旨在免费替换通常从SD卡加载的股票bootcode.bin。尽管并非绝对必要,但强烈建议暂时使用UART电缆。此外,在ARM上运行的第二阶段链加载程序能够初始化eMMC,FAT和Linux内核。

技术讨论发生在Freenode上的#raspberrypi-internals中。请先使用IRC,然后再随机入侵代码库:-)

所有Broadcom标头均已获得3条款BSD许可证的许可,而我们的代码已获得GPLv2 +的许可。有关更多信息,请参见许可。各种外部项目均在兼容GPL的许可证下得到镜像。

但是,它被无限期保留。我在第37期中撰写了有关当前情况的详细说明。

前提条件是,朱利安·布朗(Julian Brown)的VC4工具链以及arm-none-eabi-工具链(Debian软件包gcc-arm-none-eabi)是必需的。您可以根据需要在Makefile中的CROSS_COMPILE中调整VC4工具链路径,并在arm_chainloader / Makefile中调整ARM路径。贡献者不应该走自己的路。配置完成后,运行buildall.sh。二进制文件位于build / bootcode.bin中,可以将其复制到SD卡中。

macOS的编译类似于GNU / Linux,只保留此处描述的平台勘误表。此处提供了构建ARM工具链的说明。由于默认情况下是符号链接,因此必须手动安装GCC,并且必须使用guile的旧版本(分别是Homebrew软件包gcc-6和guile18)。最后,在运行`buildall.sh'时,将环境变量LIBRARY_PATH设置为/ lib:/ lib64。

固件分为两部分,一部分运行在VC4上,另一部分运行在ARM上。 VC4部分初始化PLLC并将VPU移至其上,然后启动UART。它执行SDRAM初始化,将其映射到0xC0000000(未缓存的别名)。接下来,初始化ARM,并将嵌入式引导程序映射到ARM地址0x0。然后执行arm_chainloader。

ARM链加载程序将初始化eMMC控制器并访问FAT引导分区。 从这里开始,它对Linux内核进行链式加载(由于邮箱的使用,其他负载可能无法正常工作)。 是的,在某些条件下。 您可以在没有固件的情况下引导最低版本的Linux,并使其与UART和eMMC一起使用。 对USB,DMA和以太网的支持正在开发中,对于某些无头系统来说已经足够了。 尽管如此,许多其他外围设备仍需要启动,例如视频。 此外,需要编写电源管理驱动程序。 Alyssa Rosenzweig对固件的贡献,特别是在Linux调试和ARM早期初始化以及修复邮箱支持方面。 David Given最初的LLVM项目被用作开始使用LLVM工具链的基础,然后才转到GCC。