Xilinx ZYNQ 7000学习笔记二(FSBL代码分析启动-汇编代码)

Linux系统移植二:生成fsbl引导文件并制作BOOT.bin(非petalinux版) 对于ZYNQ而言,在引导过程中,先运行FSBL来设置PS,然后运行U-Boot用于加载Linux内核映像并引导Linux 阅读详情

上一节讲了FSBL主要功能负责对PS端进行初始化、调用bitstream文件对PL端进行配置,加载应用或二级引导程序置DDR中并启动DDR,本节通过对FSBL代码进行分析深入理解代码。
参考资料
SDK版本:Release Version: 2018.3

一、FSBL代码过程

1.打开FSBL工程 fsbl_bsp->ps7_cortexa9_0->libsrc->standalone_v6_8->asm_vectors.S,即启动文件,这个文件生命了一个代码段,位于地址0处(而我们从《Xilinx ZYNQ 7000学习笔记一》知道BootRom最后执行就是跳转到0地址,即跳转到在OCM中执行的下面的FSBL代码)

开机后,PS自动开始执行0地址的指令,其第一句话就是一个跳转:B _boot

.org 0
.text
.globl _vector_table
.section .vectors
_vector_table:
B _boot
B Undefined
B SVCHandler
B PrefetchAbortHandler
B DataAbortHandler
NOP /* Placeholder for address exception vector*/
B IRQHandler
B FIQHandler
于是就跳转到boot.S中执行_boot标号下的代码了,(期间对包括DDR是否共享状态进行配置、使能了MMU和各级cache、中断初始化,当它执行完后,PS将具备执行C代码的能力),
我们对_boot标号的代码进行下简单分析:

_boot:

#if XPAR_CPU_ID==0 /* 表示当前FSBL是core0还是core1,我们对比分别用core0和core1创建FSBL,发现该宏XPAR_CPU_ID值分别会在工程中配置0或1 */
        /* only allow cpu0 through */
	mrc	p15,0,r1,c0,c0,5
	and	r1, r1, #0xf
        cmp	r1, #0
	beq	CheckEFUSE
	EndlessLoop0:
		wfe
	b	EndlessLoop0

CheckEFUSE:
        ldr r0,=EFUSEStaus
        ldr r1,[r0]                             /* Read eFuse setting */
        ands r1,r1,#0x80                        /* Check whether device is having single core */
	beq OKToRun

 /* single core device, reset cpu1 */
        ldr     r0,=SLCRUnlockReg               /* Load SLCR base address base + unlock register */
        ldr     r1,=SLCRUnlockKey               /* set unlock key */
        str     r1, [r0]                        /* Unlock SLCR */

	ldr r0,=SLCRCPURSTReg
	ldr r1,[r0]                             /* Read CPU Software Reset Control register */
	orr r1,r1,#0x22
        str r1,[r0]                             /* Reset CPU1 */

        ldr	r0,=SLCRlockReg         	/* Load SLCR base address base + lock register */
	ldr	r1,=SLCRlockKey	        	/* set lock key */
	str	r1, [r0]	        	/* lock SLCR */

#elif XPAR_CPU_ID==1
	/* only allow cpu1 through */
       mrc	p15,0,r1,c0,c0,5
       and	r1, r1, #0xf
       cmp	r1, #1
       beq	CheckEFUSE1
       b        EndlessLoop1

CheckEFUSE1:
        ldr r0,=EFUSEStaus
        ldr r1,[r0]                             /* Read eFuse setting */
        ands r1,r1,#0x80                        /* Check whether device is having single core */
	beq OKToRun
	EndlessLoop1:
	        wfe
	b	EndlessLoop1
#endif

XPAR_CPU_ID该宏值用来表示当前的FSBL代码是core0还是core1启动,这个是由我们创建FSBL选择core0还是core1工程决定的,我们以常用core0作为FSBL为例:双核运行后,针对core0会满足beq CheckEFUSE,结果就是core0继续标号CheckEFUSE运行,而core1不满足beq CheckEFUSE,将core1置为WFE休眠模式。反过来,如果我们创建FSBL是依据core1创建的,那么执行的结果就是core1干活儿core0进入WFE模式。(在这里我们知道,core1或者core0被置位为WFE休眠状态原来是FSBL启动后设定的啊)。EFUSEStaus寄存器是用来表示当前SOC是单核还是双核系统,为一次编程的非易失器件,我们是双核系统,会执行beq OKToRun,即执行下面标号OKToRun。

