zynq程序固化补充篇: 不切换启动模式强制烧写

简介: 使用SDK2018.2第一次进行烧写 Flash,在qspi模式下会报错,只有切换至jtag模式下才可以进行烧录,后续的再次烧录不会出现类似问题。但是调试的时候必须切回jtag模式(将BOOT MODE 5拉低才可以调试)

问题描述

 使用SDK2018.2第一次进行烧写 Flash,在qspi模式下会报错,只有切换至jtag模式下才可以进行烧录,后续的再次烧录不会出现类似问题。但是调试的时候必须切回jtag模式(将BOOT MODE 5拉低才可以调试)

 2017.2等版本时不会存在类似问题

 硬件设计的更改在很多时候终归没有软件的更改灵活,有没有一种办法可以在不修改启动模式的情况下通过软件的修改强制烧写进去呢?

解决思路b97ec47f217347d1b876f36f30bb37af.png

如图为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后不能启动。)

 下图是官方解决办法的原始说明

6b8b446a02e243d29a9ad6f9e4358c21.png最终办法:

 也就是说通过在“指定的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;



相关文章
|
7月前
|
存储 芯片 SoC
ZYNQ程序固化
ZYNQ程序固化
|
7月前
|
Linux 开发工具 异构计算
【ZYNQ】QSPI Flash 固化程序全攻略
【ZYNQ】QSPI Flash 固化程序全攻略
1354 0
|
Windows Python
MicroPython 玩转硬件系列3:上电自动执行程序
MicroPython 玩转硬件系列3:上电自动执行程序
|
Linux
【Linux系统开发】 x210开发板 虚拟驱动创建流程(驱动编译进内核)
【Linux系统开发】 x210开发板 虚拟驱动创建流程(驱动编译进内核)
146 0
|
芯片
具体单板的按键驱动程序(查询方式)-以IMX6ull单板为例子
具体单板的按键驱动程序(查询方式)-以IMX6ull单板为例子
102 0
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十二)LED模板驱动程序的改造:设备树
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十二)LED模板驱动程序的改造:设备树
342 1
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十二)LED模板驱动程序的改造:设备树
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十)LED模板驱动程序的改造:总线设备驱动模型
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十)LED模板驱动程序的改造:总线设备驱动模型
233 1
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十)LED模板驱动程序的改造:总线设备驱动模型
|
存储
龙芯2K1000内核及文件系统烧写流程(恢复Boot内核引导配置及分区)
龙芯2K1000内核及文件系统烧写流程(恢复Boot内核引导配置及分区)
566 0
龙芯2K1000内核及文件系统烧写流程(恢复Boot内核引导配置及分区)
|
芯片 内存技术
如何用SEGGER工具烧写程序,烧写地址详解
如何用SEGGER工具烧写程序,烧写地址详解
344 0
如何用SEGGER工具烧写程序,烧写地址详解
|
Linux Android开发
RK3399平台开发系列讲解(内核调试篇)2.51、什么是硬件断点
RK3399平台开发系列讲解(内核调试篇)2.51、什么是硬件断点
174 0
RK3399平台开发系列讲解(内核调试篇)2.51、什么是硬件断点