RK3576 AMP(bus_mcu + RT-Thread)移植实践总结

📅 2026/6/17 20:19:26
RK3576 AMP(bus_mcu + RT-Thread)移植实践总结
RK3576 AMPbus_mcu RT-Thread移植实践总结平台RK3576目标在已有 LinuxBuildroot方案上增加内部bus_mcuCortex-M0 RT-ThreadAMP 能力调试串口UART5 m1GPIO4_B0 / GPIO4_B11500000 8N1一、背景与目标RK3576 除四核 Cortex-A72 外还集成bus_mcuCortex-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. 继续启动 LinuxFIT 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-memoryrk3576-amp.dtsi中为 AMP 预留的内存区域区域名起始地址大小用途amp-shmem478000000x478000004MBAMP 共享内存rpmsg47c000000x47c000004MBRPMSG 通信缓冲区rpmsg-dma480000000x480000001MBRPMSG DMA 池mcu482000000x482000001MBMCU 固件运行区MCU 固件加载地址与 ITS 中一致load0x48200000;// amp_mcu.itsU-Boot 启动时可能出现如下Warn可忽略Sysmem Warn: kernel reserved-memory mcu48200000 is overlap with bus_mcu含义U-Boot 把rtt.bin加载进 DT 预留的 MCU 区域属于正常现象不是内存配置错误。四、关键文件清单4.1 设备树文件作用kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-amp.dtsiAMP 通用节点rockchip-amp、reserved-memory、rpmsg、mailboxkernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-evb1-v10-amp.dtsidual-light 板级 dtsiinclude amp.dtsikernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-evb1-v10-amp.dts板级 dtsuart5 { status disabled; }kernel-6.1/arch/arm64/boot/dts/rockchip/Makefile注册rk3576-evb1-v10-amp.dtb4.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.itsAMP FIT 描述打包 rtt.binlunch 关键项示例RK_AMPy RK_ROOTFSy # AMP 默认关 rootfs需显式打开 RK_UBOOT_CFGrk3576_evb_amp RK_KERNEL_CFGrk3576_evb_amp_defconfig RK_KERNEL_DTS_NAMErk3576-evb1-v10-amp RK_AMP_FIT_ITSamp_mcu.its RK_AMP_RTT_TARGETrk3576-mcu RK_PARAMETERparameter-evb-amp.txt4.3 U-Boot文件作用u-boot/configs/rk3576_evb_amp_defconfig在 evb 配置基础上CONFIG_AMPyU-Bootboard.c中amp_cpus_on()在board_late_init阶段执行从amp 分区读取 FIT 并启动 bus_mcu。4.4 MCURT-Thread文件作用rtos/bsp/rockchip/rk3576-mcu/board/evb/iomux.cUART5 引脚复用rtos/bsp/rockchip/rk3576-mcu/board/evb/defconfigRT_CONSOLE_DEVICE_NAMEuart5device/rockchip/common/scripts/mk-amp.shAMP 编译脚本含交叉编译器路径五、UART5 引脚组与 MCU 调试口RK3576 UART5 有三组复用摘自rk3576-pinctrl.dtsi组TXRXIOMUX 功能号MCU HAL 宏m0GPIO3_D5GPIO3_D49PIN_CONFIG_MUX_FUNC9m1GPIO4_B0GPIO4_B110PIN_CONFIG_MUX_FUNC10m2GPIO2_A5GPIO2_A49PIN_CONFIG_MUX_FUNC9本方案选用 m1硬件已将调试口引到 GPIO4_B0/B1。5.1 内核侧AMP 节点 pinctrlrk3576-amp.dtsirockchip_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 选择 lunchcdrk3576_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.imgMCU 固件修改 iomux.c 后必须重编并重烧boot.img含内核 DTBAMP reserved-memory、uart5 disabled 等uboot.img需CONFIG_AMPy的 defconfig使用 Rockchip 烧录工具或upgrade_tool按分区表更新对应镜像。七、验证方法7.1 U-Boot 阶段正常应看到Handle standalone: bus_mcu at 0x48200000 ... OK若设置了amp_bootoff仅 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。默认未启用 DFSls会报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_AMPy时默认关闭RK_ROOTFS。处理defconfig 增加RK_ROOTFSy。8.3 U-Boot 未加载 MCU原因lunch 非 amp 配置或 U-Boot 非rk3576_evb_amp。处理确认CONFIG_AMPy且存在 amp 分区及 amp.img。8.4 Linux 下/dev/ttyS5报 EIO gic_set_type failed原因amp-irqs中GIC SPI 113UART5划给 AMPLinux 无法配置该中断MCU 仍在运行并占用 UART5与正式 AMP 方案冲突——Linux 不应使用 ttyS5仅测试 m1 硬件时需同时关闭 MCUsetenv 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/B1m1U-Boot 是否有bus_mcu ... OK硬件是否将调试口引到对应测试点8.6 m2 有输出、m1 无输出多为硬件走线不在 m1 引脚或 PB0/B1 仍被其他等占用。本项目在改硬件后 m1 验证通过。九、Linux 与 MCU 串口分工生产配置系统控制台/调试说明LinuxFIQ / 其他 UARTbootargs 中consolettyFIQ0等MCUUART5 m1独占Linuxuart5 disabled切勿在 AMP 正常运行时让 Linux 打开/dev/ttyS5。十、后续可扩展方向RPMSG 应用MCU 侧开启 RPMSG 驱动Linux 用户态通过/dev/rpmsg*或自定义字符设备通信共享内存amp-shmem47800000用于大数据块交换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.itsU-Boot 开启CONFIG_AMP内核引入rk3576-amp.dtsi配置 reserved-memory、rpmsg、mailbox使用rk3576_evb_amplunch注意RK_ROOTFSyMCU 使用UART5 m1同步修改iomux.c与amp.dtsi pinctrlLinux禁用 uart5硬件上解决与 RS485 的引脚冲突分别烧录amp.img与boot.imgMCU 串口1500000连接 GPIO4_B0/B1验证成功的标志U-Boot 打印bus_mcu OKMCU 串口出现 RT-Thread banner 与msh 提示符。文档基于 RK3576 SDK AMP 工程实践整理引脚与分区以实际硬件原理图为准。