zynq7000 FSBL 源码分析
最近一直在用赛灵思的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 源码分析相关推荐
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...
- SpringBoot-web开发(二): 页面和图标定制(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...
- SpringBoot-web开发(一): 静态资源的导入(源码分析)
目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...
- Yolov3Yolov4网络结构与源码分析
Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...
- ViewGroup的Touch事件分发(源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...
- View的Touch事件分发(二.源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...
- MyBatis原理分析之四:一次SQL查询的源码分析
上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码 String res ...
- [转]slf4j + log4j原理实现及源码分析
slf4j + log4j原理实现及源码分析 转载于:https://www.cnblogs.com/jasonzeng888/p/6051080.html
最新文章
- CentOS 7 修改时区例如上海时区
- 【数据结构与算法】之深入解析“格雷编码”的求解思路与算法示例
- 在php中调用java接口吗,php 调用 java 接口
- 2021年山西副高考试成绩查询,中国卫生人才网2021年山西卫生资格考试成绩查询...
- as3 与 java_每天学一点Flash(48) As3.0 与 java 通信(1)
- 【解除Windows开机登陆密码的5种方法】
- Python3 爬虫(一)-- 简单网页抓取
- 企业级 CI/CD 工具部署 Serverless 应用的落地实践
- mysql数据库忘记密码时如何修改
- 数据结构与算法分析(七)递归
- openssl 制作证书, nginx https请求转http请求
- C#解决串口数据丢失问题
- 用python写一元二次方程_使用Python解一元二次方程!
- Mybatis-Plus的使用小技巧,高级面试题+解析
- 解决Navicat1166错误
- html5学习记录(三)
- 用stm32f103c8t6点亮0.96寸oled屏(附带百度云例程)
- Unity3D图集图片裁剪
- 百度地图开发者账号申请
- chrome不支持form.submit的解决方案_javascript技巧
热门文章
- 大师上课那些非同凡响的开场白
- git archive 归档命令——文件归档
- mysql root密码忘记2018_MySQL数据库之2018-03-28设置及修改mysql用户密码学习笔记
- radmin自动启动服务器,Radmin自动登录器及服务端一键部署
- Miranda显IP和显QQ版本号
- 修改注册表实现改变CPU名称 <偷梁换柱>
- VideoProc 4K for mac(一站式视频处理软件)
- DameWare remote control工具远程时“找不到网络路径”错误提示67
- 利用matlab对滤波器频率特性分析
- AP微积分内容是什么?