最近一直在用赛灵思的zynq7000芯片,是一个ARM核+FPGA的soc,zynq在运行完芯片内固化的bootRom之后运行的是FSBL程序(first stage boot loader),uboot由FSBL调起,官方说法中将uboot叫做SSBL(second stage boot loader).

本文分析fsbl源码;fsbl源码由vivado工具生成,笔者的vivado版本是2019.1.

bootROM阶段

芯片上电之后,cpu从0x0000地址开始运行,此时芯片运行的是bootROM固化代码,这一段代码主要是初始化CPU和一些必要的外设->QSPI、SD卡、NORFlash.初始化这些外设是为了从这些外设中拿到BOOT.BIN(fsbl和uboot通过赛灵思的工具整合在一个文件中,这个文件叫BOOT.BIN)

假设我们使用SD卡作为启动设备,bootROM会初始化SD卡并从SD卡的第一个分区拿到BOOT.BIN,(第一个分区的文件系统只能是FAT格式)然后从BOOT.BIN的文件头中获取fsbl代码的长度,位置,将fsbl复制到256KB的OCM中运行(on chip memory),再跳转到FSBL,至此bootROM的生命周期就结束了。

fsbl阶段

fsbl的工作主要有:

1 初始化DDR,为下面的工作做准备

2 调起uboot,这是fsbl最重要且必要的任务

3 将bitstream配置到fpga,这是可有可无的任务

开始分析:

1 汇编阶段

找到asm_vectors.S文件,这是fsbl最开始运行的汇编.
可以看到如下代码:
_vector_table:
    B    _boot

 跳转到_boot标号处,有如下代码:
cmp r1, #0
beq CheckFUSE

cmp r1, #0:
比较r1寄存器值和立即数0,如果r1等于0,那么ARM的CPSR寄存器的Z bit为1;
beq CheckFUSE:
查看CPSR寄存器的Z bit,如果为1,则跳转到CheckFUSE处;如果为0,不跳转。

现在跳转到CheckFUSE处,有如下代码:
ands r1,r1,#0x80
beq OKToRun

这一段跟上面那一段差不多,不再解释,直接跳到OKToRun:
OKToRun中有四五十行汇编,主要做了关闭MMU,关闭Dcache(CPU的数据缓存,是CPU L1 cache中的Dcache,还有一个Icache是指令缓存;Dcache与Icache合在一起构成了CPU的L1 cache,就是常说的一级缓存)

直到OKToRun的最后面有这样的一句:
b _start

跳转到_start标号处:
bl __cpu_init

跳转到__cpu_init标号处:
这里开始对CPU进行初始化,主要是为C语言运行环境做准备,SP指针指向OCM段的结尾。
直到运行这一句:
bl main
终于,我们可以打印hello world了.

2 C语言阶段

1
Status =ps7_init();
初始化 MIO PLL CLK DDR3/2

2
Xil_DCacheFlush();
Xil_DcacheDisable();
清空Dcaches关闭Dcaches;上面已经关过了这里为什么还要关?无他,稳健。

3
Status=InitPcap();
初始化Pcap,Pcap具体是什么我也不清楚,不过看后面的使用发现,应该可能大概是操作AXI总线使用的.

4
GetSiliconVersion();
获取silicon的版本

5
BootModeRegister = Xil_In32(BOOT_MODE_REG);
获取boot模式寄存器,这个寄存器的值取决于你的bootmode管脚是如何设置的。

6
根据BootModeRegister 选择从哪里拿BOOT.BIN
QSPI启动:
                InitQspi();
                MoveImage = QspiAccess;
Nand启动:
                Status = InitNand();
                MoveImage = NandAccess;
NOR启动:
                InitNor();
                MoveImage = NorAccess;
初始化Qspi/nand/nor, flash操作函数MoveImage 指向各自的xxxxAccess函数.

SD卡启动:
                Status = InitSD("BOOT.BIN");
                MoveImage = SDAccess;
挂载SD卡打开BOOT.BIN文件,flash操作函数MoveImage 指向SDAccess函数.

7
HandoffAddress = LoadBootImage();
获取application在DDR中的运行地址(链接地址),这里的application指的就是SSBL,也就是uboot

8
FsblHandoff(HandoffAddress);
fsbl交出控制权,从HandoffAddress地址运行application

到这里,uboot终于出生了,fsbl也宣告生命结束。
接下来就是uboot的事情,拿设备树到DDR,拿kernel到DDR,解压kernel,将kernel从加载地址移动到运行地址,给kernel传递参数并调起kernel....

OK我话终于讲完.

zynq7000 FSBL 源码分析相关推荐

  1. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  2. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  3. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  4. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  5. Yolov3Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...

  6. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

  7. View的Touch事件分发(二.源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...

  8. MyBatis原理分析之四:一次SQL查询的源码分析

    上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码   String res ...

  9. [转]slf4j + log4j原理实现及源码分析

    slf4j + log4j原理实现及源码分析 转载于:https://www.cnblogs.com/jasonzeng888/p/6051080.html

最新文章

  1. CentOS 7 修改时区例如上海时区
  2. 【数据结构与算法】之深入解析“格雷编码”的求解思路与算法示例
  3. 在php中调用java接口吗,php 调用 java 接口
  4. 2021年山西副高考试成绩查询,中国卫生人才网2021年山西卫生资格考试成绩查询...
  5. as3 与 java_每天学一点Flash(48) As3.0 与 java 通信(1)
  6. 【解除Windows开机登陆密码的5种方法】
  7. Python3 爬虫(一)-- 简单网页抓取
  8. 企业级 CI/CD 工具部署 Serverless 应用的落地实践
  9. mysql数据库忘记密码时如何修改
  10. 数据结构与算法分析(七)递归
  11. openssl 制作证书, nginx https请求转http请求
  12. C#解决串口数据丢失问题
  13. 用python写一元二次方程_使用Python解一元二次方程!
  14. Mybatis-Plus的使用小技巧,高级面试题+解析
  15. 解决Navicat1166错误
  16. html5学习记录(三)
  17. 用stm32f103c8t6点亮0.96寸oled屏(附带百度云例程)
  18. Unity3D图集图片裁剪
  19. 百度地图开发者账号申请
  20. chrome不支持form.submit的解决方案_javascript技巧

热门文章

  1. 大师上课那些非同凡响的开场白
  2. git archive 归档命令——文件归档
  3. mysql root密码忘记2018_MySQL数据库之2018-03-28设置及修改mysql用户密码学习笔记
  4. radmin自动启动服务器,Radmin自动登录器及服务端一键部署
  5. Miranda显IP和显QQ版本号
  6. 修改注册表实现改变CPU名称 <偷梁换柱>
  7. VideoProc 4K for mac(一站式视频处理软件)
  8. DameWare remote control工具远程时“找不到网络路径”错误提示67
  9. 利用matlab对滤波器频率特性分析
  10. AP微积分内容是什么?