1 打开FSBL的调试信息
烧写Flash后串口打印的调试信息。
Xilinx First Stage Boot Loader
Release 2019.1 Jul 162025-10:19:02
Devcfg driver initialized
Silicon Version 3.1
Boot mode is QSPI
Single Flash Information
FlashID=0xEF 0x40 0x18
WINBOND 128M Bits
QSPI is in single flash connection
QSPI is in4-bit mode
QSPI Init Done
Flash Base Address: 0xFC000000
Reboot status register: 0x60400000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 3
Partition Number: 1
Header Dump
Image Word Len: 0x0007F2E8
Data Word Len: 0x0007F2E8
Partition Word Len:0x0007F2E8
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000075D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFE7AF06
Bitstream
In FsblHookBeforeBitstreamDload function
PCAP:StatusReg = 0x40000A38
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA
Devcfg Status register = 0x40000A38
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x0802000B
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000A38
PCAP DMA SRC ADDR 0xF8007018: 0xFC01D741
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x0007F2E8
PCAP DMA DEST LEN 0xF8007024: 0x0007F2E8
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100
...................................................................................................
DMA Done !
FPGA Done !
In FsblHookAfterBitstreamDload function
Partition Number: 2
Header Dump
Image Word Len: 0x00002002
Data Word Len: 0x00002002
Partition Word Len:0x00002002
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000868C0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFD734C8
Application
PCAP:StatusReg = 0x40000F38
PCAP:device ready
PCAP:Clear done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x00033004
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x50000F38
PCAP DMA SRC ADDR 0xF8007018: 0xFC21A301
PCAP DMA DEST ADDR 0xF800701C: 0x00100001
PCAP DMA SRC LEN 0xF8007020: 0x00002002
PCAP DMA DEST LEN 0xF8007024: 0x00002002
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800110
DMA Done !
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
Hello World
2 实现软件复位
#include<stdio.h>
#include"platform.h"
#include"xil_printf.h"
#include"sleep.h"
#definePSS_RST_CTRL_REG0xF8000200//PSS_RST_CTRL寄存器,绝对地址,
#defineSLCR_UNLOCK_ADDR0xF8000008//SLCR_UNLOCK寄存器,绝对地址,
#defineUNLOCK_KEY0xDF0D//使能码
#definePSS_RST_MASK0x01//复位码
voidPsSoftwareReset(void)
{
Xil_Out32(SLCR_UNLOCK_ADDR, UNLOCK_KEY);//写使能
Xil_Out32(PSS_RST_CTRL_REG, PSS_RST_MASK);//复位
}
intmain()
{
init_platform();
print("Hello Worldnr");
sleep(5);
PsSoftwareReset();
cleanup_platform();
return0;
}
烧写后的调试信息:
Xilinx First Stage Boot Loader
Release 2019.1 Jul 162025-10:42:00
Devcfg driver initialized
Silicon Version 3.1
Boot mode is QSPI
Single Flash Information
FlashID=0xEF 0x40 0x18
WINBOND 128M Bits
QSPI is in single flash connection
QSPI is in4-bit mode
QSPI Init Done
Flash Base Address: 0xFC000000
Reboot status register: 0x60400000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 3
Partition Number: 1
Header Dump
Image Word Len: 0x0007F2E8
Data Word Len: 0x0007F2E8
Partition Word Len:0x0007F2E8
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000075D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFE7AF06
Bitstream
In FsblHookBeforeBitstreamDload function
PCAP:StatusReg = 0x40000A38
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA
Devcfg Status register = 0x40000A38
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x0802000B
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000A38
PCAP DMA SRC ADDR 0xF8007018: 0xFC01D741
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x0007F2E8
PCAP DMA DEST LEN 0xF8007024: 0x0007F2E8
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100
...................................................................................................
DMA Done !
FPGA Done !
In FsblHookAfterBitstreamDload function
Partition Number: 2
Header Dump
Image Word Len: 0x00002002
Data Word Len: 0x00002002
Partition Word Len:0x00002002
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000868C0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFD734C8
Application
PCAP:StatusReg = 0x40000F38
PCAP:device ready
PCAP:Clear done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x00033004
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x50000F38
PCAP DMA SRC ADDR 0xF8007018: 0xFC21A301
PCAP DMA DEST ADDR 0xF800701C: 0x00100001
PCAP DMA SRC LEN 0xF8007020: 0x00002002
PCAP DMA DEST LEN 0xF8007024: 0x00002002
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800110
DMA Done !
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
Hello World
Xilinx First Stage Boot Loader
Release 2019.1 Jul 162025-10:42:00
Devcfg driver initialized
Silicon Version 3.1
Boot mode is QSPI
Single Flash Information
FlashID=0xEF 0x40 0x18
WINBOND 128M Bits
QSPI is in single flash connection
QSPI is in4-bit mode
QSPI Init Done
Flash Base Address: 0xFC000000
Reboot status register: 0x60480000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 3
Partition Number: 1
Header Dump
Image Word Len: 0x0007F2E8
Data Word Len: 0x0007F2E8
Partition Word Len:0x0007F2E8
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000075D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFE7AF06
Bitstream
In FsblHookBeforeBitstreamDload function
PCAP:StatusReg = 0x40000A38
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA
Devcfg Status register = 0x40000A38
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x0802000B
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000A38
PCAP DMA SRC ADDR 0xF8007018: 0xFC01D741
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x0007F2E8
PCAP DMA DEST LEN 0xF8007024: 0x0007F2E8
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100
...................................................................................................
DMA Done !
FPGA Done !
In FsblHookAfterBitstreamDload function
Partition Number: 2
Header Dump
Image Word Len: 0x00002002
Data Word Len: 0x00002002
Partition Word Len:0x00002002
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000868C0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFD734C8
Application
PCAP:StatusReg = 0x40000F38
PCAP:device ready
PCAP:Clear done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x00033004
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x50000F38
PCAP DMA SRC ADDR 0xF8007018: 0xFC21A301
PCAP DMA DEST ADDR 0xF800701C: 0x00100001
PCAP DMA SRC LEN 0xF8007020: 0x00002002
PCAP DMA DEST LEN 0xF8007024: 0x00002002
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800110
DMA Done !
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
Hello World
Xilinx First Stage Boot Loader
Release 2019.1 Jul 162025-10:42:00
Devcfg driver initialized
Silicon Version 3.1
Boot mode is QSPI
Single Flash Information
FlashID=0xEF 0x40 0x18
WINBOND 128M Bits
QSPI is in single flash connection
QSPI is in4-bit mode
QSPI Init Done
Flash Base Address: 0xFC000000
Reboot status register: 0x60480000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 3
Partition Number: 1
Header Dump
Image Word Len: 0x0007F2E8
Data Word Len: 0x0007F2E8
Partition Word Len:0x0007F2E8
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000075D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFE7AF06
Bitstream
In FsblHookBeforeBitstreamDload function
PCAP:StatusReg = 0x40000A38
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA
Devcfg Status register = 0x40000A38
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x0802000B
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000A38
PCAP DMA SRC ADDR 0xF8007018: 0xFC01D741
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x0007F2E8
PCAP DMA DEST LEN 0xF8007024: 0x0007F2E8
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100
...................................................................................................
DMA Done !
FPGA Done !
In FsblHookAfterBitstreamDload function
Partition Number: 2
Header Dump
Image Word Len: 0x00002002
Data Word Len: 0x00002002
Partition Word Len:0x00002002
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000868C0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFD734C8
Application
PCAP:StatusReg = 0x40000F38
PCAP:device ready
PCAP:Clear done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x00033004
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x50000F38
PCAP DMA SRC ADDR 0xF8007018: 0xFC21A301
PCAP DMA DEST ADDR 0xF800701C: 0x00100001
PCAP DMA SRC LEN 0xF8007020: 0x00002002
PCAP DMA DEST LEN 0xF8007024: 0x00002002
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800110
DMA Done !
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
Hello World
周期复位。
3 Multiboot
理论
有三种机制可以进行多重引导。
1) Golden Image Search
当在 Flash Memory 底部没有找到有效的标头时,由 BootROM 启动。BootROM 将在每 32KB 偏移量处开始搜索有效的标头。这种机制虽然缓慢,但很可靠。
2) BootROM 多重引导
这是由 FSBL 发起的,即用户。如果 BootROM 找到有效的 header 并移交给 FSBL,则 FSBL 可以加载 Multiboot register 并发出软复位。软复位后,BootROM 将使用 Multiboot 寄存器的地址来读取 BootROM 头。例如,当用户想要运行自检和诊断,然后跳转到实际应用程序时,就会使用这种机制。
3) FSBL 回退
为了从错误情况中恢复,FSBL 执行回退,并使 BootROM 能够加载另一个可引导映像(最初存在且处于已知良好状态的黄金映像),如果该映像存在于闪存中。FSBL 更新一个 multiboot register 并进行软复位,以便 BootROM 执行并加载下一个有效的 image。FSBL 回退可以在有或没有软重置的情况下发生。
将创建两个启动文件。
Hello_World_1.bin = (FSBL_1 + Hello_World_1)
- prints “Hello World from Image 1 at address 0x0000_0000”
Hello_World_2.bin = (FSBL_2 + Hello_World_2)
- prints “Hello World from Image 2 at address 0x0004_0000”
,如下图所示,FSBL_1将回退,FSBL_2不会。
Hello_World_1 将打印“Hello World from Image 1 at address 0x0000_0000”(地址 中的图像 1 中的 Hello World)
Hello_World_2 将打印“Hello World from Image 2 at address 0x0004_0000”(地址 中的图像 2 中的 Hello World)
将在 QSPI 地址的偏移量 0x00 处对 Hello_World_1.bin 进行编程,在 QSPI 地址的偏移量 0x40000 (256KB) 处 Hello_World_2.bin。我们将修改 FSBL_1 以执行回退。我们期望的是,当 FSBL_1 进行回退时,它最终会在 0x0004_0000 处找到映像,并执行 FSBL_2 和 Application2。对于此示例,我们将设置 “FSBL_DEBUG” 标志,以便我们可以看到 FSBL 的 Debug 打印。
1) BootROM 执行并加载映像 1
2) FSBL_1 执行
3) FSBL_1 将 MultiBoot Reg 地址设置为 0x40000/ 0x8000 = 0x8,最终
4) FSBL_1 发出软重置
5) BootROM 执行并加载 image2
6) FSBL_2 执行
7) hello_world2 应用程序执行并打印“Hello World from Image 2 at address 0x0004_0000”(来自地址 的图像 2 的 Hello World)
分步实现:
1.创建 FSBL_1 应用程序。设置 FSBL_DEBUG 标志。
2. 修改FSBL1中的 main() 函数 FSBL_1 以禁用 Handoff。所需的更改以蓝色突出显示。此函数 FsblHandoff() 在 main() 的最底部调用,通过禁用此函数,我们将生成失败条件并将进行 FSBL 回退。
/*
-
- FSBL handoff to valid handoff address orexit in JTAG
-
- */
-
- //FsblHandoff(HandoffAddress);
-
- OutputStatus(ILLEGAL_RETURN);
- FsblFallback();
正常情况下,FSBL 应通过 FsblHandoff() 跳转到有效的应用程序地址。
OutputStatus(ILLEGAL_RETURN):
输出错误码 ILLEGAL_RETURN(通常定义为宏,如 0x08)。
作用:记录错误类型,便于调试(通过寄存器、UART 或 LED 显示)。
FsblFallback():
触发 FSBL 的回退机制,可能的操作包括:
直接跳转到 Golden Image(地址如 0xFC0000)。
软复位:通过设置 RSR_REG 并复位,让 BootROM 重新加载 Golden Image。
进入 JTAG 模式:死循环等待调试器连接(最终兜底)。
3,创建 FSBL_2 应用程序。设置 FSBL_DEBUG 标志。构建 FSBL_2 并生成 FSBL_2.elf
运行结果:
Xilinx First Stage Boot Loader
Release 2019.1 Jul 162025-13:40:17
Silicon Version 3.1
Boot mode is QSPI
...................................................................................................
...................................................................................................PCAP transfer timed out
PCAP Bitstream Download Failed
PARTITION_MOVE_FAIL
FSBL Status = 0xA00B
Xilinx First Stage Boot Loader
Release 2019.1 Jul 162025-13:41:12
Silicon Version 3.1
Boot mode is QSPI
...................................................................................................
...................................................................................................
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
Hello World from Image 2 at address 0x0004_0000
FSBL_1失败,Multiboot Regsiter(只有低13位)逐渐增加到8,代表8*0x8000=0x40000。之后会记录下这个值。FSBL_2运行成功,启动Hello_World_2.elf应用程序。
实验二
在Hello_World_1程序中主动修改multiboot寄存器的值,再触发软件复位,使其主动跳转到指定的地址Hello_World_2处。
在Hello_World_2程序中主动修改multiboot寄存器的值,再触发软件复位,使其主动跳转到指定的地址Hello_World_1处。
如此,循环跳转。
Hello_World_1:
#include<stdio.h>
#include"platform.h"
#include"xil_printf.h"
#include"xil_io.h"
#include"sleep.h"
#definePSS_RST_CTRL_REG0xF8000200//PSS_RST_CTRL寄存器,绝对地址,
#defineSLCR_UNLOCK_ADDR0xF8000008//SLCR_UNLOCK寄存器,绝对地址,
#defineUNLOCK_KEY0xDF0D//使能码
#definePSS_RST_MASK0x01//复位码
voidPsSoftwareReset(void)
{
Xil_Out32(SLCR_UNLOCK_ADDR, UNLOCK_KEY);//写使能
Xil_Out32(PSS_RST_CTRL_REG, PSS_RST_MASK);//复位
}
#defineXDCFG_MULTIBOOT_ADDR_OFFSET_REG0xF800702C//MULTIBOOT寄存器,绝对地址,
#defineXDCFG_UNLOCK_OFFSET_ADDR0xF8007034//XDCFG_UNLOCK_寄存器,绝对地址,
#defineUNLOCK_XDCFG_KEY0x757BDF0D//使能码
#defineAPP1_LOCATION0x00//Hello_World_1位置
#defineAPP2_LOCATION0x08//Hello_World_2位置 以32KB为单位,8*0x8000=0x40000
voidModifyMultiBoot(void)
{
Xil_Out32(XDCFG_UNLOCK_OFFSET_ADDR , UNLOCK_XDCFG_KEY );//写使能
Xil_Out32(XDCFG_MULTIBOOT_ADDR_OFFSET_REG , APP2_LOCATION );//更改MULTIBOOT
}
intmain()
{
init_platform();
print("Hello World from Image 1 at address 0x0000_0000nr");
sleep(3);
ModifyMultiBoot();
PsSoftwareReset();
cleanup_platform();
return0;
}
Hello_World_2:
#include<stdio.h>
#include"platform.h"
#include"xil_printf.h"
#include"xil_io.h"
#include"sleep.h"
#definePSS_RST_CTRL_REG0xF8000200//PSS_RST_CTRL寄存器,绝对地址,
#defineSLCR_UNLOCK_ADDR0xF8000008//SLCR_UNLOCK寄存器,绝对地址,
#defineUNLOCK_KEY0xDF0D//使能码
#definePSS_RST_MASK0x01//复位码
voidPsSoftwareReset(void)
{
Xil_Out32(SLCR_UNLOCK_ADDR, UNLOCK_KEY);//写使能
Xil_Out32(PSS_RST_CTRL_REG, PSS_RST_MASK);//复位
}
#defineXDCFG_MULTIBOOT_ADDR_OFFSET_REG0xF800702C//MULTIBOOT寄存器,绝对地址,
#defineXDCFG_UNLOCK_OFFSET_ADDR0xF8007034//XDCFG_UNLOCK_寄存器,绝对地址,
#defineUNLOCK_XDCFG_KEY0x757BDF0D//使能码
#defineAPP1_LOCATION0x00//Hello_World_1位置
#defineAPP2_LOCATION0x08//Hello_World_2位置 以32KB为单位,8*0x8000=0x400000
voidModifyMultiBoot(void)
{
Xil_Out32(XDCFG_UNLOCK_OFFSET_ADDR , UNLOCK_XDCFG_KEY );//写使能
Xil_Out32(XDCFG_MULTIBOOT_ADDR_OFFSET_REG , APP1_LOCATION );//更改MULTIBOOT
}
intmain()
{
init_platform();
print("Hello World from Image 2 at address 0x0004_0000nr");
sleep(3);
ModifyMultiBoot();
PsSoftwareReset();
cleanup_platform();
return0;
}
运行结果:
Xilinx First Stage Boot Loader
Release 2019.1 Jul 162025-16:00:59
Devcfg driver initialized
Silicon Version 3.1
Boot mode is QSPI
Single Flash Information
FlashID=0xEF 0x40 0x18
WINBOND 128M Bits
QSPI is in single flash connection
QSPI is in4-bit mode
QSPI Init Done
Flash Base Address: 0xFC000000
Reboot status register: 0x60480000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 2
Partition Number: 1
Header Dump
Image Word Len: 0x00002002
Data Word Len: 0x00002002
Partition Word Len:0x00002002
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000075D0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFDF27C8
Application
PCAP:StatusReg = 0x40000A38
PCAP:device ready
PCAP:Clear done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x00033000
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x50000A38
PCAP DMA SRC ADDR 0xF8007018: 0xFC01D741
PCAP DMA DEST ADDR 0xF800701C: 0x00100001
PCAP DMA SRC LEN 0xF8007020: 0x00002002
PCAP DMA DEST LEN 0xF8007024: 0x00002002
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800110
DMA Done !
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
Hello World from Image 1 at address 0x0000_0000
Hello World from Image 2 at address 0x0004_0000
Xilinx First Stage Boot Loader
Release 2019.1 Jul 162025-16:00:59
Devcfg driver initialized
Silicon Version 3.1
Boot mode is QSPI
Single Flash Information
FlashID=0xEF 0x40 0x18
WINBOND 128M Bits
QSPI is in single flash connection
QSPI is in4-bit mode
QSPI Init Done
Flash Base Address: 0xFC000000
Reboot status register: 0x60480000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 2
Partition Number: 1
Header Dump
Image Word Len: 0x00002002
Data Word Len: 0x00002002
Partition Word Len:0x00002002
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000075D0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFDF27C8
Application
PCAP:StatusReg = 0x40000A38
PCAP:device ready
PCAP:Clear done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x00033000
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x50000A38
PCAP DMA SRC ADDR 0xF8007018: 0xFC01D741
PCAP DMA DEST ADDR 0xF800701C: 0x00100001
PCAP DMA SRC LEN 0xF8007020: 0x00002002
PCAP DMA DEST LEN 0xF8007024: 0x00002002
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800110
DMA Done !
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
Hello World from Image 1 at address 0x0000_0000
Hello World from Image 2 at address 0x0004_0000
2304