- reorganize common Raspberry Pi drivers under the device framework - add the Raspberry Pi 5 BSP, configuration and documentation - add BCM2712 and DesignWare AXI DMA controller support - distinguish BCM2712 DMA32 and DMA40 channels by channel mask - restore DesignWare AXI DMA enable bits after controller reset - support a shared AXI maximum burst length across DMA channels Signed-off-by: GuEe-GUI <2991707448@qq.com>
6.7 KiB
Raspberry Pi 5 BSP 使用说明
1. 简介
本 BSP 为 Raspberry Pi 5 提供 RT-Thread 64 位板级支持,目标 SoC 为 Broadcom BCM2712(4 核 Cortex-A76),并使用 RT-Thread Device Model 管理板载设备及 RP1 南桥外设。
当前启动流程为:Raspberry Pi 固件加载 U-Boot,U-Boot 再加载 rtthread.bin,并将固件提供的设备树传递给 RT-Thread。BSP 默认启用 SMP,控制台设备为设备树中的 uart10。
2. 准备工作
2.1 硬件
- Raspberry Pi 5;
- microSD 卡及读卡器;
- 3.3 V TTL 串口工具;
- 可选:用于 TFTP 启动的有线网络。
串口电平必须为 3.3 V,请勿直接连接 RS-232 或 5 V 串口。默认波特率为
115200 8N1,关闭硬件和软件流控。
2.2 软件
- Python 3;
- SCons 及 RT-Thread Env 工具;
- AArch64 bare-metal GCC 工具链;
- 适用于 Raspberry Pi 5 的 U-Boot;
- 可选:TFTP 服务器。
默认工具链前缀为 aarch64-none-elf-,rtconfig.py 中的默认搜索路径为:
/opt/gcc-arm-8.3-2019.03-x86_64-aarch64-elf/bin/
推荐通过环境变量指定本机工具链,避免修改仓库文件:
export RTT_EXEC_PATH=/path/to/aarch64-toolchain/bin
export RTT_CC_PREFIX=aarch64-none-elf-
编译脚本优先使用 -mtune=cortex-a76;旧工具链不支持时,会依次回退到 cortex-a73 或 generic。
3. 配置与编译
进入 BSP 目录:
cd bsp/raspberry-pi/raspi5
如需调整功能,可先打开配置菜单:
scons --menuconfig
编译 BSP:
scons -j$(nproc)
Windows 环境可直接使用 scons,或将 $(nproc) 替换为合适的并行任务数。
成功后会生成:
| 文件 | 说明 |
|---|---|
rtthread.elf |
带符号信息的 ELF 文件,用于调试和反汇编 |
rtthread.bin |
U-Boot 实际加载的裸二进制镜像 |
rtthread.map |
链接映射文件 |
rtt.asm |
反汇编结果 |
rtthread.bin 的加载地址为 0x210000,与默认配置中的 ARCH_TEXT_OFFSET 一致,请勿随意修改启动命令中的地址。
4. 准备启动介质
4.1 准备 U-Boot
先准备一张能够由 Raspberry Pi 5 固件正常识别的 microSD 卡。将适用于 Raspberry Pi 5 的 U-Boot 镜像放到 FAT 启动分区根目录,并命名为:
u-boot.bin
本目录的 tools/config.txt 包含 BSP 所需的最小固件配置:
kernel=u-boot.bin
dtparam=pciex1
如果启动分区已经存在 config.txt,请合并上述配置,不要直接覆盖其中仍需保留的显示、串口或其他板级设置。
4.2 放置 RT-Thread 镜像
使用 SD 卡启动时,将编译生成的 rtthread.bin 复制到第一个 FAT 分区的根目录:
<boot partition>/rtthread.bin
默认命令使用 U-Boot 的 mmc 0:1。如果实际 SD 卡控制器或分区编号不同,请先用以下命令确认:
mmc list
mmc dev 0
part list mmc 0
fatls mmc 0:1
5. U-Boot 启动
5.1 设置公共启动参数
在 U-Boot 控制台设置 RT-Thread 使用的启动参数:
setenv bootargs_rtt 'earlycon cma=8M coherent_pool=2M'
saveenv
启动命令会复制固件提供的活动设备树,并更新 /chosen/bootargs。不要使用与当前开发板不匹配的静态 DTB 替代该设备树,否则 RP1、PCIe 和板载外设信息可能不完整。
5.2 从 SD 卡加载
setenv bootrtt 'mmc dev 0; fatload mmc 0:1 0x210000 rtthread.bin; fdt addr ${fdtcontroladdr}; fdt move ${fdt_addr_r} 0x20000; fdt addr ${fdt_addr_r}; fdt resize 8192; setenv bootargs ${bootargs_rtt}; fdt set /chosen bootargs ${bootargs}; booti 0x210000 - ${fdt_addr_r}'
saveenv
run bootrtt
如需每次上电自动启动,可在确认手动启动正常后设置:
setenv bootcmd 'run bootrtt'
saveenv
5.3 从 TFTP 加载
先将 rtthread.bin 放到 TFTP 服务器根目录。下面地址仅为示例,请根据实际网络修改:
setenv bootrtt_tftp 'setenv ethprime eth0; setenv ipaddr 192.168.10.2; setenv serverip 192.168.10.1; setenv netmask 255.255.255.0; ping 192.168.10.1; tftp 0x210000 rtthread.bin; fdt addr ${fdtcontroladdr}; fdt move ${fdt_addr_r} 0x20000; fdt addr ${fdt_addr_r}; fdt resize 8192; setenv bootargs ${bootargs_rtt}; fdt set /chosen bootargs ${bootargs}; booti 0x210000 - ${fdt_addr_r}'
saveenv
run bootrtt_tftp
如果 U-Boot 中的有线网卡名称不是 eth0,可通过 printenv ethact ethprime 或 bdinfo 检查后调整 ethprime。
6. 启动结果
启动成功后,串口应出现 RT-Thread 标志、SMP 初始化信息,随后进入 MSH:
\ | /
- RT - Thread Operating System
/ | \
2006 - 2026 Copyright by RT-Thread team
Hi, this is RT-Thread!!
msh />
实际版本号、构建时间和设备初始化日志会随配置变化。
7. 默认配置
默认 rtconfig.h 启用了以下主要功能。是否能探测到具体设备,仍取决于 Raspberry Pi 固件版本、活动设备树、扩展板和外设连接情况。
| 类别 | 默认配置中的主要支持 |
|---|---|
| CPU | AArch64、4 核 SMP、MMU、Cache、ASID |
| 控制台 | PL011/8250 串口,默认 uart10 |
| 存储 | SDHCI/MMC、FatFs、NVMe over PCIe |
| 网络 | RP1 以太网、PHY、lwIP、DHCP |
| 总线 | PCIe、I2C、SPI、SDIO、Device Tree/OFW |
| RP1 外设 | ADC、PWM、GPIO/Pinctrl、时钟、MFD |
| 系统服务 | RTC、Watchdog、DMA、Thermal、DVFS、Mailbox |
| 多媒体与输入 | I2S Audio、Framebuffer、Touchscreen、Joystick、Keyboard |
| 用户态 | RT-Smart、DFS、POSIX、LWP、动态链接支持 |
8. 常见问题
8.1 U-Boot 找不到 rtthread.bin
先执行:
fatls mmc 0:1
确认文件名、设备号和分区号。Linux 文件名区分大小写。
8.2 Bad Linux ARM64 Image magic! 或跳转后无输出
- 确认加载的是
rtthread.bin,而不是rtthread.elf; - 确认加载及启动地址均为
0x210000; - 确认使用
booti 0x210000 - ${fdt_addr_r}; - 检查串口参数以及设备树中的
stdout-path。
8.3 设备树或 RP1 外设初始化失败
- 确认 Raspberry Pi 固件和 U-Boot 支持 Raspberry Pi 5;
- 确认
config.txt中包含dtparam=pciex1; - 保留并传递固件提供的活动设备树;
- 不要在 U-Boot 中覆盖成其他 Raspberry Pi 型号的 DTB。
8.4 TFTP 下载失败
检查 ipaddr、serverip、netmask、TFTP 根目录、防火墙和网线连接,并先在 U-Boot 中执行 ping ${serverip}。
9. 重新配置后的注意事项
运行 scons --menuconfig 后,配置可能与本文记录的默认 rtconfig.h 不同。提交 BSP 配置变更前,应同时检查生成的 rtconfig.h,并确认新增驱动在 Raspberry Pi 5 实机上完成验证。