☰
RT-Thread Smart 在泰山派 RK3566 开发板上的移植与实战:RK3500 BSP 编译、U-Boot 引导与设备树调试全解
2026/9/25 4:53:38 网站建设 项目流程
  • 操作系统
  • 嵌入式
  • 物联网
  • 嵌入式OS
  • RTOS

【免费下载链接】rt-thread

RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/

项目地址:https://gitcode.com/gh_mirrors/rt/rt-thread
点击查看免费下载

本文以 RT-Thread 仓库中 RK3500 BSP 的泰山派(TaishanPi)RK3566 板级支持说明为主体,完整讲解从宿主机构建环境搭建、RT-Thread Smart 工具链配置、rtthread.bin编译,到基于 Rockchip Linux 5.10 SDK 烧录 U-Boot、用 TF 卡 +boot.scr引导 RT-Thread 上板运行的全过程,并结合 rk3500 BSP 的 Kconfig、rtconfig.py 等源码佐证各步骤背后的实现。读完本文,读者可以在 RK3566 平台上独立跑起 RT-Thread Smart,并掌握"找不到设备树"、"卡在 fiq-debugger 控制台"两类典型启动故障的定位方法。

一、背景:RK3500 BSP 与 RK3566 平台

1.1 RK3566 芯片概况

Rockchip RK3566是中高端AIoT芯片,关键规格如下:

  • 采用22nm制程工艺;
  • 4核Cortex-A55的64位 CPU,主频高达1.8GHz;
  • 集成ARM Mali-G52 GPU;
  • 集成1Tops算力的AI加速器NPU;
  • 支持4K 60FPS/1080P 60FPS视频解码;
  • 支持5M ISP和HDR。

在仓库中,RK3566 与 RK3568、RK3568J 等 SoC 共用bsp/rockchip/rk3500这一套 BSP。RK3500 BSP 的中文说明给出的支持列表与对应earlycon地址如下:

SoC支持情况Earlycon
RK3576支持earlycon=uart8250,mmio32,0x2ad40000
RK3588支持earlycon=uart8250,mmio32,0xfeb50000
RK3562未支持-
RK3568J支持earlycon=uart8250,mmio32,0xfe660000
RK3568支持earlycon=uart8250,mmio32,0xfe660000
RK3566支持earlycon=uart8250,mmio32,0xfe660000
RK3528支持earlycon=uart8250,mmio32,0xff9f0000
RK3506未支持-

注意 RK3566 的 earlycon 地址0xfe660000:后文分析启动日志和 fiq-debugger 设备树时,会反复出现这个地址,它对应板上 Debug 串口(泰山派1 上是uart2m0)。

本文的使用说明基于泰山派1(TaishanPi RK3566)开发板编写,其原理图、PCB 和软件资料均由厂商开源。从 rk3500 的 Kconfig 可以看到这套 BSP 的架构定位:

config SOC_RK3500 bool select ARCH_ARMV8 select ARCH_CPU_64BIT select ARCH_ARM_MMU select RT_USING_CACHE select RT_USING_COMPONENTS_INIT select RT_USING_USER_MAIN select RT_USING_STDC_ATOMIC default y

即它是一个带 MMU 的 64 位 ARMv8 平台,使用组件初始化框架和用户态入口main,并且 Kconfig 通过source引入了bsp/rockchip/dm/下的设备模型(device model)驱动子树,这是 RK3500 BSP 的驱动底座。

1.2 宿主机环境

原文档给出的验证环境为运行在 VMware 中的Ubuntu 22.04.5 LTS Desktop,系统信息与 Python 版本如下:

$ cat /etc/os-release PRETTY_NAME="Ubuntu 22.04.5 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.5 LTS (Jammy Jellyfish)" VERSION_CODENAME=jammy ID=ubuntu ID_LIKE=debian
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy
$ python --version Python 3.10.12

需要说明的是,BSP 的 rtconfig.py 中RTT_ROOT默认取os.getcwd()上三级目录,即要求从rt-thread/bsp/rockchip/rk3500目录下启动构建;工具链定位依赖RTT_EXEC_PATH与RTT_CC_PREFIX环境变量,下文环境搭建正是为这两个变量服务。

二、环境搭建

以下命令在 Ubuntu 22.04 宿主机上依次执行。

2.1 安装必要工具

sudo apt update && \ sudo apt install -y python3 python3-pip u-boot-tools device-tree-compiler

其中u-boot-tools提供mkimage,用于第 3.3 节制作boot.scr;device-tree-compiler提供dtc,在需要反汇编/修改.dtb时用到。

