真是个棘手的问题啊,因为同样的代码,之前在Alinx的核心板上验证过是没有问题的,但是在自己设计的板子上就不行了。关键是不是一直不行,是有时候烧录进去能正常启动,有时候烧录进去就卡死。
出了这个问题,没有解决思路就开始网上搜,一下是在这过程中搜索到的有用的信息:
1.zynq-7015使用lwip-tcp远程对QSPI进行更新、QSPI FLASH启动
这个里面提供了一些检索的链接,有可能可以解决你的问题,总结起来就是网络调试助手有问题,文中还包含了一些其他链接,比如说的Flash有坏块之类的。很不幸这个没能解决我的问题!
2.江山易改本性难移之ZYNQ SDK FSBL加载启动代码详解
然后就是看了这篇文章,主要是研究一下出现这个DMA DONE
之后卡在什么流程,具体可以读一下这个文章,写的不错,很清晰,也能定位到最终卡死在哪里,但是没有能力解决,很尴尬。
3.pbuf结构中的内容
研究这个内容主要是因为参考的正点原子的代码,而在tcp传输bin文件这里使用到pbuf,当时没看懂这里的代码,怕是代码有问题,所以看了一下,确定代码没有问题。在这期间也使用了Alinx的代码,发现出错的概率比正点原子小很多,但是Alinx的需要配合他们自己的软件上位机使用,而且没法看到当前烧录的进度。
4.ZYNQ控制程序重启与重定位
到这里就是基本解决了问题了,需要将烧录之后的代码自动重启,而不需要手动启动,但是这里还是有点问题,就是会出现烧录完成之后不会自动重启,而是需要手动断电重启。
正常启动打印信息
Xilinx First Stage Boot Loader
Release 2018.3 Aug 7 2024-14:54:55
Devcfg driver initialized //Processor Configuration Access Port即处理器配置接口,连接软件和硬件的桥梁
Silicon Version 3.1 //获取PS版本号
Boot mode is QSPI //读取启动模式寄存器后确定启动方式是QSPI
Single Flash Information
FlashID=0xEF 0x40 0x19
WINBOND 256M 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: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 3 //总的partition的数量,即共有3个段;分别为fsbl.elf、fpga.bit、app.elf
Partition Number: 1 //最开始的partition就是fsbl自身,当前已经在BootROM中运行了,所以不用管;这里的==1==就是指向fpga.bit这个段
Header Dump
Image Word Len: 0x000F6EC0 //fpga.bit的大小 3950KB
Data Word Len: 0x000F6EC0
Partition Word Len:0x000F6EC0
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000075D0
Partition Attr: 0x00000020 //用来判断文件属性,例如FPGA.bit或者application.elf
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFD13B7E
Bitstream //利用上面的partition attr识别出的文件属性
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: 0xFF