zynq-7015启动分析及裸机BootLoader编写(未完待续)

使用lwip-tcp远程对QSPI进行更新、QSPI FLASH启动

W25Q128资料:

W25Q128JV datasheet(1/78 Pages) WINBOND | 3V 128M-bit serial flash memory with dual/quad spi (alldatasheet.com)

UG585资料:

Zynq 7000 SoC Technical Reference Manual-UG585

翻译水平有限。

2024.05.27:

  • 最近再研究远程升级的问题,都做完了,确实是欠考虑了,如果程序升级过程中死掉了或者因为其他原因导致重启之后跑不了的话,程序无法回滚。。。
  • 再有就是我使用FSBL生成的引导程序,BOOT.bin文件=FSBL.elf+程序.elf+FPGA.bit。
  • 考虑到之前学过BootLoader,那么就需要把BOOT.bin拆成Bootloader和APP程序(FPGA.bit+程序.elf)。也就是说要自己写引导程序。
  • FLASH型号:W25Q128,128Mb=16MB,分析了之前的BOOT.bin存在的地址是从0x0000_0000开始的。

分析一下zynq启动过程:

Device Boot Flowchart

PS部分

重新上电复位:复位所有寄存器硬件采样mode引脚;JTAG/IOP/DDR等控制器失能;根据使用标头加密参数的BootROM确定安全Boot模式;PLL通过。

非重新上电复位:保持之前的Boot模式,使用devcfg.CTRL[SEC_EN]寄存器位供BootROM访问;复位除了保持的寄存器之外的寄存器;安全、非安全模式。

阶段0:BootROM 执行

阶段1:FSBL(引导加载程序)或用户代码

阶段2:操作系统

PL部分

PL硬件包含一个用来准备初始化的自启动序列。后续就是进行初始化,配置,使能。

Boot Modes

BootROM Code

2024.05.28:

参考我自己写的思路:

规划分区:

    //Every 32KB find BOOTROM valid headerxil_printf("---------- Enter BootLoader----------\n");xil_printf("    BOOTLOADER  VERSION:		%s.%s\n",MAJOR_BOOT_VERSION,MINOR_BOOT_VERSION);xil_printf("======== flash pration table ========\n");xil_printf("| name     | offset     | size      |\n");xil_printf("-------------------------------------\n");xil_printf("| boot     | 0x00000000 | 0x00100000|\n");//32KB*32=1024KB=1MBxil_printf("| app      | 0x00100000 | 0x00600000|\n");//32KB*32*6=6MBxil_printf("| download | 0x00700000 | 0x00600000|\n");//32KB*32*6=6MBxil_printf("| setting  | 0x00D00000 | 0x00300000|\n");//32KB*32*3=3MBxil_printf("=====================================\n");

调试的时候,可以在FSBL工程/src/fsbl_debug.h添加宏定义,可以看到启动过程中的调试信息。

#define FSBL_DEBUG_INFO

控制程序重启:

#define PSS_RST_CTRL_REG 0xF8000200 //PSS_RST_CTRL寄存器,绝对地址,
#define SLCR_UNLOCK_ADDR 0xF8000008 //SLCR_UNLOCK寄存器,绝对地址,
#define UNLOCK_KEY 0xDF0D //使能码
#define PSS_RST_MASK 0x01 //复位码void PsSoftwareReset(void)
{Xil_Out32(SLCR_UNLOCK_ADDR, UNLOCK_KEY); //写使能Xil_Out32(PSS_RST_CTRL_REG, PSS_RST_MASK); //复位
}

2024.05.29:

ZYNQ软件复位重启、程序跳转的实现方法(Multiboot)_zynq multiboot-CSDN博客

控制程序跳转:

#define XDCFG_MULTIBOOT_ADDR_OFFSET_REG 0xF800702C //MULTIBOOT寄存器,绝对地址,
#define XDCFG_UNLOCK_OFFSET_ADDR 0xF8007034 //XDCFG_UNLOCK_寄存器,绝对地址,
#define UNLOCK_XDCFG_KEY 0x757BDF0D //使能码#define APP1_LOCATION 0x00 //APP1位置
#define APP2_LOCATION 0x08 //APP2位置,以32KB为单位,8*0x8000=0x400000void ModifyMultiBoot(void)
{Xil_Out32(XDCFG_UNLOCK_OFFSET_ADDR , UNLOCK_XDCFG_KEY ); //写使能Xil_Out32(XDCFG_MULTIBOOT_ADDR_OFFSET_REG , APP2_LOCATION ); //更改MULTIBOOT
}

