[调试] JTAG下运行正常,从QSPI或者SD卡启动则无响应,如何查找问题
[调试] JTAG下运行正常,从QSPI或者SD卡启动则无响应,如何查找问题
- 一、问题现象
- 二、用自定义fsbl替代系统默认的fsbl
- 1. 新建fsbl_new
- 2. 如果提示缺少xilffs库
- 3. 使能调试信息输出
- 三. 启动成功和失败情况下的典型输出
- 1. JTAG启动模式: 正常加载
- 2. QSPI启动模式
- 2.1 正常加载: flash已经烧写正常运行的程序,启动模式QSPI
- 2.2. QSPI错误加载的例子
- 3. SD卡启动模式
- 3.1 SD正常启动
- 3.2 没插卡或者卡检测失败
- 3.3 找到文件但是文件错误
一、问题现象
用jtag在ide里面调试运行都正常。
生成boot.bin烧写到flash后,上电pl done不亮,串口无打印输出
二、用自定义fsbl替代系统默认的fsbl
1. 新建fsbl_new
新建一个app,选择Zynq FSBL模板。

2. 如果提示缺少xilffs库
在上面的情况,有可能会提示bsp缺少xilffs库。
这时候返回到bsp界面,勾选添加缺少的库,并重新编译全部工程。再执行上面的新建步骤

3. 使能调试信息输出
打开新建的工程,找到fsbl_debug.h
可以看到#if defined (FSBL_DEBUG_INFO)这行,
只要我们定义了FSBL_DEBUG_INFO,就会输出完整调试信息
因此,在36行增加
#define FSBL_DEBUG_INFO
然后重新编译fsbl_new