OKToRun:
	mrc     p15, 0, r0, c0, c0, 0		/* Get the revision */
	and     r5, r0, #0x00f00000
	and     r6, r0, #0x0000000f
	orr     r6, r6, r5, lsr #20-4

#ifdef CONFIG_ARM_ERRATA_742230
        cmp     r6, #0x22                       /* only present up to r2p2 */
        mrcle   p15, 0, r10, c15, c0, 1         /* read diagnostic register */
        orrle   r10, r10, #1 << 4               /* set bit #4 */
        mcrle   p15, 0, r10,
【HD】第一阶段引导加载程序——FSBL_Introduction FSBL 阅读详情

相关推荐

程序固化FSBL

开发板:AX7Z020。

m0_71143645的博客 2212

Xilinx ZYNQ 7000+Vivado2015.2系列(五)之ZYNQ的三种启动方式-JTAG、SD card、Flash

前言: 前面我们都是使用JTAG方式下载比特流文件,然后下载elf文件,最后点击Run as或者Debug as来运行程序。JTAG方式是通过tcl脚本来初始化PS,然后同用JTAG收发信息,优点是可以在线调试,缺点是断电后程序就丢失了。为了解决程序丢失的问题,可以制作镜像文件烧写到sd卡或者flash中,上电即可加载程序。 ZYNQ有两大类启动模式:从BootROM主动启动,从JTAG被

ChuanjieZhu 2万+

Xilinx ZYNQ 7000学习笔记一(复位和启动)

Xilinx ZYNQ 7000 复位和启动流程

u011116085的博客 7310

Xilinx ZYNQ 7000学习笔记三(FSBL代码分析-C代码)

FSBL代码分析

u011116085的博客 2394

Xilinx zynq-7000系列板子启动流程介绍

1. 背景资料 ​ Zc706评估板核心是Zynq-7000 XC7Z045-2FFG900C AP SoC,Ax 7Z1000核心为XC7Z100-2FFG900,与xc7z045只有频率的不同,因此在核心板相同的情况下可使用同一版本的uboot。对于Zynq-7000系列的板子来说,其核心板配置基本相同 ,主要差别在扩展板上的外设不同,这就导致我们在使用其他板子时可能需要根据自己的需求定制设备树(DTS)文件,然后使用Petalinux来简化编译生成启动镜像的过程。 2. Qemu for Xilinx

MIRSTAMP的博客 2960

Xilinx ZYNQ 7000学习笔记四(MultiBoot多重启动)

在前面《Xilinx ZYNQ 7000学习笔记一(复位和启动)》一节中,简单介绍了BootRom的运行流程和什么是persistent registers (持续寄存器),在本节将对ZYNQ7000 MultiBoot多重启动实现进行讲解。MultiBoot多重启动实现是基于ZYNQ的MULTIBOOT_ADDR寄存器,可用用来实现加载冗余的底层镜像文件。

u011116085的博客 3515

Zynq-7000系列之linux开发学习笔记:生成fsbl(四)

开发板:Zynq7030数据采集板 PC平台:Ubuntu-18.04 + MobaXterm 开发环境:Xilinx Vivado + SDK -18.3 交叉编译工具:arm-linux-gnueabihf- 学习目标:生成 fsbl.elf 文件 一、Zynq-7000系列启动顺序 Zynq-7000是一个可扩展处理平台,具有ARM核心和FPGA可编程单元。整个启动过程包括了PS端AR...

Claudedy的博客 9566

ZYNQ 7000 FSBL汇编启动原理与实战解析

FSBL(第一阶段引导加载程序)是嵌入式系统启动链中最底层、最硬核的环节,其本质是在CPU复位后、内存尚未初始化的绝对裸机环境下,通过纯ARM汇编指令直接操控寄存器完成PS端初始化、SCU多核使能、PLL时钟配置及启动模式识别。它不依赖C运行时,强调确定性时序与物理地址精确写入,是ZYNQ 7000等异构SoC实现可靠启动的技术基石。理解FSBL汇编不仅关乎启动失败排查,更支撑DDR训练调优、多核协同、硬件自检等关键工程实践。本文聚焦FSBL汇编源码(fsbl_asm.S)的逐行逻辑、物理寄存器映射与实操避

weixin_34306593的博客 446

Xilinx ZYNQ 7000学习笔记五(Xilinx SDK 烧写镜像文件)

