问题描述
使用SDK2018.2第一次进行烧写 Flash,在qspi模式下会报错,只有切换至jtag模式下才可以进行烧录,后续的再次烧录不会出现类似问题。但是调试的时候必须切回jtag模式(将BOOT MODE 5拉低才可以调试)
2017.2等版本时不会存在类似问题
硬件设计的更改在很多时候终归没有软件的更改灵活,有没有一种办法可以在不修改启动模式的情况下通过软件的修改强制烧写进去呢?
解决思路
如图为Zynq BOOT MODE配置,MIO[5:3]为Boot Devices设置为100,可以看出MIO[5]引脚为高时为QSPI模式,MIO[5]引脚为低时为JTAG Boot Mode模式。在硬件设计上面是将MIO上拉电阻,预留了下拉电阻
用sdk烧写时可以在交互窗口中找到如下打印信息:
****** xilinx Program Flash ****** Program Flash v2017.3 (64-bit) **** sW Build 2018833 on Wed 0ct 4 19:58:22 MDT 2017 ** Copyright 1986-2017 xilinx, Inc. All Rights Reserved. Connecting to hw server @ TCP:127.0.0.1:3121 Connected to hw server @TCP:127.0.0.1:3121 Available targets and devices: Target0:jsn-JTAG-HS3-210299A17FB8 Device 0:jSn-JTAG-HS3-210299A17FB8-4ba00477-0 Retrieving Flash info... Initialization done, programming the memory BOOT MODE REG = 0x00000001 WARNING: [Xicom 50-100] The current boot mode is ospI. If flash programming fails, configure device for JTAG boot mode and try again. f probe 日日日 Performing Erase Operation... Erase Operation successful. INFO: [Xicom 50-44] Elapsed time = 0 sec. Performing Blank Check Operation... 0%...INFO: 「Xicom 50-44] Elapsed time = 1 sec. Blank Check Operation unsuccessful. The part is not blank. ERROR: Flash Operation Failed Hx--1024
确定现象后查阅xilinx相关文档说明,发现从VIVADO 2017.3版本开始,Xilinx官方为了使Zynq-7000和Zynq UltraScale +实现流程相同,在QSPI FLASH使用上做了变化,即Zynq-7000编程flash需要“指定的fsbl”。这个fsbl用于初始化系统(主要是运行ps7_init()函数)。
通过分析可知下载QSPI FLASH 的“指定的fsbl”文件与生成boot.bin文件的fsbl文件不同,这里是不能混淆的。
而QSPI编程要求器件以JTAG模式启动。(因为在QSPI引导模式下启动,则“指定的fsbl”将尝试从flash加载分区,从而导致flash编程的错误行为。导致不能下载flash或下载flash后不能启动。)
下图是官方解决办法的原始说明
最终办法:
也就是说通过在“指定的fsbl”中的main.c中如下位置添加如下语句,防止FSBL在编程运行时从Flash设备加载任何现有分区。
/* * Read bootmode register */ BootModeRegister = Xil_In32(BOOT_MODE_REG); BootModeRegister &= BOOT_MODES_MASK; //add this line to trick boot mode to JTAG BootModeRegister = JTAG_MODE;