2.2 安装 SCons 构建工具

pip3 install --user tqdm scons

RT-Thread 的整个构建体系由 SCons 驱动:rk3500 的 SConstruct 直接调用tools/building.py中的PrepareBuilding与DoBuilding完成内核、组件、包的分层编译,scons --menuconfig、source ~/.env/tools/scripts/pkgs --update等命令都是这套体系的入口。

2.3 设定 python 版本

sudo rm -rf /usr/bin/python && \ sudo ln -s /usr/bin/python3 /usr/bin/python

2.4 下载并配置 RT-Thread Smart 工具链

从 RT-Thread 官方下载渠道获取aarch64-linux-musleabi的 Linux 交叉工具链(x86_64宿主机版 tar.bz2 包),解压至/opt:

sudo tar -xf aarch64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2 -C /opt

设置环境变量(可直接整段复制粘贴到命令行执行):

export RTT_CC="gcc" export RTT_EXEC_PATH="/opt/aarch64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/" export RTT_CC_PREFIX="aarch64-linux-musleabi-" export PATH="$RTT_EXEC_PATH:$PATH"

从 rtconfig.py 可以看到这些变量的实际消费方式:

  • RTT_CC决定CROSS_TOOL(gcc);
  • RTT_EXEC_PATH决定工具链 bin 目录,SConstruct 会把它PrependENVPath到构建环境的 PATH 最前面;
  • RTT_CC_PREFIX拼出aarch64-linux-musleabi-gcc/ar/ld等具体可执行文件名;
  • 编译参数中DEVICE为-mcpu=cortex-a53(注释里保留了-march=armv8.2-a -mtune=cortex-a55的 Cortex-A55 调优版本),链接参数为-Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors -T link.lds,入口符号是system_vectors;
  • POST_ACTION会用objcopy -O binary从rtthread.elf生成最终的rtthread.bin,并对rtthread.bin计算md5sum——这就是后面放进 TF 卡的那个文件的来源。

三、编译

进入rt-thread/bsp/rockchip/rk3500目录(本 BSP 同时服务 RK3566/RK3568 等平台):

cd rt-thread/bsp/rockchip/rk3500

3.1 menuconfig 生成 .config

进入menuconfig后直接保存退出,即可生成一个.config文件:

scons --menuconfig

建议在菜单中拉取zlib软件包(Packages 列表中的 package zlibc),编译时需要用到。

3.2 拉取软件包并编译

source ~/.env/tools/scripts/pkgs --update

开始编译:

scons -j$(nproc)

也可以通过scons --exec-path="GCC工具链路径"命令,在指定工具链位置的同时直接编译,无需预先 export 环境变量。

编译成功后,当前rk3500目录中会正常生成rtthread.elf、rtthread.bin以及rtthread.map(对应 rtconfig.py 中POST_ACTION定义的objcopy/size/md5sum动作)。

四、上板运行

4.1 为板子烧录基础镜像

由于需要通过U-Boot环境引导rtthread系统,首先要烧录基础镜像。本指南使用的内核来自泰山派1 配套的Rockchip Linux 5.10 SDK:按其《宿主机构建方式》文档编译完成后,会在rockdev/目录下生成所需文件。

先用瑞芯微开发工具将板子的所有镜像擦除:

然后使用瑞芯微开发工具烧录以下 4 个文件:

  • MiniLoaderAll.bin
  • parameter.txt
  • uboot.img
  • boot.img

注意:因为该 SDK 是重新分区的,泰山派1 需要上述 4 个文件;其他板子未测试,可自行尝试。

4.2 格式化 TF 卡

需要准备一张TF卡,用来存放rtthread.bin等文件。使用 Rufus 按如下模式设定(FAT 文件系统)后点击"开始":

4.3 制作 boot.scr

可以直接使用当前目录下的boot.scr,它同样用下述方式制作;如有需要可自行制作。

前面已安装u-boot-tools,创建boot.cmd并写入:

fatload mmc 1:1 0x480000 rtthread.bin; fatload mmc 1:1 0x8300000 tspi-rk3566-user-v10-linux.dtb; booti 0x480000 - 0x8300000;

逐行含义:fatload从 TF 卡(mmc 1:1,即 SD 控制器 1 的第一分区,FAT 文件系统)把rtthread.bin加载到内存0x480000,把设备树tspi-rk3566-user-v10-linux.dtb加载到0x8300000;booti以"内核镜像地址 - 设备树地址"的形式引导(-表示无 initramfs)。

