当前位置:   article > 正文

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

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:

参考我自己写的思路:

规划分区:

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

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

#define FSBL_DEBUG_INFO

控制程序重启:

  1. #define PSS_RST_CTRL_REG 0xF8000200 //PSS_RST_CTRL寄存器,绝对地址,
  2. #define SLCR_UNLOCK_ADDR 0xF8000008 //SLCR_UNLOCK寄存器,绝对地址,
  3. #define UNLOCK_KEY 0xDF0D //使能码
  4. #define PSS_RST_MASK 0x01 //复位码
  5. void PsSoftwareReset(void)
  6. {
  7. Xil_Out32(SLCR_UNLOCK_ADDR, UNLOCK_KEY); //写使能
  8. Xil_Out32(PSS_RST_CTRL_REG, PSS_RST_MASK); //复位
  9. }

2024.05.29:

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

控制程序跳转:

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

MultiBoot

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

2024.05.30:

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

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

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

2024.05.31:

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

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

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

  1. Xilinx First Stage Boot Loader
  2. Release 2018.3 May 31 2024-08:13:52
  3. Devcfg driver initialized
  4. Silicon Version 3.1
  5. Boot mode is QSPI
  6. Single Flash Information
  7. FlashID=0xEF 0x40 0x18
  8. WINBOND 128M Bits
  9. QSPI is in single flash connection
  10. QSPI is in 4-bit mode
  11. QSPI Init Done
  12. Flash Base Address: 0xFC000000
  13. Reboot status register: 0x60400000
  14. Multiboot Register: 0x0000C000
  15. Image Start Address: 0x00000000
  16. Partition Header Offset:0x00000C80
  17. Partition Count: 2
  18. Partition Number: 1
  19. Header Dump
  20. Image Word Len: 0x0000C004
  21. Data Word Len: 0x0000C004
  22. Partition Word Len:0x0000C004
  23. Load Addr: 0x00100000
  24. Exec Addr: 0x00100000
  25. Partition Start: 0x000075D0
  26. Partition Attr: 0x00000010
  27. Partition Checksum Offset: 0x00000000
  28. Section Count: 0x00000001
  29. Checksum: 0xFFDD47C2
  30. Application
  31. PCAP:StatusReg = 0x40000A30
  32. PCAP:device ready
  33. PCAP:Clear done
  34. PCAP register dump:
  35. PCAP CTRL 0xF8007000: 0x4C00E07F
  36. PCAP LOCK 0xF8007004: 0x0000001A
  37. PCAP CONFIG 0xF8007008: 0x00000508
  38. PCAP ISR 0xF800700C: 0x00030000
  39. PCAP IMR 0xF8007010: 0xFFFFFFFF
  40. PCAP STATUS 0xF8007014: 0x00000A30
  41. PCAP DMA SRC ADDR 0xF8007018: 0xFC01D741
  42. PCAP DMA DEST ADDR 0xF800701C: 0x00100001
  43. PCAP DMA SRC LEN 0xF8007020: 0x0000C004
  44. PCAP DMA DEST LEN 0xF8007024: 0x0000C004
  45. PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
  46. PCAP MBOOT 0xF800702C: 0x0000C000
  47. PCAP SW ID 0xF8007030: 0x00000000
  48. PCAP UNLOCK 0xF8007034: 0x757BDF0D
  49. PCAP MCTRL 0xF8007080: 0x30800110
  50. DMA Done !
  51. Handoff Address: 0x00100000
  52. In FsblHookBeforeHandoff function
  53. SUCCESSFUL_HANDOFF
  54. FSBL Status = 0x1
  55. FlashID=0xef 0x40 0x18
  56. Successfully init QSPI
  57. Blink,Blink,Blink
  58. link speed for phy address 1: 100
  59. Board IP: 192.168.2.250
  60. Netmask : 255.255.255.0
  61. Gateway : 192.168.2.1
  62. Blink,Blink,Blink
  63. Blink,Blink,Blink
  64. txperf: Connected to iperf server
  65. Start QSPI Update!
  66. file size of BOOT.bin is 3827984 Bytes
  67. Performing Erase Operation...
  68. 0%..10%..20%..30%..40%..50%..60%..70%..80%..90%..100%
  69. Erase Operation Successful.
  70. INFO:Elapsed time = 11.910 sec.
  71. Performing Program Operation...
  72. 0%..10%..20%..30%..40%..50%..60%..70%..80%..90%..100%
  73. Program Operation Successful.
  74. INFO:Elapsed time = 7.478 sec.
  75. Performing Verify Operation...
  76. 0%..10%..20%..30%..40%..50%..60%..70%..80%..90%..100%
  77. Verify Operation Successful.
  78. INFO:Elapsed time = 3.132 sec.
  79. Update Q
  80. Xilinx First Stage Boot Loader
  81. Release 2018.3 May 31 2024-08:15:57
  82. Devcfg driver initialized
  83. Silicon Version 3.1
  84. Boot mode is QSPI
  85. Single Flash Information
  86. FlashID=0xEF 0x40 0x18
  87. WINBOND 128M Bits
  88. QSPI is in single flash connection
  89. QSPI is in 4-bit mode
  90. QSPI Init Done
  91. Flash Base Address: 0xFC000000
  92. Reboot status register: 0x60480000
  93. Multiboot Register: 0x0000C0E0
  94. Image Start Address: 0x00700000
  95. Partition Header Offset:0x00700C80
  96. Partition Count: 3
  97. Partition Number: 1
  98. Header Dump
  99. Image Word Len: 0x000D6468
  100. Data Word Len: 0x000D6468
  101. Partition Word Len:0x000D6468
  102. Load Addr: 0x00000000
  103. Exec Addr: 0x00000000
  104. Partition Start: 0x000075D0
  105. Partition Attr: 0x00000020
  106. Partition Checksum Offset: 0x00000000
  107. Section Count: 0x00000001
  108. Checksum: 0xFFD75A86
  109. Bitstream
  110. In FsblHookBeforeBitstreamDload function
  111. PCAP:StatusReg = 0x40000A30
  112. PCAP:device ready
  113. PCAP:Clear done
  114. Level Shifter Value = 0xA
  115. Devcfg Status register = 0x40000A30
  116. PCAP:Fabric is Initialized done
  117. PCAP register dump:
  118. PCAP CTRL 0xF8007000: 0x4C00E07F
  119. PCAP LOCK 0xF8007004: 0x0000001A
  120. PCAP CONFIG 0xF8007008: 0x00000508
  121. PCAP ISR 0xF800700C: 0x0802000B
  122. PCAP IMR 0xF8007010: 0xFFFFFFFF
  123. PCAP STATUS 0xF8007014: 0x00000A30
  124. PCAP DMA SRC ADDR 0xF8007018: 0xFC71D741
  125. PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
  126. PCAP DMA SRC LEN 0xF8007020: 0x000D6468
  127. PCAP DMA DEST LEN 0xF8007024: 0x000D6468
  128. PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
  129. PCAP MBOOT 0xF800702C: 0x0000C0E0
  130. PCAP SW ID 0xF8007030: 0x00000000
  131. PCAP UNLOCK 0xF8007034: 0x757BDF0D
  132. PCAP MCTRL 0xF8007080: 0x30800100
  133. ...................................................................................................
  134. DMA Done !
  135. FPGA Done !
  136. In FsblHookAfterBitstreamDload function
  137. Partition Number: 2
  138. Header Dump
  139. Image Word Len: 0x0000C004
  140. Data Word Len: 0x0000C004
  141. Partition Word Len:0x0000C004
  142. Load Addr: 0x00100000
  143. Exec Addr: 0x00100000
  144. Partition Start: 0x000DDA40
  145. Partition Attr: 0x00000010
  146. Partition Checksum Offset: 0x00000000
  147. Section Count: 0x00000001
  148. Checksum: 0xFFCFE342
  149. Application
  150. PCAP:StatusReg = 0x40000F30
  151. PCAP:device ready
  152. PCAP:Clear done
  153. PCAP register dump:
  154. PCAP CTRL 0xF8007000: 0x4C00E07F
  155. PCAP LOCK 0xF8007004: 0x0000001A
  156. PCAP CONFIG 0xF8007008: 0x00000508
  157. PCAP ISR 0xF800700C: 0x00030004
  158. PCAP IMR 0xF8007010: 0xFFFFFFFF
  159. PCAP STATUS 0xF8007014: 0x00000F30
  160. PCAP DMA SRC ADDR 0xF8007018: 0xFCA76901
  161. PCAP DMA DEST ADDR 0xF800701C: 0x00100001
  162. PCAP DMA SRC LEN 0xF8007020: 0x0000C004
  163. PCAP DMA DEST LEN 0xF8007024: 0x0000C004
  164. PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
  165. PCAP MBOOT 0xF800702C: 0x0000C0E0
  166. PCAP SW ID 0xF8007030: 0x00000000
  167. PCAP UNLOCK 0xF8007034: 0x757BDF0D
  168. PCAP MCTRL 0xF8007080: 0x30800110
  169. DMA Done !
  170. Handoff Address: 0x00100000
  171. In FsblHookBeforeHandoff function
  172. SUCCESSFUL_HANDOFF
  173. FSBL Status = 0x1
  174. =====================================
  175. ------------- Enter APP -------------
  176. PROGRAM VERSION: 000.003
  177. =====================================
  178. FlashID=0xef 0x40 0x18
  179. Successfully init QSPI
  180. Blink,Blink,Blink
  181. link speed for phy address 1: 100
  182. Board IP: 192.168.2.239
  183. Netmask : 255.255.255.0
  184. Gateway : 192.168.2.1
  185. Blink,Blink,Blink
  186. Blink,Blink,Blink
  187. Blink,Blink,Blink
  188. txperf: Connected to iperf server
  189. 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区)运行。运行了一圈没问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/676152
推荐阅读
相关标签
  

闽ICP备14008679号