MultiBoot

zynq是按照每32KB搜索有效启动头。

2024.05.30:

学到了一个东西,这个地方可以调整,可以把文件烧到不同的地方。

程序框架搭完了,网络连接不上,还没找到原因,原来的程序就行,新建的程序不行,使用的还是同一个bsp。

后来通过一点一点注释代码,发现不能在while(1)里面加usleep,会导致网络连不上。

2024.05.31:

早上测试烧录正常,但是不能从BootLoader切换到download区。找到问题原因,修改程序:

Xil_Out32(XDCFG_MULTIBOOT_ADDR_OFFSET_REG , DOWNLOAD_LOCATION ); //更改MULTIBOOT
#define DOWNLOAD_LOCATION 0x12这个DOWNLOAD_LOCATION 以32KB为单位,0x12*0x8000=0x00100000

升级完成,成功切换了!!!

Xilinx First Stage Boot Loader Release 2018.3	May 31 2024-08:13:52
Devcfg driver initialized 
Silicon Version 3.1
Boot mode is QSPISingle Flash Information
FlashID=0xEF 0x40 0x18
WINBOND 128M Bits
QSPI is in single flash connection
QSPI is in 4-bit mode
QSPI Init Done 
Flash Base Address: 0xFC000000
Reboot status register: 0x60400000
Multiboot Register: 0x0000C000Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 2
Partition Number: 1
Header Dump
Image Word Len: 0x0000C004
Data Word Len: 0x0000C004
Partition Word Len:0x0000C004
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000075D0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFDD47C2
Application
PCAP:StatusReg = 0x40000A30
PCAP:device ready
PCAP:Clear done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x00030000
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000A30
PCAP DMA SRC ADDR 0xF8007018: 0xFC01D741
PCAP DMA DEST ADDR 0xF800701C: 0x00100001
PCAP DMA SRC LEN 0xF8007020: 0x0000C004
PCAP DMA DEST LEN 0xF8007024: 0x0000C004
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0DPCAP MCTRL 0xF8007080: 0x30800110DMA Done ! Handoff Address: 0x00100000
In FsblHookBeforeHandoff function 
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
FlashID=0xef 0x40 0x18
Successfully init QSPI
Blink,Blink,Blink
link speed for phy address 1: 100Board IP:		192.168.2.250Netmask :		255.255.255.0Gateway :		192.168.2.1
Blink,Blink,Blink
Blink,Blink,Blink
txperf: Connected to iperf serverStart QSPI Update!
file size of BOOT.bin is 3827984 BytesPerforming Erase Operation...0%..10%..20%..30%..40%..50%..60%..70%..80%..90%..100%
Erase Operation Successful.INFO:Elapsed time = 11.910 sec.Performing Program Operation...0%..10%..20%..30%..40%..50%..60%..70%..80%..90%..100%
Program Operation Successful.INFO:Elapsed time = 7.478 sec.Performing Verify Operation...0%..10%..20%..30%..40%..50%..60%..70%..80%..90%..100%
Verify Operation Successful.INFO:Elapsed time = 3.132 sec.Update QXilinx First Stage Boot Loader Release 2018.3	May 31 2024-08:15:57
Devcfg driver initialized 
Silicon Version 3.1
Boot mode is QSPISingle Flash Information
FlashID=0xEF 0x40 0x18
WINBOND 128M Bits
QSPI is in single flash connection
QSPI is in 4-bit mode
QSPI Init Done 
Flash Base Address: 0xFC000000
Reboot status register: 0x60480000
Multiboot Register: 0x0000C0E0Image Start Address: 0x00700000
Partition Header Offset:0x00700C80
Partition Count: 3
Partition Number: 1
Header Dump
Image Word Len: 0x000D6468
Data Word Len: 0x000D6468
Partition Word Len:0x000D6468
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000075D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFD75A86
Bitstream
In FsblHookBeforeBitstreamDload function 
PCAP:StatusReg = 0x40000A30
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: 0x0802000B
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000A30
PCAP DMA SRC ADDR 0xF8007018: 0xFC71D741
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x000D6468
PCAP DMA DEST LEN 0xF8007024: 0x000D6468
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C0E0
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: 0x0000C004
Data Word Len: 0x0000C004
Partition Word Len:0x0000C004Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000DDA40
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFCFE342
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: 0x00030004
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000F30
PCAP DMA SRC ADDR 0xF8007018: 0xFCA76901
PCAP DMA DEST ADDR 0xF800701C: 0x00100001
PCAP DMA SRC LEN 0xF8007020: 0x0000C004
PCAP DMA DEST LEN 0xF8007024: 0x0000C004
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C0E0
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
=====================================
------------- Enter APP -------------PROGRAM VERSION:		000.003
=====================================
FlashID=0xef 0x40 0x18
Successfully init QSPI
Blink,Blink,Blink
link speed for phy address 1: 100Board IP:		192.168.2.239Netmask :		255.255.255.0Gateway :		192.168.2.1
Blink,Blink,Blink
Blink,Blink,Blink
Blink,Blink,Blink
txperf: Connected to iperf server
start adc

