参考资料UG585第六章
1 FSBL由谁启动
在静态文件中,BOOT.BIN启动文件存放在SD卡或者QSPI等存储介质中,然后BOOT.BIN文件中已经包含了FSBL代码,也就是说FSBL代码已经集成到了BOOT.BIN文件中。如果要启动FSBL代码,就需要完成下面几件事情,
(1)找到BOOT.BIN的位置
(2)从BOOT.BIN文件中找到FSBL代码,
(3)找到之后将其拷贝到内存当中(SRAM,片内RAM)。
(4)之后再去运行FSBL代码
这些工作都是BootROM来完成的
BootROM它是一个程序/代码,并且已经固化到ZYNQ芯片内部。专门存放在片内ROM中。ZYNQ内部包含256K RAM(SRAM)以及128K ROM(SROM),所以BootROM代码固化在SROM中,片内的程序一般都固化在NOR FLASH(支持XIP)。且可以直接在NOR FLASH运行。
BootROM支持哪些功能?包含了SD卡或者QSPI等存储设置的驱动程序。BootROM支持文件系统操作,至少支持FAT 32这个文件系统。
小结:对于ZYNQ平台、对于嵌入式Linux系统,Linux内核由U-Boot引导、启动,U-Boot由FSBL引导启动、FSBL由ZYNQ片内BootROM引导启动。
2 SD卡启动方式
对SD卡的要求:
(1)标准的SD或者SDHC设备
(2)包含FAT 16/32文件系统
(3)SD卡的容量可以高达32GB
SD卡方式启动流程
在SD卡启动方式下,BootROM代码的运行流程:
(1)初始化MIO引脚
主要就是配置MIO引脚的物理特性配置寄存器
重点就是将MIO40~MIO45复用为SD0外设所对应的CLK/CMD/DATA引脚
如果自己设计硬件,想要通过SD卡方式启动开发板,那么就必须将SD卡连接到ZYNQ的MIO40~MIO45引脚。
(2)初始化SD卡外设,驱动SD卡。可以实现SD卡的读写
(3)对SD卡的读写进行测试
(4)从SD卡文件系统中读取BOOT.BIN文件,并对BOOT.BIN文件头部进行解析(BootROM)。
这个头部信息是按照一定的格式组合在一起的,包括了fsbl的加载地址、fsbl的大小以及fsbl在BOOT.BIN文件中的偏移量。BootROM代码能够解析这个头部信息。
(5)得到fsbl代码的大小以及位置偏移量以及加载地址之后,BootROM代码就会从BOOT.BIN文件中,将fsbl代码拷贝到SRAM中,并且跳转到fsbl代码的运行地址去启动fsbl。这样BootROM就成功启动FSBL代码了。
3 QSPI启动流程
对QSPI的要求
(1)x1,x2,and x4 single device configuration
(2)Dual SS,8-bit parallel I/O device configuration
(3)Dual SS,4-bit stacked I/O configuration
(4)Execute-in-place option
QSPI启动方式如下:
在QSPI启动方式下,BootROM代码的运行流程
(1)初始化MIO引脚
将先关的MIO引脚复用为QSPI外设所需的引脚功能
重点就是MIO1~MIO8进行复用。
(2)初始化QSPI外设,驱动QSPI FLASH,实现QSPI读写
(3)从QSPI存储介质中读取BOOT.BIN文件,并对BOOT.BIN文件进行解析。
(4)得到FSBL代码的大小和偏移量以及fsbl的加载地址这些信息之后,再去从QSPI中拷贝fsbl代码到SRAM中,然后启动fsbl。
在头部搜索中,QSPI中没有文件系统,那么BootROM是如何找到BOOT.BIN的呢?
BootROM代码首先会从QSPI的第0扇区去找BOOT.BIN文件,如果找不到就跳到下一个地址0x8000,如果还找不到,就接着跳转到下一个地址0x10000,以此类推。但是搜索的范围不能超出QSPI的前面16M。