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.pswp.cn/web/23468.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23468.shtml
英文地址,請注明出處:http://en.pswp.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…

常微分方程 (ODE) 和 隨機微分方程 (SDE)

常微分方程(Ordinary Differential Equations, ODE)和隨機微分方程(Stochastic Differential Equations, SDE)是數學中描述系統動態行為的重要工具。它們有一些相似之處,但在處理隨機性方面存在顯著差異。 常微分方程…

Oracle數據庫面試題-5

81. 請解釋Oracle數據庫中的自動空間重新壓縮(Automatic Space Recompression)的概念。 Oracle 數據庫中的自動空間重新壓縮(Automatic Space Recompression) 自動空間重新壓縮是 Oracle 數據庫中的另一個重要特性,它…

Vue響應式系統分支切換與cleanup - 清除遺留的副作用函數

文章目錄 前言分支切換與cleanup分支切換的問題依賴集合的收集cleanup的實現完整的代碼展示 前言 本篇文章代碼思路來自 Vue3.0 源碼, 部分理解來源于霍春陽 《Vue.js設計與實現》這本書的理解, 感興趣的小伙伴可以自行購買閱讀。可以非常明確的感受到作者對 Vue 的深刻理解以及…

每天寫java到期末考試(6.6)-java文件輸入輸出流實驗

1、用字節流讀寫二進制文件 要求:用DataOutputStreamFileOutputStream類將1,2,…,100,這100個數字寫入到文件 d:\out1.bin里,然后再用DatalnputStreamFilelnputStream類將d:\out1.bin的內讀出來,并輸出到屏幕上。 用DataOutputStreamFileOutputStream寫入二進制數據時,直接調…

單元測試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() 函數用于對…

SAAS系統架構設計剖析

多租戶數據隔離 用戶擔心數據安全性,也就是要做數據隔離,不允許 A 租戶查到 B 租戶的數據 1、軟隔離 數據在一起,只不過帶著租戶 id 查詢 在底層驅動 jar 上進行封裝,強制帶上租戶 id 比如:MySQL、MQ、Redis&#…

【論文精讀】DCRNN-擴散圖卷積循環神經網絡

DCRNN 模型是南加州大學的 Li 等人發表在 I C L R 2018 ICLR 2018 ICLR2018 會議上一個用于交通預測的時空預測模型,論文題目為: 《DIFFUSION CONVOLUTIONAL RECURRENT NEURAL NETWORK: DATA-DRIVEN TRAFFIC FORECASTING》,文章地址為: https://arxiv.org/abs/1707.01926。 …

vs中運行程序時,報不能運行解決方式

問題 在vs中編譯運行程序中,如果程序還在運行,編譯會報錯,但是在后臺又找不到對應的程序 解決方式 1、tasklist | find “進程名” 2、taskkill /PID

【實戰】kafka3.X kraft模式集群搭建

文章目錄 前言kafka2.0與3.x對比準備工作JDK安裝kafka安裝服務器增加hosts 修改Kraft協議配置文件格式化存儲目錄 啟動集群停止集群測試Kafka集群創建topic查看topic列表查看消息詳情生產消息消費消息查看消費者組查看消費者組列表 前言 相信很多同學都用過Kafka2.0吧&#xf…

二叉樹的鏡像--c++【做題記錄】

【問題描述】 給定擴展二叉樹的前序序列,構建二叉樹。 求這課二叉樹的鏡像,并輸出其前序遍歷序列。 【輸入形式】 輸入擴展二叉樹的前序序列。 【輸出形式】 輸出鏡像二叉樹的前序遍歷序列。 【樣例輸入】 ab##cd##e## 【樣例輸出】 鏡像后二叉樹的前序遍…

功能問題:如何防止接口重復請求?

大家好,我是大澈! 本文約 1400 字,整篇閱讀約需 3 分鐘。 防止接口重復請求在軟件開發中非常重要,重復請求必然會導致服務器資源的浪費。 因為每次請求都需要服務器進行處理,如果請求是重復的,那么服務…

乘船過河(ship)

合肥市第33屆信息學競賽(2016年) 題目描述 Description 卡卡西和小朋友們要乘船過河了,港口有很多條船可以租到,并且之間沒有區別,每條船的出租費用也是一樣的。但是一條船最多只能乘坐兩個人,且乘客的總…

STM32 IIC 使用 HAL 庫操作eeprom

在STM32上通過I2C接口(注意:在標準STM32庫中,I2C接口通常被寫為"I2C"而不是"IIC")與EEPROM芯片通信時,你需要遵循I2C通信協議,并使用STM32的HAL庫或標準外設庫(如果適用&am…