ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Zephyr 在 Radxa ROCK 5B+(RK3588)上的移植与启动实战指南

2026/9/21 16:42:38 拓冰建站 浏览量
Zephyr 在 Radxa ROCK 5B+(RK3588)上的移植与启动实战指南 Zephyr 在 Radxa ROCK 5BRK3588上的移植与启动实战指南【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr本指南以 Zephyr 仓库中 boards/radxa/rock_5b_plus/doc/index.rst 为核心结合板级源码、设备树与 SOC 级实现系统讲解如何为基于 Rockchip RK3588 的单板计算机 Radxa ROCK 5B 构建、配置和引导 Zephyr 固件。读完本文你将掌握 Zephyr 板级支持包的完整结构、UART2 串口控制台配置、8 核 SMP 构建方法以及通过 Radxa U-Boot 的 legacy 镜像加载路径把 Zephyr 跑起来的完整流程。板卡概览RK3588 与 ROCK 5BROCK 5B 是一块以 Rockchip RK3588 为核心的单板计算机SBC。RK3588 是一款大小核异构 SoC集成4 个 Cortex-A76 大核与 4 个 Cortex-A55 小核。该板卡最高可选配32 GB LPDDR5 内存并提供了 eMMC、microSD、PCIe、USB、以太网以及 40-pin 扩展排针等丰富外设接口。在 Zephyr 仓库中该板卡的官方标识为rock_5b_plus其定义位于 boards/radxa/rock_5b_plus/board.ymlvendor: radxaSoC 为rk3588提供名为smp的板级变体variant对应多核启动版本基础板与 SMP 变体均为arm64架构RAM 声明为 131072 KB128 MB与设备树中预留的 DRAM 区一致。从 SOC 层看SOC_RK3588由 soc/rockchip/rk35/rk3588/Kconfig.soc 定义并归属于SOC_SERIES_RK35系列板级 Kconfig boards/radxa/rock_5b_plus/Kconfig.rock_5b_plus 通过select SOC_RK3588完成绑定。注意文档明确说明板载以太网接口目前尚未被 Zephyr 支持。虽然 RK3588 设备树中已描述了两个 dwmac GMAC 节点见 dts/arm64/rockchip/rk3588.dtsi但它们默认处于disabled状态板级 dts 也未启用因此当前阶段不要依赖网口进行开发调试。板级配置结构解析rock_5b_plus板卡目录下的文件组成了一个标准的 Zephyr 板级支持包BSP文件作用board.yml板卡元数据名称、厂商、SoC、变体Kconfig.rock_5b_plus板级 Kconfig 符号绑定 SoCrock_5b_plus.dts板级设备树基础版rock_5b_plus_smp.dtsSMP 变体设备树rock_5b_plus.yaml基础版 hwmv2 描述rock_5b_plus_smp.yamlSMP 变体 hwmv2 描述rock_5b_plus_defconfig基础版默认配置rock_5b_plus_smp_defconfigSMP 变体默认配置设备树console、DRAM 与 UART2基础设备树 rock_5b_plus.dts 首先包含arm64/rockchip/rk3588.dtsi与common/mem.h然后声明model Radxa ROCK 5B; compatible radxa,rock-5b-plus, rockchip,rk3588; chosen { zephyr,console uart2; zephyr,shell-uart uart2; zephyr,sram dram; }; dram: memory10000000 { compatible mmio-sram; device_type memory; reg 0x10000000 DT_SIZE_M(128); }; uart2 { status okay; current-speed 1500000; };关键点chosen节点把zephyr,console与zephyr,shell-uart都指向uart2同时把zephyr,sram指向dram——这就是0x10000000 加载地址的来源Zephyr 镜像被设计为加载并运行在0x10000000设备树在对应地址声明了 128 MB 内存区域UART2 被显式启用并配置为 1.5 Mbit/s这就是文档所述“串口控制台 1.5 Mbit/s”的设备树依据。在 SoC 设备树 dts/arm64/rockchip/rk3588.dtsi 中uart2节点描述为uart2: serialfeb50000 { compatible rockchip,rk3588-uart, ns16550; reg 0xfeb50000 0x100; interrupts GIC_SPI 333 IRQ_TYPE_EDGE IRQ_DEFAULT_PRIORITY; clock-frequency 12000000; reg-shift 2; status disabled; };它兼容ns16550驱动基地址0xfeb50000通过 GICv3 中断控制器接收 SPI 333 中断GIC 位于 dts/arm64/rockchip/rk3588.dtsi地址0xfe600000。板级 dts 将其status改为okay并覆盖波特率串口控制台随即生效。基础版默认配置rock_5b_plus_defconfig 中开启了以下关键项CONFIG_ARM_ARCH_TIMERy # ARM 架构通用定时器 CONFIG_SERIALy # 串口驱动 CONFIG_CONSOLEy # 控制台子系统 CONFIG_UART_CONSOLEy # UART 控制台后端 CONFIG_ARMV8_A_NSy # ARMv8-A 非安全世界 CONFIG_CACHE_MANAGEMENTy # Cache 管理 CONFIG_TICKLESS_KERNELy # 无节拍tickless内核其中CONFIG_ARMV8_A_NSy表明 Zephyr 运行在 ARMv8-A 的非安全Non-Secure世界配合CONFIG_CACHE_MANAGEMENT做缓存管理CONFIG_TICKLESS_KERNELy则让内核在空闲时关闭周期性时钟中断以降低功耗。定时器与 PSCI 依赖见下文 SMP 章节。串口控制台UART2 与 1.5 Mbit/sZephyr 在 ROCK 5B 上使用 UART2 作为串口控制台波特率为 1.5 Mbit/s1500000。这一设置由三处共同决定板级设备树中chosen的zephyr,console uart2与zephyr,shell-uart uart2板级设备树中uart2 { current-speed 1500000; }defconfig 中的CONFIG_UART_CONSOLEy。需要注意的是1.5 Mbit/s 属于非标准波特率实际连接时请确保你的 USB 转串口适配器及终端软件如 minicom、picocom、screen支持该速率并据此配置波特率否则无法正常看到 Zephyr 的启动日志与 shell 输出。从源码结构可以推断该串口驱动走 ns16550 兼容路径reg-shift 2表明寄存器按 4 字节步进访问这些细节在驱动实现中drivers/serial下的 ns16550 驱动会被使用板级无需额外处理。构建 Zephyr 固件标准单镜像构建按照文档给出的标准构建方式以hello_world为例适用于 Unix 主机west build -p always -b rock_5b_plus samples/hello_world构建产物为build/zephyr/zephyr.bin以及对应的zephyr.elf、zephyr.hex等。-p always会先执行 pristine 清理确保构建环境干净。SMP 变体构建启用全部 8 核RK3588 拥有 4 个 Cortex-A55 与 4 个 Cortex-A76 核心SMP 变体支持全部 8 个核心。构建时板卡名写作rock_5b_plus//smpwest build -p always -b rock_5b_plus//smp samples/synchronizationboard.yml中socs[].variants[].name: smp定义了该变体hwmv2 描述文件 rock_5b_plus_smp.yaml 显式声明supported: [smp]。samples/synchronization是多线程同步示例适合在 SMP 环境下观察多核调度行为。SMP 变体的配置差异对比 rock_5b_plus_smp_defconfig 与基础版SMP 变体额外启用了CONFIG_SMPy # 开启对称多处理 CONFIG_MP_MAX_NUM_CPUS8 # 最大 CPU 数为 8 CONFIG_PM_CPU_OPSy # CPU 电源管理操作PSCI其设备树 rock_5b_plus_smp.dts 通过#include rock_5b_plus.dts直接复用基础设备树不重复定义硬件节点。从 SoC 设备树 dts/arm64/rockchip/rk3588.dtsi 可以看到全部 8 个 CPU 节点均已描述cpu0~cpu300为 Cortex-A55cpu400~cpu700为 Cortex-A76且每个节点都使用enable-method psci。PSCI 节点dts/arm64/rockchip/rk3588.dtsi声明为arm,psci-0.2、method smc这正是CONFIG_PM_CPU_OPSy所对接的 CPU 启动/电源管理通道——Zephyr 通过 PSCI SMC 调用唤醒并管理各核心这是 8 核 SMP 得以运行的基础。此外soc/rockchip/rk35/rk3588/Kconfig.defconfig.rk3588 定义了 SoC 级默认参数NUM_IRQS 508对应 RK3588 丰富的 GIC 中断资源系统时钟频率取自设备树/cpus/cpu0的clock-frequency即 24 MHz 的 Cortex-A55 基准频率见 dts/arm64/rockchip/rk3588.dtsi。通过 U-Boot 引导 ZephyrROCK 5B 的常规启动流程由 Radxa U-BootAArch64 Linux 启动路径接管因此需要用legacy U-Boot 镜像Legacy Image打包 Zephyr 固件再由 U-Boot 加载并跳转。第一步生成 legacy 镜像将构建产物zephyr.bin封装为加载地址与入口地址均为0x10000000的 legacy 镜像这与设备树中dram: memory10000000声明的运行区域严格对应mkimage -C none -A arm64 -O linux -a 0x10000000 -e 0x10000000 \ -d build/zephyr/zephyr.bin build/zephyr/zephyr.img参数含义参数含义-C none不压缩负载-A arm64目标架构为 AArch64-O linux操作系统类型标记为 linuxlegacy 镜像约定-a 0x10000000负载应加载到的地址-e 0x10000000入口点地址-d输入数据文件zephyr.bin输出为 zephyr.img第二步准备 FAT 分区与设备树Radxa U-Boot 的 AArch64 Linux 启动路径要求提供 devicetree。请从 Radxa Linux 发行版中获取rk3588-rock-5b-plus.dtb然后将rk3588-rock-5b-plus.dtb与zephyr.img一并拷贝到 U-Boot 可访问的 FAT 分区例如 SD 卡或 eMMC 的 FAT 分区上。第三步查看加载地址环境变量U-Boot 会为临时加载内核与设备树预留地址通过环境变量提供。先查询当前取值printenv kernel_addr_r fdt_addr_r记录输出的kernel_addr_r与fdt_addr_r不同 U-Boot 版本或配置下具体地址可能不同务必以实际打印为准。第四步加载镜像与设备树并 bootm按对应地址加载两个文件并把设备树地址传给bootm-表示跳过 ramdisk。MMC 设备号与分区号需根据实际启动介质调整下面的mmc 1:1表示 MMC 设备 1 的第 1 个分区fatload mmc 1:1 ${kernel_addr_r} zephyr.img fatload mmc 1:1 ${fdt_addr_r} rk3588-rock-5b-plus.dtb bootm ${kernel_addr_r} - ${fdt_addr_r}启动交接原理地址为何如此安排这段流程的背后逻辑值得展开说明bootm读取 legacy 镜像头后会按头部的-a字段把负载从kernel_addr_r搬运到0x10000000再跳转到入口0x10000000执行 ZephyrZephyr 运行时数据区位于0x10000000起的 128 MB 区域内见 rock_5b_plus.dts因此临时镜像、设备树与 Zephyr 运行时区域必须保持分离避免 U-Boot 搬移镜像或 Zephyr 初始化内存时互相覆盖导致启动失败。正是基于这一考虑文档强调“Keeping the temporary image, devicetree, and Zephyr runtime regions separate avoids overwriting any of them during the handoff”——在自定义启动流程如调整kernel_addr_r、改用 TFTP 或 NVMe 加载时务必核对三者地址区间是否重叠。参考资料与延伸阅读板卡文档正文boards/radxa/rock_5b_plus/doc/index.rst板级 BSPboards/radxa/rock_5b_plus/RK3588 SoC 设备树dts/arm64/rockchip/rk3588.dtsiSoC Kconfigsoc/rockchip/rk35/rk3588/Kconfig.defconfig.rk3588官方参考文档Radxa ROCK 5B documentation详见原文References一节关于 RK3588 更详细的硬件手册、引脚复用与 U-Boot 环境说明可查阅 Radxa 官方 ROCK 5B 文档原文链接位于 boards/radxa/rock_5b_plus/doc/index.rst 的 References 部分。【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考