拓冰建站拓冰建站
首页 / 资讯中心 / 正文

在 Digilent Zybo(Zynq-7000)开发板上运行 Zephyr RTOS:U-Boot SPL 初始化、JTAG 烧录与调试指南

在 Digilent ZyboZynq-7000开发板上运行 Zephyr RTOSU-Boot SPL 初始化、JTAG 烧录与调试指南【免费下载链接】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/zephyrZyboZYnq BOard是 Digilent 推出的基于 Xilinx Zynq-7000 AP SoC 的开发板其核心是一颗双核 ARM Cortex-A9 处理器与 7 系列 FPGA 逻辑的紧耦合 SoC。本文基于 Zephyr 仓库中该板级的官方文档与源码完整讲解 Zybo 板在 Zephyr 中的硬件描述、U-Boot SPL 的构建与初始化流程、JTAG 与 microSD 两种烧录方式以及 OpenOCD 调试配置读完你可以独立完成从构建 U-Boot 到跑通hello_world示例并进入调试的全过程。板级概述与 Zephyr 中的定位Zephyr 对 Zybo 的板级支持位于 boards/digilent/zybo 目录板名标识符为zybo。从 board.yml 可以看到其核心定位board: name: zybo full_name: Zybo vendor: digilent socs: - name: xc7z010板级绑定 SOC 型号为xc7z010即 Zynq-7000 家族的 Xilinx Zynq-7010 器件该 SOC 属于 Xilinx Zynq-7000 器件族完整的 SOC 清单定义在 soc/xlnx/zynq7000/soc.yml 中涵盖xc7zxxx系列xc7z010、xc7z015、xc7z020、xc7z030、xc7z035、xc7z045、xc7z100与xc7zxxxs系列xc7z007s、xc7z012s、xc7z014s。从源码结构看Zybo 与 ZedBoard 等基于同族 Zynq-7000 的板级共享同一套 SOC 驱动实现板级目录只需提供器件特定的设备树与差异配置Kconfig.zybo 中config BOARD_ZYBO仅做了select SOC_XC7Z010进一步印证了SOC 通用层 板级配置层的复用关系。在 zybo.yaml 中声明了该板的基本属性identifier: zybo name: Digilent Zybo type: mcu arch: arm toolchain: - zephyr - gnuarmemb ram: 524288 supported: - gpio vendor: digilent其中arch: arm表明它运行在 ARM 应用处理器APU侧supported中当前正式声明的硬件特性为gpio工具链支持 Zephyr SDKzephyr与 GNU Arm Embeddedgnuarmemb两种。设备树解析控制台、LED 与按键Zybo 的设备树主文件是 boards/digilent/zybo/zybo.dts它#include xilinx/zynq7000.dtsi该公共文件位于 dts/arm/xilinx/zynq7000.dtsi并叠加板级差异。几个关键节点如下chosen 节点zybo.dts 第 18–23 行指定了 Zephyr 运行时的关键资源chosen { zephyr,sram sram0; zephyr,console uart1; zephyr,shell-uart uart1; zephyr,ocm ocm_high; };应用代码与数据放在sram0其定义为0x00000000起始的 512 MiBmmio-sram内存节点zybo.dts 第 48–51 行串口控制台与 Zephyr Shell 都使用uart1zephyr,ocm指向ocm_high即 Zynq 的 OCMOn-Chip Memory可用于低延迟场景。用户可见的外设别名与 GPIOzybo.dts 第 53–76 行aliases { led0 ld_mio; sw0 btn4; sw1 btn5; }; leds { compatible gpio-leds; ld_mio: led_mio { gpios psgpio_bank0 7 GPIO_ACTIVE_HIGH; label LD_MIO; }; }; gpio_keys { compatible gpio-keys; btn4: btn4 { gpios psgpio_bank1 18 GPIO_ACTIVE_LOW; label BTN4; zephyr,code INPUT_KEY_0; }; btn5: btn5 { gpios psgpio_bank1 19 GPIO_ACTIVE_LOW; label BTN5; zephyr,code INPUT_KEY_1; }; };即 LED 别名led0对应板上 LD_MIO 指示灯PS 侧 MIO 7高有效sw0/sw1对应板上 BTN4/BTN5 按键MIO 18/19低有效分别映射到输入事件码KEY_0、KEY_1。应用层可直接通过 GPIO 与 Input 子系统的标准接口访问这些设备。串口配置与引脚复用uart1 的节点启用了status okay波特率 115200时钟 100 MHzzybo.dts 第 79–85 行。引脚复用定义在 zybo-pinctrl.dtsi 中pinctrl_uart1_default: uart1-default { mux { groups uart1_10_grp; function uart1; }; conf { groups uart1_10_grp; slew-rate IO_SPEED_SLOW; power-source IO_STANDARD_LVCMOS18; }; conf-rx { pins MIO49; bias-high-impedance; }; conf-tx { pins MIO48; bias-disable; }; };可以看到控制台串口被复用到了MIO48TX/ MIO49RX这一组uart1_10_grp电平标准 LVCMOS18、慢速翻转——接好 USB 转串口线后按 115200 波特率即可看到 Zephyr 启动日志。默认内核配置zybo_defconfig# The GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x) CONFIG_ARM_ARCH_TIMERy CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC325000000 CONFIG_SERIALy CONFIG_CONSOLEy CONFIG_UART_CONSOLEy其中系统时钟设为 325 MHz注释说明了原因Zynq-7000 的全局定时器GTC频率恒为 CPU 频率的一半CPU_3x2x时钟门即对应 650 MHz CPU 主频。为什么需要 U-Boot SPLSoC 初始化问题Zynq-7000 系列 SoC 在上电后不能直接运行裸机应用——PSProcessing System部分的 DDR、时钟、PLL 等需要一段初始化代码先行配置。官方文档给出了可选方案XilinxFSBLFirst Stage Boot LoaderXilinx Vivado 生成的ps_init.tclJTAG 脚本Das U-Boot SPLSecondary Program Loader。本文沿仓库文档的做法采用 U-Boot SPL。构建命令基于 U-Boot v2022.04 版本使用 Zephyr SDK 作为交叉工具链git clone -b v2022.04 https://source.denx.de/u-boot/u-boot.git cd u-boot make distclean make xilinx_zynq_virt_defconfig export PATH/path/to/zephyr-sdk/arm-zephyr-eabi/bin/:$PATH export CROSS_COMPILEarm-zephyr-eabi- export DEVICE_TREEzynq-zybo make要点说明xilinx_zynq_virt_defconfig是 U-Boot 的通用 Zynq-7000 目标配置DEVICE_TREEzynq-zybo指定使用 Zybo 对应的设备树U-Boot 会据此生成板级初始化序列交叉工具链直接使用 Zephyr SDK 自带的arm-zephyr-eabi-前缀无需单独安装 Xilinx 工具链构建产物中后续步骤会用到的两个文件是u-boot/spl/boot.binSPL与u-boot/u-boot.img完整 U-Boot。烧录方式一JTAG 运行 hello_world这是文档给出的主路径适合验证最小系统将板子的启动模式拨到JTAG打开串口终端115200 波特率给板上电或复位按下PS-SRST按钮通过 JTAG 上传并运行 U-Boot SPL完成 Zynq-7000 SoC 初始化随后烧录并运行 Zephyr 应用以hello_world为例west build -b zybo samples/hello_world west flash -b zybo即west build -b zybo 应用目录后执行west flash。此时串口终端应输出*** Booting Zephyr OS vx.xx.x-xxx-gxxxxxxxxxxxx *** Hello World! zyboJTAG 调试器一侧由仓库自带的 OpenOCD 配置接管boards/digilent/zybo/support/openocd.cfg 内容非常简洁——source [find interface/ftdi/digilent-hs1.cfg] transport select jtag source [find target/zynq_7000.cfg]它选择了 Zybo 板载的 FTDI 调试接口digilent-hs1、JTAG 传输方式以及 OpenOCD 的zynq_7000目标。板级的 board.cmake 进一步声明了 runner 参数board_runner_args(openocd --file-typeelf --cmd-reset-halt halt) include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake)含义是west flash/west debug使用 OpenOCD 时以 ELF 文件类型加载镜像并在加载完成后执行halt命令——加载即挂起不自动释放运行便于调试场景下停在入口处单步执行。烧录方式二microSD 卡启动若希望脱离 JTAG、用 SD 卡启动可将文件复制到FAT32 格式化的 microSD 卡中插入 Zybo 的SD MICRO卡槽启动模式拨到SD然后上电u-boot/spl/boot.binU-Boot SPLu-boot/u-boot.imgU-Bootzephyr/zephyr.bin由west build -b zybo samples/hello_world生成的 Zephyr 应用镜像U-Boot 初始化完成后在其控制台加载并跳转运行 Zephyr 应用Zynq fatload mmc 0 0x0 zephyr.bin 817120 bytes read in 56 ms (13.9 MiB/s) Zynq go 0x0 ## Starting application at 0x00000000 ... *** Booting Zephyr OS vx.xx.x-xxx-gxxxxxxxxxxxx *** Hello World! zybo流程解读fatload mmc 0 0x0 zephyr.bin从 SD 卡mmc 0把zephyr.bin读到内存地址0x0与设备树中sram0的起始地址一致说明镜像被设计为从 SRAM 地址 0 执行go 0x0将 PC 置到0x0开始执行随后即可看到 Zephyr 的启动横幅与Hello World! zybo。JTAG 调试示例调试流程与 JTAG 烧录的前置步骤完全相同启动模式拨到 JTAG打开串口终端上电或复位按PS-SRST通过 JTAG 上传并运行 U-Boot SPL 完成 SoC 初始化执行west debug -b zybo构建samples/hello_world后上传并进入调试会话。在你的调试器中单步执行应用后串口终端同样会看到*** Booting Zephyr OS vx.x.x-xxx-gxxxxxxxxxxxx *** Hello World! zybo配合board.cmake中--cmd-reset-halt halt的行为west debug加载 ELF 后目标核处于停止状态可以在 GDB 中定位到 Zephyr 入口逐步观察也可以继续运行让应用在板上跑起来——这正好利用了前文 OpenOCD 配置中加载后挂起的设计。小结Zybo 板级支持的要点回顾要素内容依据文件板名标识zybovendordigilentboard.ymlSoC 器件Xilinx Zynq-7000 系列 xc7z010双核 Cortex-A9 FPGA 逻辑board.yml、soc.yml控制台uart1115200 波特率MIO48/MIO49zybo.dts、zybo-pinctrl.dtsi内存sram0 位于 0x0512 MiB mmio-sramOCM 为ocm_highzybo.dts用户外设LEDled0LD_MIO、按键sw0/sw1BTN4/BTN5zybo.dts默认时钟ARM 架构定时器325 MHzGTC ½ CPU 频率zybo_defconfigSoC 初始化U-Boot v2022.04 SPLDEVICE_TREEzynq-zybodoc/index.rst烧录/调试OpenOCDdigilent-hs1 FTDI 接口 zynq_7000 目标加载后haltsupport/openocd.cfg、board.cmake需要注意的是由于 Zynq-7000 的 PS 侧必须先经过 FSBL/SPL 一类的初始化序列Zybo 上的 Zephyr 应用无法裸机直跑JTAG 路径依赖 JTAG 侧先加载 SPLSD 路径依赖卡中的boot.bin这是使用该板级时必须牢记的前提。【免费下载链接】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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门