Zephyr 在 NXP S32Z2 上的移植指南:X-S32Z27X-DC (DC2) 板级支持详解
【免费下载链接】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 仓库中boards/nxp/s32z2xxdc2板级定义文档为核心,系统讲解如何面向 NXP X-S32Z27X-DC(DC2)评估板开发与调试 Zephyr 应用。你将掌握该板基于双 RTU(Real-Time Unit,实时单元)× 4 核 Cortex-R52 的硬件资源布局、GPIO pad 到端口/引脚的映射关系、SRAM 启动与双调试器(NXP S32 Debug Probe 与 Lauterbach TRACE32)的完整使用流程,以及 lock-step 与 split-lock 两种核心配置模式下的构建与调试方法。
板级概览:一个 SoC,两个 Zephyr 板目标
X-S32Z27X-DC(简称 DC2)基于 NXP S32Z2 实时处理器(Real-Time Processor)。该 SoC 包含两个 RTU,每个 RTU 由四个 ARM Cortex-R52 核心组成,并支持灵活的 split/lock(分离/锁步)配置。由于 Zephyr 当前移植只支持单核运行,仓库为每个 SoC/RTU 组合提供独立的板目标:
s32z2xxdc2/s32z270/rtu0:面向 S32Z270/RTU0;s32z2xxdc2/s32z270/rtu1:面向 S32Z270/RTU1。
板目标的名称与 SoC 的对应关系定义在 Kconfig.s32z2xxdc2 中:BOARD_S32Z2XXDC2会根据所选 RTU 目标select SOC_S32Z270_RTU0或SOC_S32Z270_RTU1,并固定器件型号SOC_PART_NUMBER_P32Z270ADCK0MJFT。两个板目标的设备树入口分别为 s32z2xxdc2_s32z270_rtu0.dts 与 s32z2xxdc2_s32z270_rtu1.dts,二者共用同一份 SoC 级 dtsi s32z2xxdc2_s32z270.dtsi,仅在内核选择、CAN 总线别名等细节上有所差异。
此外,board.yml 声明了该板的 PCB 修订版本支持:默认修订为 B,同时提供 D 修订。这意味着同一块板卡的不同 PCB 版本需要选用带修订后缀的板目标(见后文"调试"一节)。
硬件资源与连接
支持的硬件特性
根据 s32z2xxdc2_s32z270_rtu0.yaml,该板在 Zephyr 中支持的外设包括:uart、gpio、watchdog、以太网netif:eth、can、spi、counter、adc、i2c、dma、pwm、sent、psi5与crypto,片上 SRAM 为 1024 KB。
Pad 到端口/引脚的映射表
S32Z2 的 SoC pad 为了与 GPIO 驱动及本移植所用的 HAL 驱动保持一致,被分组为端口(port)与引脚(pin)。在配置 GPIO 或为设备驱动配置 pinmux 时,必须依据下表进行 pad 与 port/pin 的换算:
| Pads | 端口/引脚 |
|---|---|
| PAD_000 - PAD_015 | PA0 - PA15 |
| PAD_016 - PAD_030 | PB0 - PB14 |
| PAD_031 | PC15 |
| PAD_032 - PAD_047 | PD0 - PD15 |
| PAD_048 - PAD_063 | PE0 - PE15 |
| PAD_064 - PAD_079 | PF0 - PF15 |
| PAD_080 - PAD_091 | PG0 - PG11 |
| PAD_092 - PAD_095 | PH12 - PH15 |
| PAD_096 - PAD_111 | PI0 - PI15 |
| PAD_112 - PAD_127 | PJ0 - PJ15 |
| PAD_128 - PAD_143 | PK0 - PK15 |
| PAD_144 - PAD_145 | PL0 - PL1 |
| PAD_146 - PAD_159 | PM2 - PM15 |
| PAD_160 - PAD_169 | PN0 - PN9 |
| PAD_170 - PAD_173 | PO10 - PO13 |
需要注意,映射并非连续覆盖所有 port/pin(例如 PC0–PC14、PH0–PH11 等不存在对应 pad),因此在使用 GPIO 或配置 pinmux 时务必以 pad 编号为准反查端口。板级 pinmux 的默认配置见 s32z2xxdc2_s32z270_pinctrl.dtsi,其中定义了emdio_default、eth0_default、canxl0_default、canxl1_default、flexcan0_default、flexcan1_default、qspi0_default等状态节点。
用户 LED 与按键
该板不包含用户 LED 或按键。因此blinky、button这类依赖板载 LED/按键的示例无法直接运行,需要按照示例说明中的步骤自行扩展 GPIO 支持后才能在此板上使用。
系统时钟
Cortex-R52 核心被配置为以 1 GHz 运行。在板级 defconfig s32z2xxdc2_s32z270_rtu0_defconfig 中可看到配套配置:CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000(系统 tick 1 kHz)、CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=8000000(硬件时钟周期频率 8 MHz,对应片上定时器/时钟源),并启用了CONFIG_XIP(从 SRAM 原地执行)、CONFIG_ARM_MPU、CONFIG_SERIAL与CONFIG_CONSOLE。
串口(Serial Port)
SoC 提供 12 个 LINFlexD 实例,可工作于 UART 模式。默认情况下,控制台(console)输出通过 USB micro-B 连接器J119访问。连接后使用任意终端程序监听即可,例如使用跨平台的 pySerial miniterm:
python -m serial.tools.miniterm <port> 115200将<port>替换为开发板对应的串口设备,例如 Linux 下通常是/dev/ttyUSB0,波特率为 115200。
看门狗(Watchdog)
该板的看门狗驱动(SWT,别名watchdog0)目前仅支持定时器到期时触发中断。由于 Zephyr 当前是从 SRAM 运行的,系统复位(reset)并不受支持——即看门狗超时后无法通过复位 SoC 来恢复系统,只能借助中断处理程序进行软件层面的兜底处理。SWT 节点在 s32z2xxdc2_s32z270.dtsi 中被使能(status = "okay")。
以太网(Ethernet)
NETC 驱动支持管理物理站接口PSI0(Physical Station Interface)以及单个虚拟 SI(VSI),其余 VSI 应分配给系统中的其他核心使用。从设备树可见,RTU0 目标使用enetc_psi0,并通过mru0的 mailbox(rx-channels = <1>)接收以太网报文;RTU1 目标则使用mru4。板级 dtsi 中为 PSI0 配置了固定 MAC 地址00 00 00 01 02 00、300 MHz 时钟、MDIO 总线上的 PHY(ethernet-phy@7)以及对应的 pinctrl。关于以太网控制器的完整配置方法,请参考示例nxp_s32_netc(位于 samples/boards/nxp/s32/netc/README.rst)。
CAN 总线
CANEXCEL
CANEXCEL 支持 CAN Classic(CAN 2.0)与 CAN FD 两种模式,但不支持远程传输请求(RTR)。RTU0 目标的zephyr,canbus默认指向canxl0(见 s32z2xxdc2_s32z270_rtu0.dts)。
需要特别注意的是:该板目前并未为 CANEXCEL 端口安装 CAN 收发器。要实现外部通信,需要自行加装与 CAN 2.0 和 CAN FD 协议引脚兼容的 CAN 收发器。
FlexCAN
FlexCAN 同样支持 CAN Classic(CAN 2.0)与 CAN FD 两种模式。RTU1 目标的zephyr,canbus默认指向flexcan0。板级 dtsi 中canxl0、canxl1、flexcan0、flexcan1均配置了默认 pinctrl,其中 FlexCAN 控制器默认使能。
ADC
ADC 由 ADC SAR(逐次逼近型)控制器提供,共2 个实例,每个实例为12 位分辨率。ADC 通道分为两组:精度组(precision)与内部/标准组(internal/standard)。板级 dtsi 中为sar_adc0与sar_adc1统一配置了参考电压vref-mv = <1800>(1.8 V)。
注意:同一个实例的所有通道在同一时刻只能在 1 个组的通道上运行。这意味着不能同时采样同一实例中分别属于两个不同组的通道,设计采样任务时需将通道按组分开调度。
EDMA
EDMA 模块包含四个 EDMA3 实例:实例 0 具有32 通道,实例 1、4、5 各具有16 通道。这些通道可用于内存到内存、外设到内存等 DMA 搬运,支撑串口、SPI、以太网等高速外设的数据流处理。
外部 Flash
板载S26HS512T 512M-bit(64 MB)HyperFlash存储器连接到 QSPI 控制器 A1 端口,本板配置将其选为默认 flash 控制器(zephyr,flash-controller = &s26hs512t)。设备树 s32z2xxdc2_s32z270.dtsi 中完整描述了该 HyperFlash 的时序与电气参数:
- 兼容
nxp,s32-qspi-hyperflash,size = <DT_SIZE_M(512)>; jedec-id、write-block-size = <2>、read-latency-cycles = <16>;max-program-buffer-size = <256>、vcc-mv = <1800>、drive-strength-ohm = <27>;- QSPI 控制器配置为 DDR 数据率、
word-addressable地址模式,并开启 DLL(AUTO UPDATE 模式、外部 DQS 作为接收时钟源)以及 4 个 AHB 主设备缓冲(各 256 字节); - 内部还定义了
storage_partition(partition@0,大小 0x10000)用于存储用途。
需要说明的是:虽然板上存在 HyperFlash,但当前 Zephyr 应用仍只能加载到内部 SRAM执行(见下文"编程与调试"),flash 控制器更多用于后续存储扩展与固件部署规划。
CRYPTO(HSE 硬件安全引擎)
硬件安全引擎(HSE)支持哈希与对称加密运算,具备 ECB、CBC、CTR 模式,使用基于 RAM 的密钥目录(key catalog),支持128 位或 256 位密钥长度。
使用前有一个重要前提:驱动假定 HSE 固件已经被安装并配置完毕(例如密钥目录已格式化、所使用的 MU 实例已激活等)。HSE 固件的安装与配置阶段在《HSE Firmware User Manual》中有文档说明,需联系 NXP 销售人员或分销商获取该文档。
编程与调试(Programming and Debugging)
s32z2xxdc2系列板目标的构建方式与 Zephyr 标准流程一致。目前该板仅支持将 Zephyr 应用二进制加载到核心内部 SRAM 中执行(不支持从外部 flash 启动)。
板级支持两种 West runner:
- NXP S32 Debug Probe(默认);
- Lauterbach TRACE32。
在使用前请先按所选调试工具的安装说明完成环境准备。runner 的具体参数在 board.cmake 中定义,它会把elfFile、rtu=${CONFIG_NXP_S32_RTU_INDEX}、lockstep以及默认--core-name(如R52_<rtu>_0_LS)等参数自动传递给启动脚本。
硬件连接与串口设置
- 将外部调试探针连接到板上的 JTAG 连接器J134,再通过 USB 或以太网(视探针支持而定)连接到主机;
- 将板上的 USB/UART 端口J119连接到主机,运行终端程序监听串口输出,例如:
python -m serial.tools.miniterm /dev/ttyUSB0 115200构建并调试 hello_world
面向s32z2xxdc2/s32z270/rtu0构建并启动调试会话:
west build -b s32z2xxdc2/s32z270/rtu0 samples/hello_world west debug如果你使用的是较新的 PCB 修订版本(默认修订为 B),则需要使用带修订后缀的板目标。例如修订 D:
west build -b s32z2xxdc2@D/s32z270/rtu0 samples/hello_world west debug注意:s32z2xxdc2_s32z270_rtu0_D.overlay与s32z2xxdc2_s32z270_rtu0_B.overlay分别对应两种修订,后者定义了修订差异。
调试会话开始后即可设置断点,并输入c继续运行进入程序。此时终端应输出:
Hello World! s32z2xxdc2使用 Lauterbach TRACE32 调试
如果使用 Lauterbach TRACE32 软件,则运行:
west debug -r trace32该命令会调用 support/startup.cmm 启动脚本。从脚本源码可以看到它执行的关键步骤:复位并初始化 JTAG(40 MHz 时钟、DualPort 使能)、将 RTU 子系统从复位中释放(MC_ME 相关寄存器操作)、初始化 RTU SRAM、根据lockstep参数写 CFG_CORE 的 SPLT_LCK 位、将 ELF 加载到 EAXI(SRAM)地址空间,并把 PC 设置为__start。
烧录(Flashing)
如果只想把应用下载到板载 SRAM 并直接运行,可使用flash命令。flash命令目前仅由 Lauterbach TRACE32 runner 支持:
west build -b s32z2xxdc2/s32z270/rtu0 samples/hello_world west flash -r trace32说明:Lauterbach 启动脚本在执行flash与debug时所做的事情相同(初始化 SoC、把应用加载到 SRAM),区别在于flash会隐藏 TRACE32 界面、直接运行应用并退出。
如果想用 NXP S32 Debug Probe runner 模拟类似行为,可以运行带 GDB 批处理模式的debug命令:
west debug --tool-opt='--batch'RTU 与核心配置(Lock-step / Split-lock)
本 Zephyr 移植只能运行单核,且只能运行在任意一个 Cortex-R52 核心上,支持 lock-step(锁步)或 split-lock(分离锁步)两种模式。默认情况下,Zephyr 运行在所选择 RTU 的第一个核心(core 0),并采用lock-step 模式——这也是芯片的复位默认配置。在 lock-step 模式下,Core0/Core2 与 Core1/Core3 分别组成冗余锁步对。
- 若要以split-lock 模式构建,需要在应用 Kconfig 中禁用
CONFIG_DCLS。 - 板级配置会依据构建配置自动设置 runner 参数(见 board.cmake:启用
CONFIG_DCLS时向 trace32 传入lockstep=yes、向 nxp_s32dbg 传入--core-name R52_<rtu>_0_LS;禁用时分别传入lockstep=no与R52_<rtu>_0)。
如需调试非默认核心,使用--core-name参数:
- lockstep 配置下:
west debug --core-name='R52_<rtu_id>_<core_id>_LS'- split-lock 配置下:
west debug --core-name='R52_<rtu_id>_<core_id>'其中:
<rtu_id>:从零开始的 RTU 索引(0 或 1);<core_id>:相对于所在 RTU 的核心索引(0、1、2 或 3)。
例如,以 split-lock 配置构建并运行于 RTU0 的第二个核心(core 1):
west build -b s32z2xxdc2/s32z270/rtu0 samples/hello_world -DCONFIG_DCLS=n west debug --core-name='R52_0_1'如果使用 Lauterbach TRACE32,所有 runner 参数必须从命令行显式覆盖:
west debug -r trace32 --startup-args elfFile=<elf_path> rtu=<rtu_id> core=<core_id> lockstep=<yes/no>其中<elf_path>为输出目录下 Zephyr 应用 ELF 的路径。在 startup.cmm 中可以看到这些参数的默认值与取值范围:rtu有效值为 0/1(默认 0),core有效值为 0–3(默认 0),lockstep默认yes;同时脚本会根据 RTU 选择不同的启动地址与 CFG_CORE 配置地址(RTU0:0x79900000/0x76120000;RTU1:0x7D900000/0x76920000),并校验 ELF 路径与参数合法性。
小结
X-S32Z27X-DC(DC2)是 Zephyr 在 S32Z2 安全实时处理器上的重要参考平台:双 RTU × 4 核 Cortex-R52 的架构、1 GHz 主频、12 路 LINFlexD UART、CANEXCEL/FlexCAN、双 SAR ADC、四实例 EDMA、HyperFlash 以及 HSE 安全引擎,覆盖了实时控制、车载通信与功能安全场景的核心外设。开发时请牢记三个关键点:当前仅支持 SRAM 运行与单核调试、RTU0/RTU1 需选用独立板目标、lock-step 与 split-lock 通过CONFIG_DCLS切换并配合--core-name选择目标核心。相关的设备树、pinctrl、defconfig 与调试脚本均可在boards/nxp/s32z2xxdc2目录下继续深入研究。
【免费下载链接】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),仅供参考