然后就是要考虑在Setting区域,给boot_state、download_state、app_state、ip等信息置位。尝试了直接写,读出来值不对,查了好多资料,也没说到底怎做。

后来对比了正点原子和其他例程,开始怀疑是不是W25Q128有什么说法。

2024.06.03:

搜索了一下W25Q128说是要先擦除,再写入。

每次你要先从FLASH读出来,存在数组里,修改某个字节之后,先擦除,再写到FLASH里。还有FLASH没写过的时候全是1,只能从1变成0,不能让0变成1。如果想让0变成1,就要全部刷掉然后再写。

测试写入IP地址,确实没问题。

考虑到感觉没有必要写回滚。规划分区APP那一分区暂时不用。

从BootLoader下载APP(download区),到APP(download区)运行;从APP(download区)回到BootLoader下载新的APP(download区),再到新APP(download区)运行。运行了一圈没问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/23468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARFoundation自学05】人脸追踪(AR Face manager)实现

1. 修改摄像机朝向渲染方式-选中user 这个方式就会调用前置摄像头 2 创建 AR Session、XR Origin,然后在XR Origin上面添加组件 注意:XR Origin 老版本仍然叫 AR Session Origin 接下来在XR Origin上面添加AR Face Manager组件,如下图&am…

剧本杀市场仍在快速发展,剧本杀小程序成为了新的机遇

近年来,剧本杀一直是年轻人的娱乐游戏方式之一,剧本杀行业呈现出了井喷式发展的形势,成为了当下爆火的娱乐方式。目前,剧本杀行业拥有了完善的剧本资源和呈现方式,发展前景非常大。 根据当下的数据显示,剧…

NextJs 实现自定义点火操作

NextJs 实现自定义点火操作 前言实现自定义点火 前言 我希望在Nextjs 启动的时候,能够自定义实现一些项目的初始化逻辑,也可以说是一些点火操作,比如资源的加载,数据的初始化等操作。 实现自定义点火 我们可以在根目录下创建一…

Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41)

文章目录 Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41)1.开机动画的启动过程概述2.为什么设置了属性之后就会播放? Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41) 1.开机动画的启动过程概述 下面就是BootAnimation的重要部…

移动app测试重要性体现在哪些方面?专业app测试报告获取

移动app测试是指对手机应用进行各种测试和评估的过程,以确保应用的功能、性能和用户体验达到要求。在现代社会中,移动应用已经成为人们日常生活的一部分。无论是社交娱乐、购物支付还是工作学习,移动应用都发挥着不可替代的作用。因此&#x…

单元测试AIR原则:提升代码质量的秘密武器

文章目录 引言一、AIR原则1. Automatic(自动化)2. Independent(独立性)3. Repeatable(可重复性) 二、Automatic(自动化)三、Independent(独立性)四、Repeatab…

【MySQL】sql语句之表操作(上)

序言 在上一篇的数据库操作的内容中,学习了两种属性和常用的七种操作,学习是循序渐进的,库的操作学完了,就要开始学习表的操作了,而表可与数据强相关,比如DDL,即数据定义语言,DML&am…

DVWA-XSS(Stored)

Low 观察后端代码,对输入进行了一些过滤和转义。trim(string,charlist) 函数用于移除字符串两侧的空白字符或其他预定义字符,charlist 参数可以规定从字符串中删除哪些字符。stripslashes() 函数用于删除反斜杠。mysqli_real_escape_string() 函数用于对…

