summaryrefslogtreecommitdiff
path: root/bsp/raspberry-pi/raspi5/README.md
blob: 6a40a9050969ea2249237b3531939b43e1907d9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# Raspberry Pi 5 BSP 使用说明

[English](README_en.md)

## 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` 中的默认搜索路径为:

```text
/opt/gcc-arm-8.3-2019.03-x86_64-aarch64-elf/bin/
```

推荐通过环境变量指定本机工具链,避免修改仓库文件:

```bash
export RTT_EXEC_PATH=/path/to/aarch64-toolchain/bin
export RTT_CC_PREFIX=aarch64-none-elf-
```

编译脚本优先使用 `-mtune=cortex-a76`;旧工具链不支持时,会依次回退到 `cortex-a73` 或 `generic`。

## 3. 配置与编译

进入 BSP 目录:

```bash
cd bsp/raspberry-pi/raspi5
```

如需调整功能,可先打开配置菜单:

```bash
scons --menuconfig
```

编译 BSP:

```bash
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 启动分区根目录,并命名为:

```text
u-boot.bin
```

本目录的 [`tools/config.txt`](tools/config.txt) 包含 BSP 所需的最小固件配置:

```ini
kernel=u-boot.bin
dtparam=pciex1
```

如果启动分区已经存在 `config.txt`,请合并上述配置,不要直接覆盖其中仍需保留的显示、串口或其他板级设置。

### 4.2 放置 RT-Thread 镜像

使用 SD 卡启动时,将编译生成的 `rtthread.bin` 复制到第一个 FAT 分区的根目录:

```text
<boot partition>/rtthread.bin
```

默认命令使用 U-Boot 的 `mmc 0:1`。如果实际 SD 卡控制器或分区编号不同,请先用以下命令确认:

```text
mmc list
mmc dev 0
part list mmc 0
fatls mmc 0:1
```

## 5. U-Boot 启动

### 5.1 设置公共启动参数

在 U-Boot 控制台设置 RT-Thread 使用的启动参数:

```text
setenv bootargs_rtt 'earlycon cma=8M coherent_pool=2M'
saveenv
```

启动命令会复制固件提供的活动设备树,并更新 `/chosen/bootargs`。不要使用与当前开发板不匹配的静态 DTB 替代该设备树,否则 RP1、PCIe 和板载外设信息可能不完整。

### 5.2 从 SD 卡加载

```text
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
```

如需每次上电自动启动,可在确认手动启动正常后设置:

```text
setenv bootcmd 'run bootrtt'
saveenv
```

### 5.3 从 TFTP 加载

先将 `rtthread.bin` 放到 TFTP 服务器根目录。下面地址仅为示例,请根据实际网络修改:

```text
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:

```text
 \ | /
- 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`

先执行:

```text
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 实机上完成验证。