系统启动需要设备树文件DTB。泰山派1 的 dtb 是 SDK 中kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dtb,其他开发板的文件名不同,请按板卡选择。缺少 dtb 时rtthread无法启动,详见后文《常见问题与解决办法》。

运行mkimage生成boot.scr:

mkimage -C none -A arm -T script -d boot.cmd boot.scr

4.4 复制文件到 TF 卡

将下面三个文件复制到 TF 卡中:

  • boot.scr
  • tspi-rk3566-user-v10-linux.dtb
  • rtthread.bin

4.5 串口连接与启动

连接开发板串口(推荐 MobaXterm 等终端工具),打开串口工具、选择对应串口,波特率设为1500000(该速率与设备树中 fiq-debugger 节点注释 "Only 115200 and 1500000" 一致)。

TF 卡中检测到boot.scr后,U-Boot 会自动引导启动rtthread。完整启动日志如下:

Hit key to stop autoboot('CTRL+C'): 0 switch to partitions #0, OK mmc1 is current device Scanning mmc 1:1... Found U-Boot script /boot.scr reading /boot.scr 197 bytes read in 3 ms (63.5 KiB/s) ## Executing script at 00c00000 reading rtthread.bin 1220848 bytes read in 104 ms (11.2 MiB/s) reading tspi-rk3566-user-v10-linux.dtb 167469 bytes read in 17 ms (9.4 MiB/s) Fdt Ramdisk skip relocation No misc partition ## Flattened Device Tree blob at 0x08300000 Booting using the fdt blob at 0x08300000 Using Device Tree in place at 0000000008300000, end 000000000832be2c No resource file: logo_kernel.bmp ** Unable to read file logo_kernel.bmp ** Failed to do_load VP0 fail to load kernel logo vp0, plane_mask:0x3f, primary-id:4, curser-id:-1 vp1, plane_mask:0x0, primary-id:0, curser-id:-1 vp2, plane_mask:0x0, primary-id:0, curser-id:-1 ## reserved-memory: drm-logo@00000000: addr=7df00000 size=ad000 drm-cubic-lut@00000000: addr=7ff00000 size=8000 ramoops@110000: addr=110000 size=f0000 Adding bank: 0x00200000 - 0x08400000 (size: 0x08200000) Adding bank: 0x09400000 - 0x80000000 (size: 0x76c00000) board seed: Pseudo Total: 600.154/648.331 ms Starting kernel ... [I/rtdm.ofw] Booting RT-Thread on physical CPU 0x0 [I/rtdm.ofw] Machine model: lckfb tspi V10 Board [I/rtdm.ofw] Earlycon: uart8250 at MMIO/PIO 0x00000000fe660000 (options '') [I/rtdm.ofw] Memory node(1) ranges: 0x0000000000200000 - 0x0000000008400000 [I/rtdm.ofw] Memory node(1) ranges: 0x0000000009400000 - 0x0000000080000000 [I/mm.memblock] System memory: [I/mm.memblock] [0x0000000000200000, 0x0000000008400000] [I/mm.memblock] [0x0000000009400000, 0x0000000080000000] [I/mm.memblock] Reserved memory: [I/mm.memblock] [0x0000000000110000, 0x0000000000200000] [I/mm.memblock] [0x0000000000480000, 0x00000000006d0000] [I/mm.memblock] [0x00000000006d0000, 0x00000000046d0000] [I/mm.memblock] [0x00000000046d0000, 0x00000000048d0000] [I/mm.memblock] [0x00000000048d0000, 0x00000000048fa000] [I/mm.memblock] [0x0000000008300000, 0x000000000832a000] [I/mm.memblock] [0x000000007df00000, 0x000000007dfad000] [I/mm.memblock] [0x000000007ff00000, 0x000000007ff08000] [I/mm.memblock] physical memory region [0x0000000000200000-0x0000000000480000] installed to system page [I/mm.memblock] physical memory region [0x00000000048fa000-0x0000000008300000] installed to system page [I/mm.memblock] physical memory region [0x000000000832a000-0x0000000008400000] installed to system page [I/mm.memblock] physical memory region [0x0000000009400000-0x000000007df00000] installed to system page [I/mm.memblock] physical memory region [0x000000007dfad000-0x000000007ff00000] installed to system page [I/mm.memblock] physical memory region [0x000000007ff08000-0x0000000080000000] installed to system page [I/mm.memblock] 2055 MB memory installed to system page [I/osi.psci] Using PSCI v1.1 Function IDs [I/clk.rk3568] set cpu_freq to 1800000000 [I/rtdm.ofw] Console: uart0 (fiq-debugger) \ | / - RT - Thread Smart Operating System / | \ 5.2.1 build Jul 30 2025 08:58:40 2006 - 2024 Copyright by RT-Thread team lwIP-2.1.2 initialized! [I/sal.skt] Socket Abstraction Layer initialize success. [I/utest] utest is initialize success. [I/utest] total utest testcase num: (5) [I/drivers.serial] Using /dev/ttyS0 as default console Press any key to stop init process startup ... 3 Press any key to stop init process startup ... 2 Press any key to stop init process startup ... 1 Starting init ... [E/DFS.fs] mount point (/proc) already mounted! [I/rtdm.mnt] File system initialization done Hi, this is RT-Thread!! msh />I/TC: Secondary CPU 1 initializing I/TC: Secondary CPU 1 switching to normal world boot o/[C3:2 mS[eIc/ocnpdua.raya 6C4P]U 2 inCiatlila lcipzui n1g n success I/TC: Secondary CPU 2 switching to normal world boot I/TC: Secondary CPU 3 initializing I/TC: Secondary CPU 3 switching to normal world boot [I/cpu.aa64] Call cpu 2 on success [I/cpu.aa64] Call cpu 3 on success msh /> msh />

