树莓派4b的uboot编译移植
树莓派4B Raspberry Pi 4代B 8G开发板
USB转串口接在TXD和RXD,交叉接线,也就是GPIO14和GPIO15
官网下载地址:
GitHub - u-boot/u-boot: "Das U-Boot" Source Tree 国外
u-boot: UBoot 是由开源项目PPCBoot发展起来的,ARMboot并入了PPCBoot,和其他一些arch的Loader合称U-Boot 国内
安装下载:
版本使用2022.01版本:
Release v2022.01 · u-boot/u-boot · GitHub
安装依赖项
编译生成u-boot.bin
Windows上直接格式化FAT32
Linux上:删除分区、新建分区、挂载、格式化、挂载分区
rpi4的启动分区依旧是使用FAT32文件系统,并采用如下三阶段启动方式:
因此,Linux内核可以在不需要U-Boot的情况下启动。然而,正如所示,U-Boot提供了许多有用的工具,用于开发和调试嵌入式系统,例如通过网络上的TFTP加载新编译的内核进行测试。这消除了在每次微调和编译之间将内核复制到SD卡的缓慢和痛苦的过程。
同时,由于u-boot中没有预置rpi4的dts文件(device tree source),因此采用了在u-boot运行时动态传入硬件描述dtb(device tree blob)文件的方式,用于u-boot启动时枚举硬件。这里对于rpi来说就是bcm2711-rpi-4-b.dtb文件。
注意:
1、rpi4这里的启动elf文件由start.elf变成了start4.elf,和之前版本的树莓派不同。
2、rpi4b已经把bootcode.bin引导程序固化到板载SPI Boot EEPROM里,没用外部文件。
3、在rpi4上运行过64位u-boot的都知道,如果在config.txt中没有特别指明kernel的位置,那么start.elf(或start4.elf)默认需要并启动的文件是kernel8.img:
kernel8.img:64位的Raspberry Pi 4和Raspberry Pi 4;
kernel7l.img:32位的Raspberry Pi 4(使用LPAE);
kernel7.img:32位的Raspberry Pi 4、Raspberry Pi 3和Raspberry Pi 2(未使用LPAE);
kernel.img:其他版本的树莓派。
?????? bootcode.bin:引导程序。树莓派复位上电时,CPU处于复位状态,由GPU来负责启动系统。GPU首先会启动固化在芯片内部的固件(BootROM代码),读取MicroSD卡中的bootcode.bin文件,并装载和运行bootcode.bin中的引导程序。(树莓派4B已经把bootcode.bin引导程序固化到SPI Boot EEPROM里)。
?????? start4.elf:树莓派4上的GPU固件。bootcode.bin引导程序检索MicroSD卡中的GPU固件,加载固件并启动GPU。
?????? start.elf:树莓派3上的GPU固件。
?????? config.txt:配置文件。GPU启动后读取config.txt配置文件,读取Linux内核映像(比如kernel8.img等)以及内核运行参数等,然后把内核映像加载到共享内存中并启动CPU,CPU结束复位状态开始运行Linux内核。如果在config.txt中没有特别指明kernel的位置,那么start.elf(或start4.elf)默认需要并启动的文件是kernel8.img。
?????? bcm2711-rpi-4-b.dtb: 设备树。由于u-boot中没有预置rpi4的dts文件(device tree source),因此采用了在u-boot运行时动态传入硬件描述dtb(device tree blob)文件的方式,用于u-boot启动时枚举硬件。这里对于rpi4来说就是bcm2711-rpi-4-b.dtb文件。
?????? fixup4.dat:这些是链接器文件,与 start*.elf 列出的文件配对。
3个文件在线下载地址
sudo wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/bcm2711-rpi-4-b.dtb
sudo wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/start4.elf
sudo wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/fixup4.dat
1个文件u-boot是前面生成复制过来即可。
1个文件config.txt创建写入如下内容即可。
?????? 设置 uart _2ndstage = 1会导致第二阶段加载程序(树莓派 4之前的设备上的 bootcode .bin或树莓派 4设备的 EEPROM 中的启动代码)和主固件(start * .elf) `)将诊断信息输出到 UART0 。
enable_gic(仅适用于 Pi 4B)
?????? 在树莓派 4B上,如果将此值设置为 0 ,则中断将使用旧版中断控制器而不是通过 GIC -400路由到 ARM 内核。默认值为" 1"。
config.txt中的启动选项 - 树莓派中文文档 (hackpi.fun)
<第2章>树莓派4B上运行 uboot_rpi_4_deconfig和rpi_arm4_deconfig-CSDN博客
如何让树莓派4上固件的debug日志输出到串口? - 知乎 (zhihu.com)
树莓派uboot配置编译-云社区-华为云 (huaweicloud.com)
Linux交叉编译——树莓派工具链安装_gcc-linaro-arm-linux-gnueabihf-raspbian-CSDN博客