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

上一节讲了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, 
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xilinx zynq7000参考手册是一本提供给用户的完整指南,涵盖了xilinx zynq7000系列器件的所有重要特性和功能。该手册的目的是帮助用户了解和使用zynq7000系列器件,以便能够根据特定的设计需求正确配置和编程。 参考手册首先介绍了zynq7000系列器件的总体架构,包括处理系统(PS)和可编程逻辑(PL)部分的功能和组件。这些组件包括处理器核心、存储器、外设接口和相互连接的总线系统。用户可以通过阅读手册了解这些组件的工作原理和互连方式,并理解它们如何协同工作以实现高性能的系统设计。 手册还详细描述了zynq7000系列器件的特定功能和特性,如时钟和重置控制、外设接口协议、中断和异常处理、低功耗设计等。这些内容可以帮助用户深入了解zynq7000系列器件的功能和性能限制,在设计过程中避免常见的错误和问题。 此外,手册还提供了丰富的编程和配置指南,包括使用软件开发工具(SDK)进行C/C++编程、使用硬件描述语言(HDL)进行可编程逻辑设计、使用Vivado开发环境进行系统集成等等。使用这些指南,用户可以了解如何使用各种工具和技术来开发和调试zynq7000系列器件的应用程序和系统设计。 总之,xilinx zynq7000参考手册是一本非常重要的资源,为用户提供了详尽全面的信息和指导,帮助他们成功设计和开发基于zynq7000系列器件的应用和系统。无论是初学者还是有经验的设计师,都可以从这本手册中获益并加深对zynq7000系列器件的理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值