前面几篇讲了ZYNQ7000的启动过程,包括BootRom和FSBL的代码逻辑,其中关于FSBL代码对启动模式为JTAG被动启动没有进行分析,本篇将通过将JTAG的功能和通过Xilinx SDK烧写镜像文件到flash来顺道把FSBL中的JTAG代码部分给讲解下。

u011116085的博客 2016

Xilinx Zynq-7000系列芯片介绍

1,启动流程 zynq7000系列的启动流程如下图所示,zynq的启动需要从ps端开始,因此zynq可以只使用ps端,但无法只使用pl端。启动过程分为三步:stage0,BootRom;stage1,FSBL/User code;stage2,U-boot/System/App。 stage0:ps端电源稳定后,ps端会复位所有寄存器、采样boot引脚、初始化配置时钟,然后执行BootRom(对用户不可见,出厂即固化在128KB的ROM中,初始地址为0。zynq7000...

admiraion123的博客 6961

zynq fsbl 学习笔记

zynq fsbl 学习笔记,主要记录fsbl的生成过程。还有fsbl的流程含义。

基于车牌识别的停车收费系统的设计与实现(源码+开题)

本系统(程序源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景: 随着城市化进程的加速和汽车保有量的增加,停车难成为了一个普遍存在的问题。传统的停车收费方式存在着效率低下、管理混乱等问题。因此,开发一款基于车牌识别的停车收费系统具有重要的现实意义。研究意义: 基于车牌识别的停车收费系统可以有效地解决传统停车收费方式在效率和准确性方面的问题,提高停车服务的效率和质量。

迟限程序设计 1386

【AutoDL】使用云服务器跑深度学习代码

1.算力市场 租用服务器,选择自己心仪的服务器2.镜像可以选择一些基础的镜像,社区镜像里是git上有的环境。3.上传文件在文件存储中,选择上传的区,在右边点击上传,选择自己的文件上传到云服务器中。

weixin_45768644的博客 3688

U8采购入库单CO接口开发实战:加载、新增与删除操作详解

本文详细解析了用友U8采购入库单CO接口的开发实战,重点介绍了加载、新增与删除三大核心操作的实现方法。通过C#代码示例和实际项目经验,帮助开发者高效处理采购入库单,提升企业供应链管理效率。文章还涵盖了环境配置、异常处理、性能优化等关键技巧,适合U8二次开发人员参考。

weixin_33462927的博客 350

QT西游回合制源码+java后台管理系统

这是一套回合制游戏源码,很适合学习。

renkai721的专栏 2527

【第1章】基于FPGA的图像形态学处理学习教程——目录

本课程介绍图像形态学处理技术,通过腐蚀、膨胀、开运算、闭运算等算子对图像进行优化。腐蚀可去除边缘杂色使线条更清晰,膨胀能填补缺口修复图像,开运算擅长去噪,闭运算则用于修补断裂。课程内容涵盖四大形态学处理的理论分析、MATLAB仿真和FPGA开发实现,包括腐蚀、膨胀、开闭运算以及顶帽变换等操作,最后探讨形态学处理的实际应用场景。通过仿真测试和FPGA开发实践,帮助学员掌握图像"美容塑型"的核心技术。

MATLAB,verilog,python,opencv,tensorflow,caffe,C,C++ 332

Google Play上架:谷歌2024年5月份审核政策改动,审核强度逐步提升

Google Play上架:谷歌2024年5月份审核政策改动,审核强度逐步提升

专业解决各种上架过包问题,专业团队专业处理 3186

PyTorch 面试题及参考答案(精选100道)

模块是 PyTorch 中用于自动求导的核心模块。它为张量上的所有操作提供了自动求导的功能。在深度学习中,反向传播是一种用于计算损失函数相对于模型参数的梯度的算法。通过梯度,我们可以使用优化算法(如随机梯度下降)来更新模型的参数,从而最小化损失函数。模块的主要作用就是自动计算这些梯度。当我们创建一个张量时,如果将其属性设置为True,那么 PyTorch 会跟踪该张量上的所有操作。在完成前向传播计算出损失函数后,调用方法,模块会自动根据链式法则反向传播计算出所有需要求导的张量的梯度。

大模型大数据攻城狮的专栏 1667

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: Xilinx ZYNQ 7000学习笔记一(复位和启动)
下一篇: Linker Script链接脚本说明
摩托艇上打领带
博客等级 码龄13年 175粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值