当前位置: 首页 > news >正文

ZynqMP SD卡启动全记录:从Vivado配置到Linux命令行(基于黑金AXU2CGB板)

ZynqMP SD卡启动实战指南:黑金AXU2CGB开发板全流程解析

当一块崭新的ZynqMP开发板摆在面前,如何快速搭建完整的启动环境往往是开发者面临的第一个挑战。不同于传统嵌入式系统,ZynqMP的异构架构和多重启动阶段让许多初次接触的工程师感到困惑。本文将基于黑金AXU2CGB开发板,详细拆解从硬件配置到Linux系统启动的完整流程,特别针对SD卡启动这一常见场景提供可复现的操作指南。

1. 开发环境准备与硬件配置

工欲善其事,必先利其器。在开始ZynqMP的启动流程前,需要确保开发环境配置正确。推荐使用Vivado和Vitis 2021.2版本工具链,这是目前对ZynqMP支持较为稳定的版本组合。

1.1 Vivado工程关键配置

在Vivado中创建新工程时,需要特别注意以下几个核心配置:

# 板级预设选择(适用于黑金AXU2CGB) set_property board_part blackgold:axu2cgb:part0:1.0 [current_project]

硬件设计中必须包含以下基本外设:

  • SD1控制器:用于SD卡启动介质
  • QSPI Flash:可选备用启动设备
  • UART1:调试信息输出
  • 千兆以太网:网络启动和调试
  • DDR控制器:配置与开发板匹配的DDR参数

特别注意:黑金AXU2CGB开发板使用了两片MT40A512M16LY-075E内存芯片,在配置DDR时需要设置正确的时序参数:

参数项推荐值
Memory PartMT40A512M16
Memory Speed1066MHz
CAS Latency15
tRFC350ns

1.2 生成硬件描述文件

完成硬件设计后,需要生成.xsa(Xilinx Support Archive)文件,这是后续软件开发的基石。在生成过程中:

提示:务必勾选"Include bitstream"选项,否则生成的.xsa文件将不包含硬件比特流信息,导致后续步骤失败。

2. 启动组件编译与集成

ZynqMP的启动过程比传统Zynq更为复杂,涉及多个固件组件的协同工作。理解每个组件的作用至关重要。

2.1 关键启动组件解析

完整的启动链包含以下组件:

  1. PMU固件:电源管理单元固件,负责芯片上电时序
  2. FSBL:第一级启动加载器
  3. ARM Trusted Firmware:提供安全监控环境
  4. U-Boot:通用引导加载程序
2.1.1 编译PMU固件

在Vitis中创建Platform Management Unit工程时,需要特别注意PMU配置:

// 典型PMU配置参数 #define PMU_GLOBAL_CFG (PMU_GLOBAL_CFG_SWDT_ENABLE | \ PMU_GLOBAL_CFG_WDT_ENABLE | \ PMU_GLOBAL_CFG_TTC_ENABLE)
2.1.2 生成FSBL

FSBL编译过程中常见的两个问题:

  • DDR初始化失败:检查Vivado中的DDR配置
  • QSPI Flash识别错误:确认Flash型号是否正确设置

2.2 ARM Trusted Firmware编译

ATF(ARM Trusted Firmware)为系统提供安全监控环境,编译时需要明确指定平台:

make CROSS_COMPILE=aarch64-linux-gnu- PLAT=zynqmp RESET_TO_BL31=1

关键参数说明

  • RESET_TO_BL31=1:指定BL31作为初始执行入口
  • DEBUG=1:调试时可添加此参数生成带调试信息的版本

3. U-Boot定制与设备树修改

3.1 为黑金开发板适配U-Boot

虽然可以使用官方ZCU100的预设配置,但为了获得最佳兼容性,建议针对AXU2CGB进行定制:

# 使用ZCU100配置作为基础 make CROSS_COMPILE=aarch64-linux-gnu- xilinx_zynqmp_virt_defconfig # 关键设备树修改点 &sdhci1 { status = "okay"; disable-wp; # 黑金开发板SD卡槽无写保护检测 xlnx,mio-bank = <0x1>; };

3.2 设备树关键配置项

黑金AXU2CGB开发板需要特别注意以下设备树配置:

节点必需配置说明
&gem3phy-mode = "rgmii-id"以太网PHY接口模式
&uart1cts-override禁用硬件流控
&sdhci1disable-wp禁用写保护检测
/memoryreg = <0x0 0x0 0x0 0x7ff00000>2GB DDR地址空间

4. 制作SD卡启动镜像

4.1 BOOT.bin生成详解

在Vitis中创建启动镜像时,需要正确配置bif文件:

//arch = zynqmp; split = false; format = BIN the_ROM_image: { [bootloader]fsbl.elf [pmufw_image]pmu.elf [destination_cpu=a53-0, exception_level=el-3]bl31.elf [destination_cpu=a53-0, exception_level=el-2]u-boot.elf }

注意:组件顺序必须严格遵循上述排列,任何错位都可能导致启动失败。

4.2 SD卡分区与文件布局

一个典型的可启动SD卡应包含以下内容:

/dev/sdb1 (FAT32, 256MB) # 启动分区 ├── BOOT.bin ├── boot.scr ├── Image.gz └── system.dtb /dev/sdb2 (EXT4, 剩余空间) # 根文件系统分区