三. 启动成功和失败情况下的典型输出
1. JTAG启动模式: 正常加载
把启动模式切换到JTAG,然后运行fsbl_new,结果如下:
Xilinx First Stage Boot Loader
Release 2020.1 Jul 2 2024-12:27:50
Devcfg driver initialized
Silicon Version 3.1
Boot mode is JTAG
2. QSPI启动模式
2.1 正常加载: flash已经烧写正常运行的程序,启动模式QSPI
先烧写QSPI,然后断电,把启动模式切换到JTAG。重新上电,在Vitis里面运行fsbl_new,结果如下:
Xilinx First Stage Boot Loader
Release 2020.1 Jul 2 2024-12:27:50
Devcfg driver initialized
Silicon Version 3.1
Boot mode is QSPI
Single Flash Information
FlashID=0x1 0x20 0x18
SPANSION 128M Bits
QSPI is in Dual Parallel connection
QSPI Init Done
Flash Base Address: 0xFC000000
Reboot status register: 0x60500000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 3
Partition Number: 1
Header Dump
Image Word Len: 0x00080B00
Data Word Len: 0x00080B00
Partition Word Len:0x00080B00
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000065D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFE776BE
Bitstream
In FsblHookBeforeBitstreamDload function
PCAP:StatusReg = 0x40000F30
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA
Devcfg Status register = 0x40000A30
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x5802000F
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000A30
PCAP DMA SRC ADDR 0xF8007018: 0xFC019741
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x00080B00
PCAP DMA DEST LEN 0xF8007024: 0x00080B00
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100
...................................................................................................
DMA Done ! FPGA Done !
In FsblHookAfterBitstreamDload function
Partition Number: 2
Header Dump
Image Word Len: 0x00002002
Data Word Len: 0x00002002
Partition Word Len:0x00002002
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000870D0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFD72CB8
Application
PCAP:StatusReg = 0x40000F30
PCAP:device ready
PCAP:Clear done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x00033004
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x50000F30
PCAP DMA SRC ADDR 0xF8007018: 0xFC21C341
PCAP DMA DEST ADDR 0xF800701C: 0x00100001
PCAP DMA SRC LEN 0xF8007020: 0x00002002
PCAP DMA DEST LEN 0xF8007024: 0x00002002
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800110DMA Done !
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
2.2. QSPI错误加载的例子
给QSPI烧写一个错误的文件。然后运行
Xilinx First Stage Boot Loader
Release 2020.1 Jul 2 2024-12:27:50
Devcfg driver initialized
Silicon Version 3.1
Boot mode is QSPI
Single Flash Information
FlashID=0x1 0x20 0x18
SPANSION 128M Bits
QSPI is in Dual Parallel connection
QSPI Init Done
Flash Base Address: 0xFC000000
Reboot status register: 0xF058200C
Multiboot Register: 0x0000C400 //这里识别错误,C400对应到flash的末尾了。正常应该是C000
Image Start Address: 0x02000000 //这里计算出的偏移地址已经超过了flash,肯定无法读出正常的程序
DATA_ABORT_HANDLER //报错:数据异常
FSBL Status = 0xA304 //在fsbl.h里面可以查到对应的宏定义#define EXCEPTION_ID_DATA_ABORT_INT 0xA304 /**< Data Abort Exception */
搜到Multiboot Register,可以搜到下面的代码,可以看到是由于没搜到正确的boot,导致MultiBootReg的值不正确。
/** read the multiboot register*/MultiBootReg = XDcfg_ReadReg(DcfgInstPtr->Config.BaseAddr,XDCFG_MULTIBOOT_ADDR_OFFSET);fsbl_printf(DEBUG_INFO,"Multiboot Register: 0x%08lx\r\n",MultiBootReg);/** Compute the image start address*/ImageStartAddress = (MultiBootReg & PCAP_MBOOT_REG_REBOOT_OFFSET_MASK)* GOLDEN_IMAGE_OFFSET;
3. SD卡启动模式
3.1 SD正常启动
Xilinx First Stage Boot Loader
Release 2020.1 Jul 2 2024-12:27:50
Devcfg driver initialized
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD Init Done //卡初始化完成
Flash Base Address: 0xE0100000
Reboot status register: 0x60500000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 3
Partition Number: 1
Header Dump //解析到正确的镜像
Image Word Len: 0x00080B00
Data Word Len: 0x00080B00
Partition Word Len:0x00080B00
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000075D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFE766BE
Bitstream
In FsblHookBeforeBitstreamDload function
PCAP:StatusReg = 0x40000F30
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA
Devcfg Status register = 0x40000A30
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x5802000F
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000F30
PCAP DMA SRC ADDR 0xF8007018: 0x00100001
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x00080B00
PCAP DMA DEST LEN 0xF8007024: 0x00080B00
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100DMA Done ! FPGA Done !
In FsblHookAfterBitstreamDload function
Partition Number: 2
Header Dump
Image Word Len: 0x00002002
Data Word Len: 0x00002002
Partition Word Len:0x00002002
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000880D0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFD71CB8
Application
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
3.2 没插卡或者卡检测失败
Xilinx First Stage Boot Loader
Release 2020.1 Jul 2 2024-12:27:50
Devcfg driver initialized
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD: Unable to open file BOOT.BIN: 3SD_INIT_FAIL
FSBL Status = 0xA009This Boot Mode Doesn't Support Fallback
In FsblHookFallback function
3.3 找到文件但是文件错误
Xilinx First Stage Boot Loader
Release 2020.1 Jul 2 2024-12:27:50
Devcfg driver initialized
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD Init Done
Flash Base Address: 0xE0100000
Reboot status register: 0x6050200A
Multiboot Register: 0x0000C001
Image Start Address: 0x00008000
Partition Header Offset:0xE8BE0070
Partition Count: 14
Invalid Partition Count
Partition Header Load Failed
FSBL Status = 0xA00EThis Boot Mode Doesn't Support Fallback
In FsblHookFallback function
相关文章:
[调试] JTAG下运行正常,从QSPI或者SD卡启动则无响应,如何查找问题
[调试] JTAG下运行正常,从QSPI或者SD卡启动则无响应,如何查找问题 一、问题现象二、用自定义fsbl替代系统默认的fsbl1. 新建fsbl_new2. 如果提示缺少xilffs库3. 使能调试信息输出 三. 启动成功和失败情况下的典型输出1. JTAG启动模式: 正常加载2. QSPI启…...
Linux内核 -- 多线程之wait_event用法
Linux Kernel 中 wait_event 的高级用法及注意事项 在Linux内核编程中,wait_event 系列函数是用于实现进程等待和事件通知机制的重要工具。本文将详细介绍 wait_event 的高级用法以及注意事项。 1. 基本用法 wait_event 系列宏主要包括以下几种形式: …...
双指针系列第 8 篇:盛水最多的容器。几句话讲明白!
Leetcode 题目链接 思路 取首尾双指针和水量如下所示,设高度函数为 h ( i ) h(i) h(i),在下图中 h ( l ) < h ( r ) h(l) < h(r) h(l)<h(r)。 观察以 l l l 为左边界所能构成的其他水量,与矮的右边界搭配结果如下。 与高的…...
c++高阶-1-模板
文章目录 模板一、模板基本语法二、函数模板1.基本语法2.函数模板注意事项3.普通函数和函数模板区别4.普通函数和函数模板调用规则 三、类模板1.基本语法2.类模板和函数模板的区别3.类模板中成员函数调用时机4.类模板对象做函数参数5.类模板与继承6.成员函数的类外实现 模板 一…...
.net core 的 winform 的 浏览器控件 WebView2
在.NET Core WinForms应用程序中,没有直接的“浏览器控件”,因为WinForms不支持像WebBrowser控件那样的功能。但是,你可以使用WebView2控件,它是一个基于Chromium的浏览器内核,可以在WinForms应用程序中嵌入Web内容。 …...
Django QuerySet对象,all()方法
all()方法 在Django中,all()方法是QuerySet对象的一个方法,用于获取模型的所有实例。 当你调用ModelName.objects.all()时,Django会生成一个SQL查询,从数据库中获取该模型的所有记录,并返回一个QuerySet对象…...
自动生成网站sitemap
要在 Next.js 和 Contentlayer 项目中实现自动生成 Sitemap 的功能,你可以编写一个脚本,在每次生成文档后自动生成 Sitemap。以下是一个示例脚本,你可以根据自己的需求进行调整。 步骤 1:安装必要的依赖 首先,你需要…...
中国经济昆虫志(55卷)
中国经济昆虫志,共55卷,内容包括概述、形态特征、分类等。各级分类单元均编有检索表,每个种有特征描述、地理分布,有的还记载有生活习性和防治方法。为便于鉴定,绘制有特征图和彩色图。 包括鞘翅目天牛科、半翅目蝽科、…...
linux环境安装elasticsearch缓存数据库和Kibana客户端
linux环境安装elasticsearch缓存数据库,今天我们安装7.17.18版本,并分析遇到的问题。 一、elasticsearch安装运行 1、直接下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.18-linux-x86_64.tar.gz2、解压 tar -…...
OpenSSL的一些使用案例
目录 一、介绍 二、基本使用 1、Shell (1)文件加解密 (2)生成密钥文件 2、API (1)md5sum (2)AES256加解密 一、介绍 本篇博客重点不是详细描述 OpenSSL 的用法,只…...
常用字符串方法<python>
导言 在python中内置了许多的字符串方法,使用字符串方法可以方便快捷解决很多问题,所以本文将要介绍一些常用的字符串方法。 目录 导言 string.center(width[,fillchar]) string.capitalize() string.count(sub[,start[,end]]) string.join(iterabl…...
线程池666666
1. 作用 线程池内部维护了多个工作线程,每个工作线程都会去任务队列中拿取任务并执行,当执行完一个任务后不是马上销毁,而是继续保留执行其它任务。显然,线程池提高了多线程的复用率,减少了创建和销毁线程的时间。 2…...
Python28-5 k-means算法
k-means 算法介绍 k-means 算法是一种经典的聚类算法,其目的是将数据集分成 ( k ) 个不同的簇,每个簇内的数据点尽可能接近。算法的基本思想是通过反复迭代优化簇中心的位置,使得每个簇内的点与簇中心的距离之和最小。k-means 算法的具体步骤…...
主流国产服务器操作系统技术分析
主流国产服务器操作系统 信创 "信创",即信息技术应用创新,作为科技自立自强的核心词汇,在我国信息化建设的进程中扮演着至关重要的角色。自2016年起步,2020年开始蓬勃兴起,信创的浪潮正席卷整个信息与通信技…...
【Linux】线程封装与互斥(万字)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 C多线程的用法 对原生线程进行一次封装 理解pthread线程 Linux线程互斥 进程线程间的互斥相关背景概念 互斥量mutex 操作共享变量会有问题的售票…...
5分钟教你部署MySQL8.0环境
此方法基于Windows操作系统! 一、在MySQL官网单击downloads(下载)MySQLhttps://www.mysql.com/cn/ 选择在Windows操作系统下载 二、选择合适的版本 推荐下载第二种,安装时离线安装即可 三、安装MySQL8.0 1、找到MySQL下载完成…...
LLM应用:传统NLP任务
LLM出来以后,知乎上就出现了“传统NLP已死”的言论,但是传统NLP真的就被扔进历史的垃圾桶了吗? 其实,尽管LLM具有出色的通用能力,但仍然无法有效应对低资源领域的自然语言处理任务,如小语种翻译。为了更好地…...
基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建Kafka大数据运算环境---任务11:基础环境准备
任务描述 任务主要是安装配置基础环境,主要内容包括: 1、安装java Kafka和ZooKeeper都需要安装Java环境,推荐至少Java8及以上版本 2、安装ZooKeeper ZooKeeper是Kafka集群的必要组件 3、安装kafka Kafka版本包括使用的scala语言版本和kafka版…...
Golang中swtich中如何强制执行下一个代码块
switch 语句中的 case 代码块会默认带上 break,但可以使用 fallthrough 来强制执行下一个 case 代码块。 package mainimport ("fmt" )func main() {isSpace : func(char byte) bool {switch char {case : // 空格符会直接 break,返回 false…...
读书笔记-Java并发编程的艺术-第4章(Java并发编程基础)-第2节(启动和终止线程)
文章目录 4.2 启动和终止线程4.2.1 构造线程4.2.2 启动线程4.2.3 理解中断4.2.4 过期的suspend()、resume()和stop()4.2.5 安全地终止线程 4.2 启动和终止线程 在前面章节的示例中通过调用线程的start()方法进行启动,随着run()方法的执行完毕,线程也随之…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