从日志可以读出完整的启动链条,与源码一一对应:

  1. [I/rtdm.ofw] Booting RT-Thread on physical CPU 0x0/Machine model: lckfb tspi V10 Board:设备模型层(ofw)解析 U-Boot 传入的 DTB,确认机型。注意Machine model正是 4.1 节烧录的tspi-rk3566-user-v10-linux.dtb中model属性——这反过来说明了"必须使用本板 dtb"的原因。
  2. [I/rtdm.ofw] Earlycon: uart8250 at MMIO/PIO 0x...fe660000:从设备树chosen.bootargs的earlycon=uart8250,mmio32,0xfe660000解析出早期控制台,与 README_ZH.md 中 RK3566 的 earlycon 地址一致。
  3. [I/mm.memblock] 2055 MB memory installed to system page:memblock 依据 DTB 的memory节点与reserved-memory节点(日志中ramoops@110000、drm-logo等)划分系统页与保留内存。
  4. [I/osi.psci] Using PSCI v1.1 Function IDs+ 后文Secondary CPU 1..3 initializing:通过 PSCI 唤醒其余 3 个 A55 核,实现 SMP 多核引导(对应 Kconfig 中ARCH_ARMV8的 SMP 支持)。
  5. [I/clk.rk3568] set cpu_freq to 1800000000:时钟驱动把 CPU 频率设置到 1.8GHz(RK3566 与 RK3568 时钟树同源,故日志前缀为clk.rk3568,其源码在 clk-rk3568.c 所在的dm/clk驱动中)。
  6. [I/rtdm.ofw] Console: uart0 (fiq-debugger):注册 FIQ 调试串口为控制台。该驱动实现位于 fiq-debugger.c,匹配设备树中compatible = "rockchip,fiq-debugger"节点——这也是下一节故障排查的焦点。
  7. lwIP-2.1.2 initialized!、[I/utest]、[I/drivers.serial]等:组件初始化阶段(Kconfig 中select RT_USING_COMPONENTS_INIT使能了组件框架)。
  8. Hi, this is RT-Thread!!:用户入口 main.c 打印,随后 shell(msh)就绪,此时 4 核全部在线。

注意 1:如果卡死在[I/rtdm.ofw] Console: uart0 (fiq-debugger),看下一节《常见问题与解决办法》。

注意 2:每次rtthread启动失败(在 U-Boot 中引导失败后),都应将开发板完全断电再上电,清空内存。

注意 3:如果多次自动引导失败,可在 U-Boot 界面手动执行boot.cmd的三条命令进行手动引导;仍不行则排查 TF 卡质量、拷贝到 TF 卡的文件是否损坏等因素。

五、常见问题与解决办法

5.1 Could not find a valid device tree

未加载.dtb设备树文件直接启动时会出现如下现象:

Hit key to stop autoboot('CTRL+C'): 0 => <INTERRUPT> => <INTERRUPT> => <INTERRUPT> => <INTERRUPT> => <INTERRUPT> => fatload mmc 1:1 0x480000 rtthread.bin reading rtthread.bin 1220848 bytes read in 104 ms (11.2 MiB/s) => booti 0x480000 - 0x8300000 Fdt Ramdisk skip relocation No misc partition ERROR: Did not find a cmdline Flattened Device Tree Could not find a valid device tree =>

