RK3576 AMP(bus_mcu + RT-Thread)移植实践总结
RK3576 AMP(bus_mcu + RT-Thread)移植实践总结
平台:RK3576
目标:在已有 Linux(Buildroot)方案上,增加内部bus_mcu(Cortex-M0 + RT-Thread)AMP 能力
调试串口:UART5 m1(GPIO4_B0 / GPIO4_B1,1500000 8N1)
一、背景与目标
RK3576 除四核 Cortex-A72 外,还集成bus_mcu(Cortex-M0),可运行 RT-Thread 等 RTOS,与 Linux 构成AMP(非对称多处理)架构。典型用途:
- 实时控制、低延迟任务
- 通过Mailbox + RPMSG与 Linux 通信
- 独立调试串口(本方案使用 UART5)
本文记录在rk3576板级工程上从零打通 AMP 的完整过程,包括设备树、编译配置、U-Boot 启动、MCU 固件、UART5 引脚选型及常见问题。
二、系统架构概览
┌─────────────────────────────────────────────────────────────┐ │ U-Boot │ │ 1. amp_cpus_on() 从 amp 分区加载 rtt.bin → 0x48200000 │ │ 2. fit_standalone_release("bus_mcu") 释放 MCU 复位/时钟 │ │ 3. 继续启动 Linux(FIT boot.img) │ └─────────────────────────────────────────────────────────────┘ │ │ ▼ ▼ ┌──────────────────┐ ┌──────────────────────────────┐ │ bus_mcu (M0) │ │ Linux (A72 x4) │ │ RT-Thread 4.1 │◄─RPMSG──►│ Buildroot │ │ UART5 调试口 │ Mailbox │ FIQ/其他 UART 控制台 │ └──────────────────┘ └──────────────────────────────┘启动顺序:U-Boot → 加载并启动 MCU → 启动 Linux。MCU 与 Linux 并行运行。
三、内存布局(reserved-memory)
rk3576-amp.dtsi中为 AMP 预留的内存区域:
| 区域名 | 起始地址 | 大小 | 用途 |
|---|---|---|---|
| amp-shmem@47800000 | 0x47800000 | 4MB | AMP 共享内存 |
| rpmsg@47c00000 | 0x47c00000 | 4MB | RPMSG 通信缓冲区 |
| rpmsg-dma@48000000 | 0x48000000 | 1MB | RPMSG DMA 池 |
| mcu@48200000 | 0x48200000 | 1MB | MCU 固件运行区 |
MCU 固件加载地址与 ITS 中一致:
load=<0x48200000>;// amp_mcu.itsU-Boot 启动时可能出现如下Warn(可忽略):
Sysmem Warn: kernel 'reserved-memory' "mcu@48200000" is overlap with "bus_mcu"含义:U-Boot 把rtt.bin加载进 DT 预留的 MCU 区域,属于正常现象,不是内存配置错误。
四、关键文件清单
4.1 设备树
| 文件 | 作用 |
|---|---|
kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-amp.dtsi | AMP 通用节点:rockchip-amp、reserved-memory、rpmsg、mailbox |
kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-evb1-v10-amp.dtsi | dual-light 板级 dtsi,include amp.dtsi |
kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-evb1-v10-amp.dts | 板级 dts,&uart5 { status = "disabled"; } |
kernel-6.1/arch/arm64/boot/dts/rockchip/Makefile | 注册rk3576-evb1-v10-amp.dtb |
4.2 Lunch / 编译配置
| 文件 | 作用 |
|---|---|
device/rockchip/.chips/rk3576/rockchip_rk3576_amp_defconfig | 主 lunch 配置 |
device/rockchip/.chips/rk3576/parameter-evb-amp.txt | 分区表,含amp分区 |
device/rockchip/.chips/rk3576/amp_mcu.its | AMP FIT 描述,打包 rtt.bin |
lunch 关键项示例:
RK_AMP=y RK_ROOTFS=y # AMP 默认关 rootfs,需显式打开 RK_UBOOT_CFG="rk3576_evb_amp" RK_KERNEL_CFG="rk3576_evb_amp_defconfig" RK_KERNEL_DTS_NAME="rk3576-evb1-v10-amp" RK_AMP_FIT_ITS="amp_mcu.its" RK_AMP_RTT_TARGET="rk3576-mcu" RK_PARAMETER="parameter-evb-amp.txt"4.3 U-Boot
| 文件 | 作用 |
|---|---|
u-boot/configs/rk3576_evb_amp_defconfig | 在 evb 配置基础上CONFIG_AMP=y |
U-Bootboard.c中amp_cpus_on()在board_late_init阶段执行,从amp 分区读取 FIT 并启动 bus_mcu。
4.4 MCU(RT-Thread)
| 文件 | 作用 |
|---|---|
rtos/bsp/rockchip/rk3576-mcu/board/evb/iomux.c | UART5 引脚复用 |
rtos/bsp/rockchip/rk3576-mcu/board/evb/defconfig | RT_CONSOLE_DEVICE_NAME="uart5" |
device/rockchip/common/scripts/mk-amp.sh | AMP 编译脚本(含交叉编译器路径) |
五、UART5 引脚组与 MCU 调试口
RK3576 UART5 有三组复用(摘自rk3576-pinctrl.dtsi):
| 组 | TX | RX | IOMUX 功能号 | MCU HAL 宏 |
|---|---|---|---|---|
| m0 | GPIO3_D5 | GPIO3_D4 | 9 | PIN_CONFIG_MUX_FUNC9 |
| m1 | GPIO4_B0 | GPIO4_B1 | 10 | PIN_CONFIG_MUX_FUNC10 |
| m2 | GPIO2_A5 | GPIO2_A4 | 9 | PIN_CONFIG_MUX_FUNC9 |
本方案选用 m1(硬件已将调试口引到 GPIO4_B0/B1)。
5.1 内核侧(AMP 节点 pinctrl)
rk3576-amp.dtsi:
rockchip_amp: rockchip-amp { ... pinctrl-0 = <&uart5m1_xfer>; amp-irqs = /bits/ 64 < GIC_AMP_IRQ_CFG_ROUTE(113, 0xd0, CPU_GET_AFFINITY(3, 0)) /* UART5 */ GIC_AMP_IRQ_CFG_ROUTE(174, 0xd0, CPU_GET_AFFINITY(3, 0)) /* Mailbox */ >; };Linux 侧必须禁用 UART5,避免与 MCU 抢资源:
&uart5 { status = "disabled"; };5.2 MCU 侧(iomux.c)
#ifdefRT_USING_UART5/* uart5_m1: GPIO4_B0(TX), GPIO4_B1(RX) */HAL_PINCTRL_SetIOMUX(GPIO_BANK4,GPIO_PIN_B0,PIN_CONFIG_MUX_FUNC10);HAL_PINCTRL_SetIOMUX(GPIO_BANK4,GPIO_PIN_B1,PIN_CONFIG_MUX_FUNC10);#endif5.3 串口参数
| 项目 | MCU 调试 | Linux 普通 UART |
|---|---|---|
| 设备 | RT-Thread console uart5 | /dev/ttySx |
| 波特率 | 1500000 | 通常 115200 |
| 引脚 | GPIO4_B0/B1 | 视具体 UART 而定 |
5.4 与 UART6 RS485 的冲突(板级注意)
原 evb板 DTS 中使用 GPIO4_B0/B1的配置需要删除。改用 UART5 m1 后需要disabled供mcu使用。
六、编译与烧录
6.1 选择 lunch
cdrk3576_sdk ./build.sh lunch# 选择 rockchip_rk3576_evb_amp_defconfig6.2 全量或分项编译
./build.sh all# 完整固件# 或分项:./build.sh uboot ./build.sh kernel ./build.sh amp# 仅 MCU → 生成 amp.img6.3 烧录要点
| 镜像 | 说明 |
|---|---|
| amp.img | MCU 固件,修改 iomux.c 后必须重编并重烧 |
| boot.img | 含内核 DTB(AMP reserved-memory、uart5 disabled 等) |
| uboot.img | 需CONFIG_AMP=y的 defconfig |
使用 Rockchip 烧录工具或upgrade_tool按分区表更新对应镜像。
七、验证方法
7.1 U-Boot 阶段
正常应看到:
Handle standalone: 'bus_mcu' at 0x48200000 ... OK若设置了amp_boot=off(仅 Linux 测试 UART5 时用),则不会出现上述日志,且 MCU 不会运行。
7.2 MCU 串口(1500000)
连接 GPIO4_B0(TX)、GPIO4_B1(RX)、GND,上电后预期输出:
\ | / - RT - Thread Operating System / | \ 4.1.1 build ... 2006 - 2022 Copyright by RT-Thread team main entry msh >msh >表示 FinSH shell 已就绪,AMP + UART5 调试已打通。
MSH 可用命令示例:help、ps、free、list_device。
默认未启用 DFS,ls会报command not found,属正常。
7.3 Linux 阶段
dmesg|grep-iampdmesg|grep-irpmsgls/sys/bus/rpmsg/devices/RPMSG 框架 probe 成功时,可见virtio_rpmsg_bus: rpmsg host is online等设备节点(应用层 endpoint 需另行开发)。
八、常见问题与排查
8.1arm-none-eabi-gcc not found(编 amp 失败)
原因:RT-Thread 交叉编译器路径未配置。
处理:mk-amp.sh中导出CC,或rtconfig.py指向 SDK prebuilts 工具链。
8.2 无 rootfs.img
原因:RK_AMP=y时默认关闭RK_ROOTFS。
处理:defconfig 增加RK_ROOTFS=y。
8.3 U-Boot 未加载 MCU
原因:lunch 非 amp 配置,或 U-Boot 非rk3576_evb_amp。
处理:确认CONFIG_AMP=y,且存在 amp 分区及 amp.img。
8.4 Linux 下/dev/ttyS5报 EIO +gic_set_type failed
原因:
amp-irqs中GIC SPI 113(UART5)划给 AMP,Linux 无法配置该中断- MCU 仍在运行并占用 UART5
- 与正式 AMP 方案冲突——Linux 不应使用 ttyS5
仅测试 m1 硬件时需同时:关闭 MCU(setenv amp_boot off或清空 amp 分区)、从amp-irqs去掉 113、rockchip_amp status = disabled、去掉 UART6 对 PB0/PB1 的 GPIO 声明。
8.5 MCU 无串口输出
排查顺序:
- 是否重编并烧录amp.img(仅改 boot.img 不够)
- 波特率是否为1500000
- 引脚是否为GPIO4_B0/B1(m1)
- U-Boot 是否有
bus_mcu ... OK - 硬件是否将调试口引到对应测试点
8.6 m2 有输出、m1 无输出
多为硬件走线不在 m1 引脚或 PB0/B1 仍被其他等占用。本项目在改硬件后 m1 验证通过。
九、Linux 与 MCU 串口分工(生产配置)
| 系统 | 控制台/调试 | 说明 |
|---|---|---|
| Linux | FIQ / 其他 UART | bootargs 中console=ttyFIQ0等 |
| MCU | UART5 m1 | 独占,Linux&uart5 disabled |
切勿在 AMP 正常运行时让 Linux 打开/dev/ttyS5。
十、后续可扩展方向
- RPMSG 应用:MCU 侧开启 RPMSG 驱动,Linux 用户态通过
/dev/rpmsg*或自定义字符设备通信 - 共享内存:
amp-shmem@47800000用于大数据块交换 - CoreMark 等:defconfig 已可启用
RT_USING_COREMARK做性能测试 - 恢复 UART6 RS485:为 DE/RE 选用不与 UART5 m1 冲突的 GPIO,并更新 DTS
十一、参考配置摘录
rockchip-amp 节点(节选)
rockchip_amp: rockchip-amp { compatible = "rockchip,amp"; clocks = <&cru FCLK_BUS_CM0_CORE>, ...>, <&cru SCLK_UART5>, <&cru PCLK_UART5>, ...>; pinctrl-0 = <&uart5m1_xfer>; amp-irqs = /bits/ 64 < GIC_AMP_IRQ_CFG_ROUTE(113, 0xd0, CPU_GET_AFFINITY(3, 0)) GIC_AMP_IRQ_CFG_ROUTE(174, 0xd0, CPU_GET_AFFINITY(3, 0)) >; status = "okay"; };amp_mcu.its(节选)
mcu { description = "bus_mcu"; data = /incbin/("rtt.bin"); type = "standalone"; load = <0x48200000>; ... };十二、总结
在 RK3576 evb 板上打通 AMP 的核心步骤:
- 增加amp 分区与amp_mcu.its,U-Boot 开启
CONFIG_AMP - 内核引入rk3576-amp.dtsi,配置 reserved-memory、rpmsg、mailbox
- 使用rk3576_evb_amplunch,注意
RK_ROOTFS=y - MCU 使用UART5 m1,同步修改iomux.c与amp.dtsi pinctrl
- Linux禁用 uart5,硬件上解决与 RS485 的引脚冲突
- 分别烧录amp.img与boot.img,MCU 串口1500000连接 GPIO4_B0/B1
验证成功的标志:U-Boot 打印bus_mcu OK,MCU 串口出现 RT-Thread banner 与msh >提示符。
文档基于 RK3576 SDK + AMP 工程实践整理,引脚与分区以实际硬件原理图为准。
