Zynq中存儲程序的地方有QSPI Flash,SD卡,EMMC。
Zynq的程序分為三部分,上電啟動的引導程序(fsbl),FPGA的程序,arm程序。這里以arm程序存儲位置為主進行討論。
1 ARM為裸機程序
裸機程序比較小,可以將全部程序(fsbl,F(xiàn)PGA的程序,arm程序)一起存儲在QSPI Flash,SD卡,EMMC中的任何一個位置。
1.1 固化在QSPI FLASH
使用JTAG和sdk固化。
或者先運行程序,然后通過程序將可執(zhí)行文件寫入到QSPI Flash中,然后將啟動方式設置為QSPI Flash啟動,下次啟動就可以從QSPI Flash啟動了。
1.2 固化在SD卡
通過讀卡器將可執(zhí)行文件復制進SD卡,將啟動方式設置為SD卡啟動,下次啟動就可以從SD卡啟動了。
1.3 固化在EMMC中
先運行sd卡中的程序(或者通過jtag運行程序),然后通過程序將可執(zhí)行文件寫入到emmc中,然后將啟動方式設置為emmc啟動,下次啟動就可以從emmc啟動了。
2 ARM為運行linux的程序
linux跟文件系統(tǒng)一般比較大,全部固化在QSPI Flash中裝不下。可以在QSPI Flash中固化一部分。
2.1 部分固化在QSPI FLASH中
可以在QSPI Flash中固化 fsbl+uboot+FPGA的程序+linux內核+設備樹,將根文件系統(tǒng)存儲在emmc中。
fsbl+uboot本身已經可以運行,uboot運行后會將其余部分拷貝到內存繼續(xù)運行。以下是uboot中的zynq-common.h中的一部分程序。
"qspiboot=echo Copying Linux from QSPI flash to RAM... && "
"sf probe 0 0 0 && "
"sf read ${bitstream_load_address} 0x120000 ${bitstream_size} && "
"fpga loadb 0 ${bitstream_load_address} ${bitstream_size} && "
"sf read ${kernel_load_address} 0x540000 ${kernel_size} && "
"sf read ${devicetree_load_address} 0x520000 ${devicetree_size} && "
"bootz ${kernel_load_address} - ${devicetree_load_address}?"
第三行是將fpga文件拷貝到內存中,第四行是處理內存中的fpga程序,第五行是將linux內核文件拷貝到內存中,第六行是將設備樹文件拷貝到內存中。然后開始運行內核。內核運行后會去運行emmc中的根文件系統(tǒng)。
可以看出 fsbl+uboot+FPGA的程序和裸機程序是一樣的,剩下的就是uboot執(zhí)行程序的一部分。如果linux內核+設備樹存儲在別的地方,只需要將上述程序修改為從相應地方拷貝到內存就可以。
固化的話,可以在sd卡中先運行程序,然后按照設定將QSPI Flash分區(qū)并將對應的執(zhí)行程序復制進QSPI Flash中,將emmc格式化為ext4文件系統(tǒng)在將跟文件系統(tǒng)復制進emmc中。再將啟動方式設置為QSPI Flash啟動,下次啟動就可以從qspi啟動了。
Qspi存儲程序的分區(qū)大小可以自定義但是要能存的下程序,比如fpga程序3Mb不能只給個2Mb的分區(qū)。
2.2 固化在SD卡
通過讀卡器將可執(zhí)行文件復制進SD卡,將啟動方式設置為SD卡啟動,下次啟動就可以從SD卡啟動了。
2.3 固化在EMMC中
先運行sd卡中的程序,然后通過程序將可執(zhí)行文件寫入到emmc中,然后將啟動方式設置為emmc啟動,下次啟動就可以從emmc啟動了。
3 區(qū)別與聯(lián)系
可以看出帶Linux的就是多了一段跳轉,固化在QSPI Flash中的時候由于全部程序比較大需要分散放。fsbl+第一段ARM程序需要在一起并且名字是固定的為BOOT.BIN(這是芯片內部預置程序決定的)。
-
FlaSh
+關注
關注
10文章
1635瀏覽量
148033 -
Linux
+關注
關注
87文章
11304瀏覽量
209523 -
程序
+關注
關注
117文章
3787瀏覽量
81049 -
Zynq
+關注
關注
10文章
609瀏覽量
47182 -
emmc
+關注
關注
7文章
216瀏覽量
52745
發(fā)布評論請先 登錄
相關推薦
評論