【实战】kafka3.X kraft模式集群搭建

文章目录 前言kafka2.0与3.x对比准备工作JDK安装kafka安装服务器增加hosts 修改Kraft协议配置文件格式化存储目录 启动集群停止集群测试Kafka集群创建topic查看topic列表查看消息详情生产消息消费消息查看消费者组查看消费者组列表 前言 相信很多同学都用过Kafka2.0吧&#xf…

tomcat配置请求的最大参数个数和请求数据大小

maxParameterCount"10000" maxPostSize"10485760" maxParameterCount:单个请求最大请求参数个数; maxPostSize:单个请求最大数据大小,1048576010M;

基本算法——位运算

a^b 原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目描述 运行代码 #include<iostream> using namespace std; long long a,b,c,t1; int main() {cin>>a>>b>>c;for(;b;b/2){if(b&1)tt*a%c;aa*a%c;}cout<<t%c; } 代码思路…

逻辑回归及python实现

概述 logistic回归是一种广义线性回归&#xff08;generalized linear model&#xff09;&#xff0c;因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同&#xff0c;都具有 w‘xb&#xff0c;其中w和b是待求参数&#xff0c;其区别在于他们的因变量不同&#x…

App Inventor 2 复制屏幕功能,界面设计更便捷,避免误删组件

“复制屏幕”功能全新上线&#xff0c;中文网独有&#xff08;MIT没有此功能&#xff09;&#xff0c;可以复制屏幕中的普通组件、图片、附件、拓展、代码块。更多升级详情可查看发布日志。 下面演示一下屏幕的复制效果&#xff1a; 1、Screen1屏幕上有若干组件、及一个SQLit…

美业SaaS系统源码分享-收银管理的主要功能

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 活动促销 PC管理后台、手机APP、iPad APP、微信小程序 ▶ 博弈美业-收银管理功能 1、同时支持支付宝和微信支付&#xff0c;具有简单便捷安全等优点&#xff0c;并且符…

MySQL之查询性能优化(八)

查询性能优化 MySQL查询优化器的局限性 MySQL的万能"嵌套循环"并不是对每种查询都是最优的。不过还好&#xff0c;MySQL查询优化器只对少部分查询不适用&#xff0c;而且我们往往可以通过改写查询让MySQL高效地完成工作。还有一个好消息&#xff0c;MySQL5.6版本正…

Ffmpeg安装和简单使用

Ffmpeg安装 下载并解压 进入官网 (https://ffmpeg.org/download.html)&#xff0c;选择 Window 然后再打开的页面中下滑找到 release builds&#xff0c;点击 zip 文件下载 环境变量配置 下载好之后解压&#xff0c;找到 bin 文件夹&#xff0c;里面有3个 .exe 文件 然后复制…

优思学院|六西格玛黑带官方的报考条件是什么?

经常有人私信问我六西格玛黑带证书要如何取得&#xff0c;要学历证明吗&#xff1f;要带项目吗&#xff1f;要注册吗&#xff1f; 首先&#xff0c;直接一点说&#xff0c;和任何学科一样&#xff0c;取得六西格玛证书的方法主要是通过上课学习和考试。然而&#xff0c;关于六…

【ARM Cache 及 MMU 系列文章 6.2 -- ARMv8/v9 Cache 内部数据读取方法详细介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Direct access to internal memoryL1 cache encodingsL1 Cache Data 寄存器Cache 数据读取代码实现Direct access to internal memory 在ARMv8架构中,缓存(Cache)是用来加速数据访…

Apple开发者macOS描述文件创建

1.选择Profiles然后点击加号创建 2.选择类型为macOS App Development然后点击继续 3.选择描述类型与App ID 然后点击继续 4.选择证书然后点击继续 5.选择设备,然后点击继续 6.输入描述文件后,点击生成 生成成功,点击下载描述文件 下载完成会自动打开描述文件

评判基金的重要指标(一):最大回撤率

评判基金的重要指标&#xff08;一&#xff09;&#xff1a;最大回撤率 财富奇迹创造者2023-06-14 08:00山西 问&#xff1a;如果要投资一只基金&#xff0c;如何衡量自己可能面对的风险呢&#xff1f; 答&#xff1a;衡量一个策略的风险控制能力&#xff0c;“最大回撤”是…