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

概述

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

1.JTAG

ZYNQ7000系列SOC通过标准的JTAG(IEEE1149.1)调试接口提供调试访问通道。在内部,SOC期间实现了PS端通过DAP(debug access port )控制器实现访问ARM,通过标准的TAP(test access port)控制器访问PL端。ARM DAP作为Arm CoreSight调试架构的一部分,允许用户利用行业标准的第三方调试工具进行调试。

下图展示了JTAG 的系统框图,在BootROM完成后将控制权移交给用户软件(启动FSBL),JTAG链就会自动启用,假设引导过程为非安全模式,这允许从用户软件入口点进行调试。

1.1 JTAG主要特性:

JTAG的主要特性有:

1) JTAG 1149.1 支持边界扫描

2) JTAG 1149.1 遵从TAP控制器:一个JTAG TAP控制器和一个ARM DAP控制器

3)AMD TAP控制器针对ZYNQ7000系列 唯一的IDCODE

4)支持IEEE1532可编程系统可配置 (in-system-configurable (ISC))设备

包括:

eFuse programming

BBRAM programming

XADC access

5)flash 编程

6)AMD逻辑分析仪调试支持

7)使用ARM DAP控制器访问Arm 片上调试和跟踪(CoreSight) 架构

8)通过DAP-AP端口间接访问PS地址空间

9)使用PS中的MIO或PL中的EMIO进行外部跟踪捕获

我们在这里知道通过JTAG可以直接操作flash和内存即可。

备注:eFUSE的全名是"Electrically Programmable Read-Only Memory Fuse",它是一种电可编程只读存储器。eFUSE是一种用于存储固定信息的存储器,它的主要特点是一旦编程后就无法再进行擦除或修改,类似于传统的只读存储器(ROM)的功能。eFUSE(熔断保护)通常是硬件特性,而不是预置的软件特性,eFUSE是一种一次性可编程的硬件存储器,用于存储固定的数据或配置信息,例如设备序列号、密钥、硬件配置等。

2.FSBL 代码JTAG模式

2.1 借助JTAG可以直接访问内存地址的功能,仿真器可以直接跳过BootRom对内存直接进行Program来加载ps7_init.tcl或应用至OCM或者DDR。

我们在使用仿真器进行debug时,ps7_init.tcl执行FSBL的等效代码,并走的JTAG分支,而这个分支最终状态只是让处理器进入WFE模式(参见2.2),并在应用程序elf加载到DDR中运行。JTAG模式下,处理器是处于挂起状态,而控制权是由JTAG控制(这也是为什么JTAG叫从模式的原因,因为处理器没有控制权)。红字部分也进行了说明。

2.2 FSBL JTAG模式分支代码

对应的JTAG模式分支,我们看FSBL的代码会发现JTAG模式的代码没有什么内容,就是调用汇编FsblHandoffJtagExit接口使能cache和mmu就进入WFE休眠了,而这正式释放处理器控制权的操作,以方便仿真器JTAG控制。

c 复制代码
	/*
	 * JTAG  BOOT MODE
	 */
	if (BootModeRegister == JTAG_MODE) {
		fsbl_printf(DEBUG_GENERAL,"Boot mode is JTAG\r\n");

		RegVal = Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_INT_STS_OFFSET);
		/** If bitstream was loaded in jtag boot mode prior to running FSBL */
		if(RegVal & XDCFG_IXR_PCFG_DONE_MASK)
		{
#ifdef PS7_POST_CONFIG
		ps7_post_config();
		/*
		 * Unlock SLCR for SLCR register write
		 */
		SlcrUnlock();
#endif
		}
		/*
		 * Stop the Watchdog before JTAG handoff
		 */
#ifdef	XPAR_XWDTPS_0_BASEADDR
		XWdtPs_Stop(&Watchdog);
#endif
		/*
		 * Clear our mark in reboot status register
		 */
		ClearFSBLIn();

		/*
		 * SLCR lock
		 */
		SlcrLock();

		FsblHandoffJtagExit();
	}
FsblHandoffJtagExit:
		mcr	 15,0,r0,cr7,cr5,0		/* Invalidate Instruction cache */
		mcr	 15,0,r0,cr7,cr5,6		/* Invalidate branch predictor array */

		dsb
		isb					/* make sure it completes */

	ldr	r4, =0
		mcr	 15,0,r4,cr1,cr0,0		/* disable the ICache and MMU */

		isb					/* make sure it completes */
Loop:
	wfe
	b Loop

2.2 使用SDK烧写镜像文件

当我们通过SDK烧写镜像文件到flash,如果外部启动模式引脚可以进行配置,那么我们可以通过配置外部启动引脚电平然后执行上电复位(POR)实现采集启动模式保存到启动模式寄存器进入FSBL的JTAG分支;另外如果外部启动模式引脚不方便配置,我们也可以直接更改FSBL代码添加BootModeRegister = JTAG_MODE代码时,BootRom会在启动FSBL后走JTAG分支,并通过SDK选择该FSBL代码生成的elf实现代码下载,而直接用FSBL代码下载镜像到flash会失败。
我们现在想想这是什么原因,这是因为如果FSBL不运行JTAG分支,那么JTAG直接加载FSBL代码到OCM会执行nor flash分支,而该分支中运行的操作是将flash中的bit文件(暂存)和应用程序搬移到DDR中,与我们要进行的将镜像Boot.bin 烧写到 flash冲突,导致下载失败。

相关推荐
黑客思维者13 分钟前
LLM底层原理学习笔记:Adam优化器为何能征服巨型模型成为深度学习的“速度与稳定之王”
笔记·深度学习·学习·llm·adam优化器
松☆30 分钟前
Flutter + OpenHarmony 实战:构建离线优先的跨设备笔记应用
笔记·flutter
kk哥889934 分钟前
Swift底层原理学习笔记
笔记·学习·swift
Vince丶2 小时前
UE DirectExcel使用笔记
笔记·ue5
AA陈超2 小时前
Lyra学习004:GameFeatureData分析
c++·笔记·学习·ue5·虚幻引擎
阿恩.7702 小时前
2026年1月最新计算机、人工智能、经济管理国际会议:选对会议 = 论文成功率翻倍
人工智能·经验分享·笔记·计算机网络·金融·区块链
('-')3 小时前
《从根上理解MySQL是怎样运行的》第二十章笔记
数据库·笔记·mysql
zkl_zkl_3 小时前
地理信息系统学习笔记——第六章 空间数据采集与处理
笔记·学习·数据处理·数据质量·空间数据
光头程序员3 小时前
学习笔记——主攻 vite
笔记·学习
零匠学堂20253 小时前
移动学习系统,如何提升企业培训效果?
java·开发语言·spring boot·学习·音视频