使用以下命令准备SD卡:

# 分区设置 sudo fdisk /dev/sdb << EOF n p 1 +256M n p 2 t 1 c w EOF # 格式化分区 sudo mkfs.vfat -F 32 /dev/sdb1 sudo mkfs.ext4 /dev/sdb2

5. 启动脚本与内核参数配置

5.1 boot.cmd脚本编写

针对黑金开发板的典型启动脚本:

# 设置内核启动参数 setenv bootargs "earlycon console=ttyPS0,115200n8 clk_ignore_unused root=/dev/mmcblk0p2 rw rootwait" # 加载内核和设备树 load mmc 0:1 ${kernel_addr_r} Image.gz load mmc 0:1 ${fdt_addr_r} system.dtb # 启动内核 booti ${kernel_addr_r} - ${fdt_addr_r}

使用mkimage工具将脚本转换为boot.scr:

mkimage -C none -A arm -T script -d boot.cmd boot.scr

5.2 常见启动问题排查

当系统无法正常启动时,可按以下步骤排查:

  1. 检查PMU状态:U-Boot中运行pmufw命令查看PMU固件状态
  2. 验证DDR初始化:FSBL阶段串口输出应显示DDR初始化成功
  3. 确认SD卡识别:U-Boot中使用mmc list检查SD卡是否被识别
  4. 检查文件加载:使用fatload命令手动尝试加载内核文件

6. 网络配置与远程调试

6.1 以太网PHY配置

黑金AXU2CGB使用RTL8211E PHY芯片,需要在设备树中正确配置:

&gem3 { phy-handle = <&phy1>; phy-mode = "rgmii-id"; phy1: ethernet-phy@1 { reg = <1>; ti,rx-internal-delay = <0x8>; ti,tx-internal-delay = <0xa>; }; };

6.2 TFTP网络启动配置

对于频繁调试的场景,可以配置网络启动:

# 设置服务器IP和开发板IP setenv serverip 192.168.1.100 setenv ipaddr 192.168.1.50 # TFTP加载内核 tftp ${kernel_addr_r} Image.gz tftp ${fdt_addr_r} system.dtb # 启动内核 booti ${kernel_addr_r} - ${fdt_addr_r}

在实际项目中,我们发现将常用命令保存为U-Boot环境变量可以显著提高调试效率:

setenv netboot 'tftp ${kernel_addr_r} Image.gz; tftp ${fdt_addr_r} system.dtb; booti ${kernel_addr_r} - ${fdt_addr_r}' saveenv
http://www.jsqmd.com/news/779124/

相关文章:

  • C++11 变参模板、完美转发和emplace 机制——奇牛 (Gemini润色)
  • 00后下场整顿Agent:啥都不学就能用好AI,这才是正确打开方式
  • 大数据毕业设计推荐:基于Hadoop+Django诺贝尔奖可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
  • JavaScript 打开小窗口的实现方法
  • 地铁站台门控系统集成方案:三菱Q系列PLC以太网通讯与上位机联动实例
  • 自媒体常用图片尺寸!收藏这张图就对了
  • 2026 年量化交易软件 10 强实测:9.8 分 OKQuant 领跑全市场 - GrowthUME
  • 长期使用Taotoken聚合API对项目月度账单清晰度的感受
  • 上饶GEO优化服务机构实测排行:效果与合规能力对比 - 奔跑123
  • 真空压力变送器选型攻略|6大核心参数,避开90%选型误区 - WHSENSORS
  • 2026最新AIGC动画实战教程 零基础入门到精通 附全套素材+工程文件(新手必看)
  • 【布局优化】基于改进SLP与遗传算法的梁场布局优化附Matlab代码
  • 如何高效修复损坏视频:智能MP4修复工具Untrunc实用指南
  • 宋宝华:原理和实战解析Linux中如何正确地使用内存屏障
  • 5分钟搞懂BERT tokenizer:用encode_plus为你的NLP模型准备‘标准餐’(附PyTorch/TF代码适配)
  • 上饶本地GEO优化服务机构实测排行:效果维度对比 - 奔跑123
  • 2026届必备的降AI率方案实测分析
  • PWN-ROP
  • 上饶GEO优化服务商排行:实测效果与本土适配性对比 - 奔跑123
  • 【图像处理】基于改进樽海鞘群优化的图像匹配方法附Matlab代码
  • 突破OBS音频局限:揭秘如何为直播软件添加专业级VST插件支持
  • S32K3安全机制深度拆解:当CPU、内存、时钟“生病”时,芯片如何自救与报警?
  • 2025届学术党必备的降重复率工具实测分析
  • 用SystemVerilog玩转约束:除了`inside`和`dist`,你还能这样写条件约束
  • 芯片低功耗设计实战:从概念到签核的全流程解析与避坑指南
  • 上饶AI搜索优化服务商评测:专业度与效果实测对比 - 奔跑123
  • PWN-Canary
  • 【通信】基于Qlearning强化学习的水声通信自适应调制方法matlab仿真
  • 2026 年专利 / 商标 / 项目申报机构实力解析:长三角标杆机构深度拆解,本土优质服务商凭何突围? - 速递信息
  • Vue3项目里用ArcGIS SDK加载地图,保姆级配置流程(含样式避坑)