上运行 hello_world)
Zephyr RTOS 移植实战在 Luckfox Pico Ultra WRockchip RV1106上运行 hello_world【免费下载链接】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 RTOS 官方仓库中为 Luckfox Pico Ultra W 开发板构建并运行应用。该开发板基于 Rockchip RV1106Cortex-A7 单核芯片板载 256MB DDR3L 内存是一块低成本微 Linux 开发板。读完本文你将掌握RV1106 在 Zephyr 中的板级支持现状、U-Boot 引导链的必备改造缓存命令与 Thumb 模式修正、Zephyr 应用的构建命令以及通过 TFTP 加载 Zephyr 二进制并启动的完整 U-Boot 操作流程。Luckfox Pico Ultra 开发板实物图板卡概览RV1106 与 Luckfox Pico Ultra WLuckfox Pico Ultra W 是一款低成本的微 Linux 开发板核心芯片为瑞芯微 Rockchip RV1106。该芯片在 Zephyr 仓库中的 SoC 定义为SOC_RV1106属于 Rockchip 家族SOC_FAMILY_ROCKCHIP其层级关系记录在 soc/rockchip/rv1106/Kconfig.socSOC_RV1106选中SOC_SERIES_RV1106SOC_SERIES_RV1106选中SOC_FAMILY_ROCKCHIPSOC默认值为rv1106板级元数据中board.yml 声明了板名pico_ultra、全名Pico Ultra、厂商luckfox以及对应 SoCrv1106pico_ultra.yaml 则声明了标识符、架构arch: arm与工具链zephyr。从 dts/arm/rockchip/rv1106.dtsi 可以看出该 SoC 的关键硬件特征CPU单核 ARM Cortex-A7compatible arm,cortex-a7定时器ARMv8 架构定时器arm,armv8-timer时钟频率 24MHz中断控制器GIC-400arm,gic-400兼容 gic-v2/gic寄存器基址0xff1f1000串口6 路 ns16550 兼容 UARTDW APB 总线寄存器偏移reg-shift 2其中 UART2 位于0xff4c0000内存板载 256MB DDR3L DRAM板级设备树解析boards/luckfox/pico_ultra/pico_ultra.dts 定义了板级设备树它包含 SoC 级设备树rockchip/rv1106.dtsi并做了以下关键配置/dts-v1/; #include rockchip/rv1106.dtsi / { model Luckfox Pico Ultra W; compatible luckfox,pico-ultra-w; chosen { zephyr,sram ddr; zephyr,console uart2; zephyr,shell-uart uart2; }; ddr: ddr0 { /* DDR is initialized by the FSBL before the kernel starts */ compatible mmio-sram; reg 0x0 DT_SIZE_M(256); }; }; cpu0 { clock-frequency DT_FREQ_M(816); }; uart2 { status okay; current-speed 115200; };要点说明chosen节点zephyr,sram指向ddr节点——Zephyr 将 256MB DDR 当作 SRAM 使用由 FSBL/U-Boot 先行初始化zephyr,console与zephyr,shell-uart均指向uart2即 Zephyr 控制台与 shell 都走 UART2。ddr节点reg 0x0 DT_SIZE_M(256)声明从地址 0x0 开始的 256MB 内存区域注释明确指出 DDR 由引导流程FSBL在内核启动前完成初始化。cpu0时钟clock-frequency DT_FREQ_M(816)将 CPU 主频声明为 816MHz。uart2波特率 115200状态为okay。SoC 级 Kconfigsoc/rockchip/rv1106/Kconfig.defconfig还补充了运行所需的底层配置NUM_IRQS默认 160SOC_RESET_HOOK默认开启用于复位钩子SYS_CLOCK_HW_CYCLES_PER_SEC从设备树/timer节点的clock-frequency派生即 24MHz默认启用UART_NS16550_DW8250_DW_APBDW8250/DW APB 串口变体与UART_NS16550_ACCESS_WORD_ONLY仅 32 位字访问配合reg-shift 2使用板级默认 defconfigboards/luckfox/pico_ultra/pico_ultra_defconfig保持极简仅开启串口与控制台CONFIG_SERIALy CONFIG_CONSOLEy CONFIG_UART_CONSOLEy启动前提为什么需要 U-Boot 引导RV1106 是一颗运行 Linux 的应用处理器Cortex-A7其 DDR 控制器、时钟等外设必须由引导程序初始化。Zephyr 的板级文档明确要求运行 Zephyr 之前必须先用 Luckfox SDK 的 U-Boot 完成 RV1106 的初始化。这意味着典型启动链为片上 ROM → FSBL初始化 DDR→ U-Boot加载并跳转→ Zephyr 二进制。从 soc/rockchip/rv1106/soc.c 可以看到 Zephyr 侧对这一引导链的适配——soc_reset_hook会在启动早期把 VBAR向量基址寄存器重新指回 Zephyr 自己的向量表void soc_reset_hook(void) { /* * U-Boot modifies VBAR to point to its own vectors - set it to the Zephyrs vector table. */ uint32_t vbar 0; __set_VBAR(vbar); }此外soc/rockchip/rv1106/mmu_regions.c 定义了 MMU 映射区域将向量表、GIC0xff1f1000及所有 ns16550 串口映射为设备内存static const struct arm_mmu_region mmu_regions[] { MMU_REGION_FLAT_ENTRY(vectors, 0, 0x1000, MT_STRONGLY_ORDERED | MPERM_R | MPERM_X), MMU_REGION_FLAT_ENTRY(gic, 0xff1f1000, 0x3000, MT_STRONGLY_ORDERED | MPERM_R | MPERM_W), MMU_REGION_DT_COMPAT_FOREACH_FLAT_ENTRY(ns16550, MT_DEVICE | MPERM_R | MPERM_W)};修改 U-Boot两个必备补丁默认 U-Boot 无法直接跳转运行 Zephyr需要打两个补丁针对 Luckfox SDK 中的 U-Boot 源码补丁一取消强制 Thumb 模式Luckfox SDK 的 U-Boot 在cmd/boot.c的do_go_exec()中当CONFIG_CPU_V7定义时会把入口地址强制置位 Thumb 位entry | 1这会导致 Zephyr 的 ARM 代码以错误的指令集执行。补丁将其移除直接以原始入口地址跳转--- a/sysdrv/source/uboot/u-boot/cmd/boot.c b/sysdrv/source/uboot/u-boot/cmd/boot.c -21,10 21,6 unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc, char * const argv[]) { -#ifdef CONFIG_CPU_V7 - ulong addr (ulong)entry | 1; - entry (void *)addr; -#endif return entry (argc, argv); }补丁二启用 cache 命令Zephyr 跳转前需要关闭并冲刷 D-Cache/I-Cache见下文启动命令因此 U-Boot 必须启用CONFIG_CMD_CACHE提供dcache/icache命令--- a/sysdrv/source/uboot/u-boot/configs/luckfox_rv1106_uboot_defconfig b/sysdrv/source/uboot/u-boot/configs/luckfox_rv1106_uboot_defconfig -141,3 141,4 CONFIG_SPL_GZIPy CONFIG_ERRNO_STRy # CONFIG_EFI_LOADER is not set CONFIG_CMD_CACHEy补丁应用后按 Luckfox Pico SDK 的官方流程重新编译并烧写 U-Boot 即可。构建 Zephyr 应用以官方示例samples/hello_world为例使用 west 构建west build -b pico_ultra samples/hello_world-b pico_ultra指定目标板对应 boards/luckfox/pico_ultra 目录samples/hello_world为应用源码路径参见 samples/hello_world构建产物中包含zephyr.bin位于 build 目录的zephyr/子目录下后续将通过 TFTP 加载到板端。通过 TFTP 加载并启动 Zephyr板卡上电进入 U-Boot 命令行后依次执行以下操作 dcache off icache off dcache flush icache flush setenv ipaddr 192.168.1.2 setenv serverip 192.168.1.1 tftp 0x0 zephyr.bin go 0x0逐步说明dcache off icache off关闭数据缓存与指令缓存。U-Boot 与 Zephyr 对缓存的维护策略不同跳转前必须关闭避免缓存脏数据干扰 Zephyr 运行。dcache flush icache flush冲刷缓存确保内存中数据的一致性。setenv ipaddr 192.168.1.2设置板端 IP按实际网络环境调整。setenv serverip 192.168.1.1设置 TFTP 服务器宿主机IP。tftp 0x0 zephyr.bin从 TFTP 服务器下载zephyr.bin到内存地址0x0即 DDR 起始地址对应设备树中ddr节点的reg 0x0 DT_SIZE_M(256)。go 0x0跳转到0x0执行 Zephyr。启动成功后串口控制台UART2115200 波特率应输出*** Booting Zephyr OS build v4.3.0-4280-g2f3d729d951a *** Hello World! pico_ultra/rv1106其中pico_ultra/rv1106为板名/SoC 名的组合来自 hello_world 示例对CONFIG_BOARD与CONFIG_SOC的引用。常见问题与排查要点go命令跳转后无输出确认两个 U-Boot 补丁均已应用并重新烧写检查是否已执行dcache/icache off。串口无打印确认使用的是 UART2默认调试串口115200-8-N-1并核对设备树中current-speed 115200的配置。指令集异常Undefined Instruction多半是CONFIG_CPU_V7的 Thumb 位强制未被移除请核对补丁一是否生效。TFTP 传输失败确认宿主机 TFTP 服务与serverip配置正确且zephyr.bin位于 TFTP 根目录。内存地址对齐加载地址使用0x0需与ddr节点起始地址一致若跳转其他地址需同步修改设备树reg定义与 MMU 向量表映射参考 soc/rockchip/rv1106/mmu_regions.c 中MMU_REGION_FLAT_ENTRY(vectors, 0, ...)的映射。小结本文完整还原了 Zephyr 官方文档boards/luckfox/pico_ultra/doc/index.rst中 Luckfox Pico Ultra W 的移植与运行流程从板级/SoC 设备树与 Kconfig 的硬件抽象到 U-Boot 的两处关键改造再到 west 构建与 TFTP 加载启动。这套U-Boot 初始化硬件 Zephyr 接管的双引导方案是 Zephyr 在 Cortex-A 应用处理器如 RV1106上运行的典型模式可作为后续在该板卡上开发串口、网络等外设应用的起点。【免费下载链接】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),仅供参考