打印
[FPGA]

Xilinx Zynq 7000 FSBL启动分析(一) 转

[复制链接]
7506|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
众所周知,xilinx zynq 7000系列的芯片中包括两个部分,PS和PL,也就是FPGA的逻辑编程的部分跟嵌入式ARM的部分,ARM部分是双核的A9处理器。关于FPGA的部分在这里就不说了。其实说的简单点,可以吧这个芯片看成一个带有FPGA外设的ARM处理器,下面详细分析一下启动流程。
所有的芯片都是从0地址启动的,所以首先找到0地址的代码,在..xxxx.sdk\standalone_bsp_0\ps7_cortexa9_0\libsrc\standalone_v5_1\src\asm_vectors.S中的开头也就是0地址的地方有这样得一段代码:
其中71行B _boot就是一条跳转命令,跳转到_boot的地方继续运行,在boot.s文件中_boot结束的地方有
这样的代码,跳转到_start的地方,在xil-crt0.s中我们找到了_start的地方
可以看见最终跳转到了main函数,从这里开始才真正的进入到了FSBL的代码中执行。打开FSBL的main函数,顺便一提我用的版本是2015.2的SDK。
我们从main函数开始一步一步的分析:
1. Status = ps7_init();这条语句是初始化cpu,也就是对寄存器进行设置,设置的依据就是从vivado生成的硬件的信息。
2. GetSiliconVersion();得到PS的版本,我得到的是3.1的版本
3. BootModeRegister = Xil_In32(BOOT_MODE_REG);得到boot模式,在这里我使用的是qspi的启动模式。

4.所以会执行上面这段代码,进行初始化QSPI FALSH,在InitQspi()函数中由于我使用的QSPIFLASH是16M的所以LinearBootDeviceFlag就被赋值为1了。
下面一句QspiAccess函数赋值给MoveImage函数指针,找到QspiAccess函数:
这个函数的作用是从FLASH的SourceAddress地址开始复制一段长度为LengthBytes的数据到DDR内存中。所以MoveImage也就有了同样的功能。
5.FlashReadBaseAddress是在InitQspi()函数中赋值的,就是qspi falsh的起始地址为0xFC000000,在zynq7000的数据手册UG585中可以看到。
6.HandoffAddress = LoadBootImage();这条语句是整个FSBL中最关键的,这个函数主要做两个事情,一个是分析烧录到qspi中的数据的头的部分,其次是根据分析的结果把数据拷贝到DDR中。在这里还要岔开一下,说明一下烧录到QSPI的数据是怎么生成的。
zynq 7000的启动方式有很多种,其中包括从QSPI FALSH,SDcard,NOR FLASH,NAND FALSH等地方启动,我这里选用QSPI FALSH启动方式为例进行说明,首先要生成.bin文件,然后把这个文件通过SDK烧录到QSPIflash中。那么怎么生成.bin文件呢,一般来说bin文件中包含fsbl代码,FPGA部分生成的代码,在后面就是用户的应用程序了。
通过SDK中的Create Boot Image工具生成,打开Create Boot Image,
可以看见其中MY_FSBL.elf就是对应的FSBL,top.bit就是FPGA生成的流文件,HELLO_WORLD.elf跟rsc_ucosii.elf这两个文件都是应用程序,一般来说一个应用程序就可以了,这里我多添加一个是为了更好地演示。这几个文件的顺序是不能变动的。添加完成之后点击Create Image生成.bin文件,在这之后通过sdk带的Programe Flash进行烧录。
这回先分析到这里,下次对LoadBootImage()进行详细分析。

使用特权

评论回复

相关帖子

