【Xilinx】MPSOC启动流程(三)- 第一段bootloader(FSBL)

该文章详细介绍了Xilinx平台ARM部分的启动流程,包括BootDeviceInitialization的设备初始化和启动头验证,PartitionLoad的分区头文件验证与镜像拷贝,以及Handoff阶段的PM初始化和保护配置。在启动过程中涉及了多种启动设备如USB、QSPI、SD/EMMC,还有加密解密、镜像验证和CPU的唤醒管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此系列博客,仅对Xilinx平台PS端(ARM部分)开发做介绍,不对PL(FPGA)做过多介绍。

目录

三. Boot Device Initalization

3.1 Primary Boot Device Init

3.2 Secondary Boot Device

3.3 Validate Header

​​​​​​​四. Partition Load

​​​​​​​4.1 Partition Header Validation

​​​​​​​4.2 Partition Copy

​​​​​​​4.3 Partition Validation

五. ​​​​​​​​​​​​​​Handoff

​​​​​​​5.1 PM Init

​​​​​​​5.2 Protection Config

​​​​​​​5.3 Handoff

参考文档


三. Boot Device Initalization

此部分主要完成启动设备的初始化工作,支持多设备,多镜像启动方式,

       1.第一段启动设备初始化

       2.启动Header验证

       3.第二段启动设备初始化

3.1 Primary Boot Device Init

1.读取BootMode(启动引脚决定),读取CRL_APB_BOOT_MODE_USER寄存器

2.初始化CSU DMA,其可用于PL配置,和镜像传输

3.根据不同的启动模式,初始化对应的外设驱动,例如USB,QSPI,SD/EMMC等驱动

​​​​​​​3.2 Secondary Boot Device

1.通过image header table 中的值获取 启动方式

2.根据不同的启动方式初始化对应驱动

3.验证validateheader

注意:如果启动方式是JTAG ,将不会进入第三阶段PartitionLoad

​​​​​​​3.3 Validate Header

BOOT.BIN结构

头文件验证流程:

  1. 获取boot header内容
  2. 读取boot image attr

  1. 获取image heaer table
  2. 验证image header table信息

5.读取对应镜像的image header

​​​​​​​四. Partition Load

主要完成分区头文件验证,镜像拷贝等工作

  1. 验证分区头文件

 

  1. 镜像拷贝
  2. 分区验证

​​​​​​​4.1 Partition Header Validation

      1.验证头文件 CheckSum

       2.加解密长度验证

       3.获取目标CPU,目标设备(PS/PL)

       4.验证加载的RAM地址是否有效,包括TCM,DDR

​​​​​​​4.2 Partition Copy

       1.拷贝PL程序到 temp DDR 地址

       2.拷贝PS到加载地址

       3.拷贝PMU Firmware 到 PMU RAM

​​​​​​​4.3 Partition Validation

  1. PS端如果需要加密认证,则进行解密,拷贝到目标
  2. 加载PL端bit, 初始化PACP,通过CSUDMA发送bit到PACP,等待PL端完成。
  3. 唤醒PMU处理器

五. ​​​​​​​​​​​​​​Handoff

主要完成以下工作:

  1. PM初始化
  2. 保护配置
  3. 唤醒CPU

​​​​​​​5.1 PM Init

Platform Managerment相关的初始化工作:

       1.通过IPI的ID查找IPI配置

       2.初始化PMU 的IPI

       3.初始化IPI库

       4.配置Power Mangerment

​​​​​​​5.2 Protection Config

       1.关闭SYSMON的报警

       2.应用XMPU保护相关配置

       3.锁住XMPU

       4.开启SYSMON报警

​​​​​​​5.3 Handoff

       所有所有镜像分区内容:

       一.镜像目标CPU为其他CPU且需要提前启动

       1.Power up 对应CPU

       2.更新CPU运行,复位地址

       3.复位CPU,此CPU将开始执行其对应的程序

       二.   镜像目标CPU为正在运行的CPU需要提前启动

       1.更新启动地址

       三.正在运行的CPU处理

       5.标志FSBL 完成

       6.退出FSBL,XFsbl_Exit((PTRSIZE) HandoffAddress, Flags);

       7.进入xfsbl_exit.S 的XFsbl_Exit函数

       8.跳转到目标地址执行 后面的应用程序

              C语言传过来的目标运行地址存在R0/X0中

              32位时:

64位时:X30是链接寄存器

参考文档

ug1085-zynq-ultrascale-trm.pdf

ug1283-bootgen-user-guide-zh-cn-2022.2.pdf

ug1137-zynq-ultrascale-mpsoc-swdev.pdf

