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 Part | MT40A512M16 |
| Memory Speed | 1066MHz |
| CAS Latency | 15 |
| tRFC | 350ns |
1.2 生成硬件描述文件
完成硬件设计后,需要生成.xsa(Xilinx Support Archive)文件,这是后续软件开发的基石。在生成过程中:
提示:务必勾选"Include bitstream"选项,否则生成的.xsa文件将不包含硬件比特流信息,导致后续步骤失败。
2. 启动组件编译与集成
ZynqMP的启动过程比传统Zynq更为复杂,涉及多个固件组件的协同工作。理解每个组件的作用至关重要。
2.1 关键启动组件解析
完整的启动链包含以下组件:
- PMU固件:电源管理单元固件,负责芯片上电时序
- FSBL:第一级启动加载器
- ARM Trusted Firmware:提供安全监控环境
- 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开发板需要特别注意以下设备树配置:
| 节点 | 必需配置 | 说明 |
|---|---|---|
| &gem3 | phy-mode = "rgmii-id" | 以太网PHY接口模式 |
| &uart1 | cts-override | 禁用硬件流控 |
| &sdhci1 | disable-wp | 禁用写保护检测 |
| /memory | reg = <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/sdb25. 启动脚本与内核参数配置
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.scr5.2 常见启动问题排查
当系统无法正常启动时,可按以下步骤排查:
- 检查PMU状态:U-Boot中运行
pmufw命令查看PMU固件状态 - 验证DDR初始化:FSBL阶段串口输出应显示DDR初始化成功
- 确认SD卡识别:U-Boot中使用
mmc list检查SD卡是否被识别 - 检查文件加载:使用
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