沙发
gaochy1126|  楼主 | 2021-10-23 20:28 | 只看该作者
分析到了
HandoffAddress = LoadBootImage();
在分析这个函数之前,在从0地址运行之前,在复位(上电复位)之后会从bootROM这个位置开始执行代码,在bootROM中,程序会将QSPI(如果是从qspi启动的话)的前nK的数据拷贝到OCM中,然后跳转到OCM中执行。把生成的BOOT.bin文件用二进制程序打开,根据数据手册可以分析一下前面的数据含义。
BOOT.bin
在boot.bin中从地址0-0x8BF可以分成17个部分,每个部分都有一定的含义
1. 0x000 中断向量表
2. 0x020 固定值 0xaa995566
3. 0x024 固定值 0x584c4e58 ASCII: XLNX
4. 0x028 如果是0xa5c3c5a3或者0x3a5c3c5a为加密的
5. 0x02C bootrom头版本号,不用管
6. 0x030 从bootrom开始到app地址的总数(bytes)
7. 0x034 从loadimage拷到OCM的长度
8. 0x038 目的地址到哪儿拷贝FSBL
9. 0x03C 开始执行的地址
10. 0x040 同7
11. 0x044 0x01为固定值
12. 0x048 校验和(从0x020-0x047)按32-bit word 相加取反
13. 0x04C bootgen相关
14. 0x098 image头的表指针
15. 0x09C partition头的表指针
16. 0x0A0 寄存器初始化的参数
17. 0x8A0 fsbl user defined
18. 0x8C0 fsbl开始的地方
如果是从qspi加载的话,bootrom会把数据从qspi拷贝到OCM中,在OCM中运行,也就是0地址运行。
LoadBootImage
这里我们认为image也就是boot.bin是存放在QSPI中,并且是从qspi中启动的,这个函数在fsbl的main函数之中,分析一下这个函数
RebootStatusRegister = Xil_In32(REBOOT_STATUS_REG);
这个语句是读取reboot的状态,Silicon_Version不是1的时候不用管这个
/*
* read the multiboot register
*/
MultiBootReg = XDcfg_ReadReg(DcfgInstPtr->Config.BaseAddr,
XDCFG_MULTIBOOT_ADDR_OFFSET);
fsbl_printf(DEBUG_INFO,"Multiboot Register: 0x%08x\r\n",MultiBootReg);
/*
* Compute the image start address
*/
ImageStartAddress = (MultiBootReg & PCAP_MBOOT_REG_REBOOT_OFFSET_MASK)
* GOLDEN_IMAGE_OFFSET;
这段代码的作用是从multiboot寄存器中读取要执行的image的地址,其实如果就一个image的话可以不用管这个,这个算出来的imagestartaddress一定是0
Status = GetPartitionHeaderInfo(ImageStartAddress);
这一段是读取在flash中的每个部分的头文件信息,包括大小起始地址等。也就是在生成BOOT的时候加入的几个文件,比如说先加的是FSBL,然后是BIT,最后是APP,那么着了的部分的数量就是3个。
PartitionNum = 1;
这里跳过了fsbl,直接从第二个partition加载,因为fsbl的东西已经在使用了,第二部分也就是bit文件。
然后会判断是什么类型,比如是bit还是application。
Status = PartitionMove(ImageStartAddress, HeaderPtr);
这句的意思是根据不同的partition的头的信息来将flash中的数据加载到DDR中
FsblHandoffExit(FsblStartAddr);
最后通过这句话跳转到应用中运行。

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:01 回复TA
赞一个 
板凳
lzmm| | 2021-10-31 21:36 | 只看该作者
相当全的资料,很适合初学者                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:01 回复TA
赞一个 
地板
suzhanhua| | 2021-10-31 21:36 | 只看该作者
有时间需要好好看看   不错                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:01 回复TA
赞一个 
5
iyoum| | 2021-10-31 21:36 | 只看该作者
感觉今后应该用的人很多                                   

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:01 回复TA
赞一个 
6
houjiakai| | 2021-10-31 21:36 | 只看该作者
以后多交流交流                  

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:01 回复TA
赞一个 
7
ghuca| | 2021-10-31 21:36 | 只看该作者
资料够全的,多谢分享                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:02 回复TA
赞一个 
8
51xlf| | 2021-10-31 21:36 | 只看该作者
资料很实用,谢谢楼主!                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:02 回复TA
赞一个 
9
typeof| | 2021-10-31 21:37 | 只看该作者
资料很实用,谢谢楼主!                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:02 回复TA
赞一个 
10
averyleigh| | 2021-10-31 21:37 | 只看该作者
感觉今后应该用的人很多                                   

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:02 回复TA
赞一个 
11
elsaflower| | 2021-10-31 21:37 | 只看该作者
资料的确是很全面                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:02 回复TA
赞一个 
12
xietingfeng| | 2021-10-31 21:37 | 只看该作者
谢谢你共享的资料                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:02 回复TA
赞一个 
13
chenci2013| | 2021-10-31 21:37 | 只看该作者
资料很实用,谢谢楼主!                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:02 回复TA
赞一个 
14
zerorobert| | 2021-10-31 21:37 | 只看该作者
非常感谢楼主分享                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:02 回复TA
赞一个 
15
ingramward| | 2021-10-31 21:37 | 只看该作者
这些资料太全了!!!                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:03 回复TA
赞一个 
16
yeates333| | 2021-10-31 21:38 | 只看该作者
内容还是非常丰富的                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:03 回复TA
赞一个 
17
juliestephen| | 2021-10-31 21:38 | 只看该作者
资料还是相当全面的                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:03 回复TA
赞一个 
18
jimmhu| | 2021-10-31 21:38 | 只看该作者
以后多交流交流                  

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:03 回复TA
赞一个 
19
tabmone| | 2021-10-31 21:38 | 只看该作者
谢谢lz分享,很有用                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:03 回复TA
赞一个 
20
dspmana| | 2021-10-31 21:38 | 只看该作者
非常感谢楼主分享                                 

使用特权

评论回复
评论
gaochy1126 2021-10-31 22:03 回复TA
赞一个 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:这个社会混好的两种人:一是有权有势,二是没脸没皮的。

1050

主题

11299

帖子

26

粉丝