<think>好的,用户之前让我写了一篇关于FSBLFsblHandOff()函数的博客框架,现在他提到他讲的是Xilinx Zynq的FSBL。我需要确认他的具体需求,可能他需要更详细的内容,特别是针对Zynq平台的部分。 首先,用户可能已经了解FSBL的基本概念,但需要深入Zynq的实现细节。之前的回复中已经包括了以Zynq为例的代码,但可能需要扩展更多Zynq特有的内容,比如启动流程、使用的硬件模块(如PSPL部分),以及Xilinx工具链的支持。 然后,用户可能希望了解如何实际开发或调试Zynq的FSBL,比如使用Vitis IDE的步骤,或者如何配置启动头文件。另外,安全启动功能在Zynq中很重要,用户可能对加密认证的具体实现感兴趣。 还需要考虑用户可能的背景。他可能是嵌入式开发者,正在使用Zynq平台,需要实际操作的指导,或者是在学习过程中遇到问题。需要提供具体的示例代码、配置步骤,以及常见问题的解决方法,比如启动失败的原因分析。 此外,用户之前的博客框架已经涵盖工作流程函数解析,现在可能需要补充Zynq特有的内容,比如BootROM的作用,FSBL如何与BootROM交互,以及PL配置的具体过程,如使用PCAP接口加载比特流。 最后,要确保回答结构清晰,分点说明,帮助用户逐步理解Zynq FSBL的各个方面,同时提供实用信息,如工具使用调试技巧,以满足实际开发需求。</think>以下是对Xilinx Zynq平台FSBL的专项解析,结合其硬件架构与工具链实现: --- ### Xilinx Zynq FSBL深度解析 **Zynq BootROM与FSBL关系** 1. **BootROM固化流程**(硬件自动执行) - 读取启动模式引脚(如QSPI/SD/SMAP),从`0xFC00_0000`执行ROM代码 - 加载FSBL到OCM(On-Chip Memory,地址范围`0x0000_0000~0x0003_FFFF`) - **关键校验**:验证FSBL头部`Width Detection``Identification`字段(例如`0xAA995566`) 2. **Zynq FSBL核心任务** - **PL配置**:通过PCAP(Processor Configuration Access Port)加载比特流,触发`PROG_B`信号复位PL - **多阶段引导**:支持链式加载(如FSBL→SSBL→Linux),通过`BootImage`的`Partition Header`定义阶段属性 - **XilLoader API调用**:使用`XFsbl_Initialize()``XFsbl_Transfer()`完成外设初始化与数据传输 --- ### Zynq FSBL代码结构(基于Vitis模板) #### 1.流程代码示例 ```c int main(void) { // 阶段1:初始化PS端基础硬件 XFsbl_Initialize(&FsblInstancePtr); XFsbl_ProcessBitstream(&FsblInstancePtr); // 阶段2:加载SSBL(如U-Boot)到DDR XFsbl_LoadPartition(SSBL_IMAGE_OFFSET); // 阶段3:执行控制权移交 XFsbl_HandoffExit(SSBL_ENTRY_ADDR); } ``` #### 2. **关键配置文件** - **bootgen配置(.bif文件)**:定义Boot Image格式 ``` // zynq.bif示例 the_ROM_image: { [bootloader] fsbl.elf [destination_device=pl] design.bit u-boot.elf } ``` - **xparameters.h**:包含PS端外设基地址(如`XPAR_UARTNS550_0_BASEADDR`) --- ### Zynq FSBL调试技巧 1. **早期调试** - 在`main()`前插入汇编指令强制切换UART引脚复用: ```asm ldr r0, =0xE0001000 @ MIO配置寄存器地址 mov r1, #0x00000600 @ MIO48/49作为UART0 TX/RX str r1, [r0] ``` - 使用`Xil_Out32()`输出调试码到LED(如`0x41200000`对应GPIO基地址) 2. **常见错误处理** - **"Invalid Image Header"**:检查Boot Image是否包含`FSBL_DEBUG_TYPE`字段 - **PL配置超时**:确认PCAP时钟使能,检查`STATUS`寄存器(`0xF8007310`)的`PCAP_INIT`位 --- ### Zynq UltraScale+ MPSoC差异点 1. **加密增强**:支持AES-GMACRSA-4096认证 2. **PMU集成**:FSBL需通过`PMU Firmware`管理电源域 3. **加载路径**:支持从eMMC的RPMB分区加载安全镜像 如需更深入的代码走读或启动时序分析,可提供具体应用场景(如安全启动/多核唤醒)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有意思科技

给与不给,我都会更新

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值