尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Zephyr 在 NXP MR-NavQ95B(i.MX95)上的开发实践:异构多核实时固件、外部 Flash 启动与 NETC VSI 以太网共享

发布时间:2026/9/19 21:26:25

资讯中心
01
ARTICLE

Zephyr 在 NXP MR-NavQ95B(i.MX95)上的开发实践:异构多核实时固件、外部 Flash 启动与 NETC VSI 以太网共享

Zephyr 在 NXP MR-NavQ95B(i.MX95)上的开发实践:异构多核实时固件、外部 Flash 启动与 NETC VSI 以太网共享
操作系统嵌入式RTOS物联网【免费下载链接】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点击查看免费下载NXP MR-NavQ95B 是面向移动机器人应用的开源开发板基于 NXP i.MX95 应用处理器将 Cortex-A55 应用核与 Cortex-M7/M33 实时核集成在同一颗 SoC 中。本文以 boards/nxp/mr_navq95b/doc/index.rst 为主线结合仓库内板级源码系统讲解如何在 Zephyr 上为 MR-NavQ95B 的 Cortex-M7 核构建实时固件、从内部 TCM 或外部 Octal SPI NOR Flash 启动运行以及如何在 M7 上通过 NETC VSI 与 A55 上的 Linux 共享一个物理以太网口。读完本文你将掌握该板的完整构建、烧录与异构网络配置流程并理解其板级设备树与启动链路的底层原理。NXP MR-NavQ95B 开发板中央为 i.MX95 处理器区域左侧为千兆以太网接口右侧带散热模组底部为各类扩展排针与 USB 接口。板卡概述与异构多核架构MR-NavQ95B 是 NXP Robotics 推出的开源移动机器人开发板面向需要同时承载高性能应用处理与硬实时控制的机器人场景。其核心价值在于异构多核i.MX95 把不同实时性、不同算力需求的核放在同一颗芯片上让开发者可以用一个 SoC 同时跑 Linux应用/感知/导航与 Zephyr电机控制/传感器采集/实时通信。处理器与内存资源NXP i.MX95 SoC6x Arm Cortex-A55 应用核典型承载 Linux1x Arm Cortex-M7 实时核本文 Zephyr 固件的默认目标1x Arm Cortex-M33 实时核在 NavQ95 镜像中充当系统管理器 System Manager内存资源方面片上 SRAM1376 KiB带 ECC 校验外部 LPDDR516 GiB支持 inline ECC 与加密外部 Flash64 MiB Octal SPI NOR在 Zephyr 中当前支持聚焦于Cortex-M7 核它通常是实时固件的目标。这一点在 mr_navq95b_mimx9596_m7.dts 与 mr_navq95b_mimx9596_m7.yaml 中有清晰体现identifier: mr_navq95b/mimx9596/m7、arch: arm、toolchain: zephyr/gnuarmemb支持的子系统包括 uart、i2c、pwm、spi。板级配置标识board.yml定义了该板在 Zephyr 构建系统中的身份board: name: mr_navq95b full_name: MR-NavQ95B vendor: nxp socs: - name: mimx9596 variants: - name: ddr cpucluster: m7 - name: flash cpucluster: m7从socs.variants可以看出该板在 M7 簇下提供ddr与flash两个变体对应在外部 LPDDR5 中运行和在外部 Flash 中 XIP 运行两种固件形态后文会分别展开。外部扩展与接口复用MR-NavQ95B 由一块基板base board构成可叠加可选扩展模块以增加接口与功能其扩展板与可用外设的总览参见 NXP 提供的官方框图见index.rst的 References 一节。需要注意这些接口是复用的multiplexed具体哪个外设可用取决于 i.MX95 平台的板级配置与 pinmux 设置。这一点在板级 pinctrl 文件中体现为按外设分别定义引脚组例如 mr_navq95b-pinctrl.dtsi 中的lpuart2_default、flexspi_default、flexcan2_default等。串口控制台配置MR-NavQ95B 的默认串口控制台路由到UART2接口有两种物理访问途径通过 I/O 扩展板I/O expansion board上 USB-C 连接器J10的 USB-to-UART 桥接访问或通过主板上专用的 JST-GH 板级连接器J2直接访问 UART2。板级设备树中对应节点为lpuart2mr_navq95b_mimx9596_m7.dts 将其配置如下lpuart2 { status okay; current-speed 115200; pinctrl-0 lpuart2_default; pinctrl-names default; };同时chosen节点把 UART2 同时指定为控制台与 shell 串口zephyr,console lpuart2; zephyr,shell-uart lpuart2;即默认波特率为115200连接 J10 或 J2 后即可看到 Zephyr 的 shell 与日志输出。设备树中还启用了lpuart5同样 115200供其他用途使用。构建与运行 Hello World运行形态总览该板支持两种固件运行形态构建目标名直接区分构建目标固件位置说明mr_navq95b/mimx9596/m7ITCM片上紧耦合内存最小化起步直接由调试器加载运行mr_navq95b/mimx9596/m7/flashMX25UM51345G 外部 Octal SPI NOR配合 MCUboot 由外部 Flash XIP 执行在 ITCM 上构建west build -b mr_navq95b/mimx9596/m7 samples/hello_world/默认非 flash 变体的设备树在chosen中把固件放在 TCM 上运行chosen { /* TCM */ zephyr,flash itcm; zephyr,sram dtcm; zephyr,flash-controller ext_flash_ctrl; zephyr,console lpuart2; zephyr,shell-uart lpuart2; zephyr,canbus flexcan2; };即代码段放在 ITCMzephyr,flash数据段放在 DTCMzephyr,sram同时声明了 FlexSPI 外部 Flash 控制器与默认 CAN 总线flexcan2。配套的 mr_navq95b_mimx9596_m7_defconfig 启用CONFIG_XIPy、串口控制台、GPIO以及通过 SCMI 向 M33 系统管理器请求时钟的CONFIG_ARM_SCMIy与CONFIG_ARM_SCMI_NXP_VENDOR_EXTENSIONSy另外针对 FlexSPI 强制使用 OVRDVALCONFIG_FLASH_MCUX_FLEXSPI_FORCE_USING_OVRDVALy、CONFIG_FLASH_MCUX_FLEXSPI_OVRDVAL27。从外部 Flash 构建west build -b mr_navq95b/mimx9596/m7/flash samples/hello_world/Flash 变体在 mr_navq95b_mimx9596_m7_flash.dts 中覆盖chosen节点把代码分区指向外部 NOR Flash 中的 slot0/ { model NXP MR-NavQ95B NOR flash variant; chosen { zephyr,flash mx25um51345g; zephyr,itcm itcm; zephyr,code-partition slot0_partition; }; };同时其 defconfig 启用 MCUboot 支持CONFIG_BOOTLOADER_MCUBOOTy、CONFIG_MCUBOOT_GENERATE_UNSIGNED_IMAGEy并继续保留CONFIG_XIPy从 Flash 直接执行。上传固件固件上传可通过连接 J7 端口的 Segger/J-Link 探针完成west flashboard.cmake 根据目标变体为 runner 配置了不同参数flash 变体pyocd 目标为--targetmimx95_cm7_mx25um、频率--frequency20M并根据zephyr,code-partition与CONFIG_ROM_START_OFFSET计算 VTOR 后以--flash-opt-O vtoraddr传入J-Link 使用--devicecortex-m7。默认TCM变体pyocd 目标为--targetmimx95_cm7J-Link 同样使用--devicecortex-m7。关于 PyOCD 目标支持的重要说明注意要将固件烧写到外部 Flash需要 PyOCD 支持mimx95_cm7_mx25um目标。截至文档编写时该支持尚未合入主线 PyOCD需按以下步骤手动获取安装 pyocd用于通过板载 JTAG 设备烧写镜像将 pyocd 克隆到任意目录并检出pr-imx95分支git clone https://github.com/NXP-Robotics/pyOCD -b pr-imx95构建安装 pyocdcd pyocd-private python3 -m pip install .推荐的整体运行方式SD 卡镜像 MCUboot官方建议在 SD 卡上安装 NavQ95 镜像构建与烧录说明参见 NXP 的imx-manifest-navq95。该镜像会在启动时初始化 M33 与 A55 核并让 M7 在启动时运行 MCUboot从而从外部 Flash 运行 Zephyr 固件。从外部 Flash 运行时标准启动流程为系统管理器Cortex-M33初始化系统MCUboot被加载到 TCMMCUboot 校验外部 Flash 中的固件固件从 Flash直接执行XIP。这一流程与 Flash 变体的设备树/defconfig 一一对应zephyr,code-partition slot0_partition指向 MCUboot 管理的镜像槽位CONFIG_BOOTLOADER_MCUBOOTy让构建产物可被 MCUboot 签名/校验CONFIG_XIPy保证固件就地执行。Flash 分区布局Flash 变体所依赖的 MX25UM51345G 分区定义在 mr_navq95b_mimx9596_m7.dts 中分区标签地址偏移大小boot_partitionmcuboot0x00000000128 KiBslot0_partitionimage-00x000200007 MiBslot1_partitionimage-10x007200007 MiBstorage_partitionstorage0x00e200002 MiB - 128 KiB分区注释强调分区大小必须与 Flash 扇区大小4 KiB对齐。此外FlexSPI 控制器节点nxp,imx-flexspi-mx25um51345g配置了 120 MHz SPI 时钟、64 MiB 映射范围0x28000000以及 AHB 预取/缓存等优化项ahb-prefetch、ahb-read-addr-opt、ahb-bufferable、ahb-cacheable为 XIP 执行提供硬件基础。DDR 变体除默认 TCM 与 Flash 两种形态外mr_navq95b_mimx9596_m7_ddr.dts 还提供了DDR 变体它删除zephyr,flash属性并把zephyr,sram指向外部 LPDDR5 中 4 MiB 的映射窗口chosen { zephyr,sram ddr; /delete-property/ zephyr,flash; }; ddr: memory80000000 { device_type memory; reg 0x80000000 DT_SIZE_M(4); };对应 defconfig 中CONFIG_XIPn固件加载到内存中执行而非 XIP。该变体适合需要更大 RAM 内存空间的实验性场景。Ethernet在 Linux 旁运行 NETC VSI共享同一物理网口的架构i.MX95 的 NETCENETC以太网控制器由 A55 上的Linux与 M7 上的Zephyr 共享Linux通过 Physical Station InterfacePSI拥有物理端口与 PHY对应网络接口end0ZephyrM7使用 Virtual Station InterfaceVSI——即同一控制器的虚拟功能VFenetc0_vsi1ENETC0 VF1通过该共享端口收发数据。关键约束与分工VF 从属于 PFPhysical Function因此 Linux 必须先创建 VF 并将其移交给 M7M7 才能使用它M7 驱动从不触碰 PHY 或 PF它只启动自己的 station interface并通过 NETC VSI-to-PSI 消息通道请求 PSI 设置其 MAC 过滤。这些约束在板级设备树中有明确体现。在 mr_navq95b_mimx9596_m7.dts 中/* * The NETC block controller (IERB/NETCMIX/PRB) and the ENETC PSIs are owned by * Linux on the Cortex-A55. The M7 only drives ENETC0 VF1 as a VSI, talking to * the Linux PSI over the VSI-to-PSI message channel. */ netc_blk_ctrl { status disabled; }; enetc0_vsi1 { zephyr,random-mac-address; zephyr,mac-address-prefix [00 04 9f]; status okay; }; enetc2_vsi1 { zephyr,random-mac-address; zephyr,mac-address-prefix [00 04 9f]; status okay; };NETC 块控制器IERB/NETCMIX/PRB与 ENETC PSI 归 A55 上的 Linux 所有因此被disabledM7 仅驱动enetc0_vsi1以及预留的enetc2_vsi1作为 VSI两者都使用00:04:9f前缀的随机 MAC 地址。Linux 设备树无需 M7 相关改动Linux 设备树中不需要任何 M7 相关的修改。默认的 NavQ95 Linux 镜像见 NXPimx-manifest-navq95已经启用了 ENETC0 PF 作为带 SR-IOV 支持的end0——这就是全部所需。VF 本身是在运行时动态创建的而不是在设备树中静态描述。在 Linux 侧启动 VF在 A55 上以 root 身份、Linux 启动后执行一次以下步骤其中end0是移交给 M7 作为 VF1 的 ENETC0 PF# 关闭 Linux 的 VF 驱动对 VF 的探测让 M7 独占 VF然后创建 VF0VF1。 echo 0 /sys/class/net/end0/device/sriov_drivers_autoprobe echo 2 /sys/class/net/end0/device/sriov_numvfs # 解析 VF1 的 PCI 地址使其能够 DMA 并触发 MSI-X 中断。 vf$(basename $(readlink -f /sys/class/net/end0/device/virtfn1)) setpci -s $vf COMMAND0x0006 # Bus Master Enable setpci -s $vf CAP_MSIX2.w0x8000:0x8000 # 信任该 VF使 PSI 响应 M7 驱动发出的 MAC 过滤请求。 ip link set end0 vf 1 trust on各命令的作用sriov_drivers_autoprobe0先阻止 Linux 自带 VF 驱动自动绑定 VF避免抢占sriov_numvfs2创建 VF0 与 VF1其中 VF1 被 M7 使用setpci ... COMMAND0x0006使能 VF 的 Bus Master允许其发起 DMAsetpci ... CAP_MSIX2.w0x8000:0x8000使能 MSI-X 功能允许 VF 触发中断ip link set end0 vf 1 trust on将 VF1 标记为受信任PSI 才会接受 M7 驱动设置的 MAC 过滤。完成上述步骤后M7 的 VSI 驱动会检测到 VF 已启用并通过end0接入网络。提示NavQ95 BSP见imx-manifest-navq95自带一个enetc-vsi-handoff-mcore服务会在开机时自动执行这些步骤因此通常无需手动操作。这里展示手动流程是为了自定义场景custom setups的参考。板级构建系统的支撑细节Kconfig 结构Kconfig.mr_navq95b 将三个构建目标统一映射到同一 SoC 型号config BOARD_MR_NAVQ95B select SOC_MIMX9596_M7 if BOARD_MR_NAVQ95B_MIMX9596_M7 || \ BOARD_MR_NAVQ95B_MIMX9596_M7_DDR || \ BOARD_MR_NAVQ95B_MIMX9596_M7_FLASH select SOC_PART_NUMBER_MIMX9596AVZXN板级默认外设板级设备树除串口与网络外还启用了丰富的机器人常用外设可作为实际应用的参考起点SPI 传感器lpspi1上的 InvenSense ICM-45686 六轴 IMU加速度计 ±2g、陀螺仪 ±4000dpsODR 400HzFIFO watermark1lpspi8上的 Bosch BMI088 加速度计与陀螺仪I3Ci3c1以 400 kHz I2C 模式挂载 Bosch BMP581 气压计与 BMM350 磁力计CANflexcan2默认 CAN 总线与flexcan3PWMtpm3/tpm4/tpm5提供多路 PWM可驱动电机或舵机GPIOgpio2、gpio5使能并配置中断输出选择定时器tstmr2启用。这些节点与index.rst中接口复用、取决于板级配置与 pinmux的描述一致开发者可以在 mr_navq95b-pinctrl.dtsi 中查看每个外设对应的引脚组定义。常见问题与排查要点west flash在 flash 变体上报 PyOCD 目标不支持说明本地 PyOCD 缺少mimx95_cm7_mx25um目标需按上文步骤安装 NXP-Roboticspr-imx95分支的 pyocd。M7 以太网不工作先确认 A55 侧已完成 VF 创建与移交sriov_numvfs、Bus Master、MSI-X、trust on并确认end0已 upM7 驱动不会接触 PHY因此 PHY 状态由 Linux 负责。固件不启动或复位循环检查是否安装了 NavQ95 SD 卡镜像以初始化 M33 系统管理器与时钟SCMIM7 的时钟与系统初始化依赖 M33。分区大小修改Flash 中的分区必须与 4 KiB 扇区对齐修改partitions时注意reg的偏移与大小保持对齐。参考NXP MR-NAVQ95 板卡仓库硬件原理图、框图等NXP imx-manifest-navq95SD 卡镜像构建与烧录说明、NavQ95 BSPMR-NavQ95B 扩展板与外设总览框图相关仓库路径速览板级文档boards/nxp/mr_navq95b/doc/index.rst板级设备树mr_navq95b_mimx9596_m7.dtsFlash 变体mr_navq95b_mimx9596_m7_flash.dts 与 mr_navq95b_mimx9596_m7_flash_defconfigDDR 变体mr_navq95b_mimx9596_m7_ddr.dtsRunner 配置board.cmake引脚复用mr_navq95b-pinctrl.dtsi赞分享操作系统嵌入式RTOS物联网【免费下载链接】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 在 NXP i.MX95 EVK 上的多核启动与调试实战指南Zephyr 在 NXP i.MX95 EVK 上的多核启动与调试实战指南 本文以 boards/nxp/imx95_evk/doc/index.rst htt操作系统嵌入式RTOS物联网Zephyr 在 NXP i.MX 943 EVK 上的多核移植与调试指南A55 双簇 SMP、M33/M7 协处理与 NETC 以太网实战Zephyr 在 NXP i.MX 943 EVK 上的多核移植与调试指南A55 双簇 SMP、M33/M7 协处理与 NETC 以太网实战 导读 本文围绕操作系统嵌入式RTOS物联网Zephyr 在 NXP i.MX95 EVK 15x15 开发板上的部署指南硬件特性、A55 启动与编程调试Zephyr 在 NXP i.MX95 EVK 15x15 开发板上的部署指南硬件特性、A55 启动与编程调试 本指南以 Zephyr 仓库中 boards/操作系统嵌入式RTOS物联网创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。