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

2024-06-03 19:52

本文主要是介绍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区)运行。运行了一圈没问题。

这篇关于zynq-7015启动分析及裸机BootLoader编写(未完待续)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1027955

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

SpringBoot项目是如何启动

启动步骤 概念 运行main方法,初始化SpringApplication 从spring.factories读取listener ApplicationContentInitializer运行run方法读取环境变量,配置信息创建SpringApplication上下文预初始化上下文,将启动类作为配置类进行读取调用 refresh 加载 IOC容器,加载所有的自动配置类,创建容器在这个过程