原因:booti需要设备树。RK3500 BSP 是"裸机 + 设备模型"架构,board.c 的rt_hw_board_init最终只调用rt_hw_common_setup()初始化设备模型框架,所有 SoC 外设(时钟、串口、内存布局、FIQ 串口)都靠 DTB 描述——因此没有 dtb 就没有可用外设,启动必然失败。

解决方法:将 SDK 中kernel/arch/arm64/boot/dts/rockchip/下编译后的.dtb文件拷贝到 TF 卡,用fatload加载到0x8300000后再次跳转:

fatload mmc 1:1 0x480000 rtthread.bin fatload mmc 1:1 0x8300000 tspi-rk3566-user-v10-linux.dtb booti 0x480000 - 0x8300000

注意:每次启动失败后,同样应完全断电再上电清空内存。

5.2 卡在[I/rtdm.ofw] Console: uart0 (fiq-debugger)无法启动

大概率与设备树有关。设备树中chosen节点和fiq-debugger节点是关键,需要被 BSP 正确读取。参考写法(泰山派1 的 Debug 串口硬件为uart2m0):

chosen { bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0"; }; fiq-debugger { compatible = "rockchip,fiq-debugger"; rockchip,serial-id = <2>; rockchip,wake-irq = <0>; /* If enable uart uses irq instead of fiq */ rockchip,irq-mode-enable = <1>; rockchip,baudrate = <1500000>; /* Only 115200 and 1500000 */ interrupts = <GIC_SPI 252 IRQ_TYPE_LEVEL_LOW>; pinctrl-names = "default"; pinctrl-0 = <&uart2m0_xfer>; status = "okay"; };

各字段含义:

  • chosen.bootargs中的earlycon=uart8250,mmio32,0xfe660000:0xfe660000必须等于该调试串口的 MMIO 基址,与 README.md 支持表中 RK3566 的 earlycon 地址一致;
  • rockchip,serial-id:Rockchip 平台 UART 编号,uart2m0对应<2>;
  • rockchip,baudrate:注释明确只支持115200与1500000两档,与 4.5 节串口工具的设置相互印证;
  • rockchip,irq-mode-enable = <1>:允许以普通 IRQ 模式代替 FIQ 模式工作,兼容性更好;
  • pinctrl-0 = <&uart2m0_xfer>:必须与板级 DTSI 中实际引脚复用一致。

该节点由 fiq-debugger.c 驱动解析注册。从源码结构看,若serial-id、pinctrl或status与实际硬件不符,控制台驱动虽会注册(打印出Console: uart0 (fiq-debugger)),但底层 UART 引脚未复用或寄存器访问错误,输出就会停在该行之后——因此排查顺序应为:先核对model是否为本板 dtb,再核对chosen/fiq-debugger上述字段与原理图一致,必要时用dtc -I dtb -O dts xxx.dtb反编译确认。

六、小结

  • RK3500 BSP(bsp/rockchip/rk3500)以"设备模型 + 设备树"方式支持 RK3566 等 SoC,编译产物rtthread.bin由aarch64-linux-musleabi工具链 + SCons 生成,入口符号system_vectors,链接脚本link.lds;
  • 上板路径:Rockchip Linux 5.10 SDK 烧录 4 个基础镜像 → TF 卡存放boot.scr+ 本板.dtb+rtthread.bin→ U-Boot 自动执行fatload/booti引导 → 设备模型解析 DTB → PSCI 拉起 4 核 → msh 就绪;
  • 两类典型故障(缺 dtb 报Could not find a valid device tree、卡在 fiq-debugger 控制台)的根因都在设备树,修复手段是补齐正确 dtb 并核对chosen.bootargs与fiq-debugger节点参数;
  • 进一步开发可参考 rk3500 中文说明 与bsp/rockchip/dm/下的时钟、framebuffer、以太网、SPI、I2C 等设备驱动源码。
  • 操作系统
  • 嵌入式
  • 物联网
  • 嵌入式OS
  • RTOS

【免费下载链接】rt-thread

RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/

项目地址:https://gitcode.com/gh_mirrors/rt/rt-thread
点击查看免费下载
上一篇:Awesome LLM Apps健康健身智能体:AI个人健康管理师
下一篇:QQ空间说说备份神器:GetQzonehistory 帮你一键保存十年青春记忆

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询