从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二)
前情提要:從零開(kāi)始的ZYNQ學(xué)習(xí)(基于礦卡EBAZ4205)(一)
文章目錄
- 0. 聲明
- 6. 基于Petalinux的鏡像構(gòu)建、驗(yàn)證和燒錄
- 6.1 Petalinux介紹
- 6.2 在Ubuntu中安裝Petalinux
- (1)安裝包下載
- (2)參考手冊(cè)下載
- (3)虛擬機(jī)環(huán)境搭建
- (4)安裝依賴(lài)包
- (5)安裝Petalinux
- (6)安裝驗(yàn)證
- 6.3 網(wǎng)口、TF卡的適配和Vivado工程修改
- (1)電路修改
- (2)修改ZYNQ7的IP核配置
- (3)修改塊設(shè)計(jì)
- (4)綜合、實(shí)現(xiàn)和比特流生成
- 6.4 Petalinux工程構(gòu)建過(guò)程
- (1)準(zhǔn)備工作
- (2)創(chuàng)建Petalinux工程
- (3)配置Petalinux工程
- ·1)從hdf文件初始化工程
- ·2)修改Petalinux工程配置
- ·3)修改Uboot配置(可選)
- (4)編譯Petalinux工程
- (5)生成啟動(dòng)鏡像
- (6)使用TF卡啟動(dòng)方式驗(yàn)證鏡像
- 6.5 將啟動(dòng)鏡像固化到NAND Flash
- (1)生成啟動(dòng)鏡像
- (2)使用Xilinx SDK燒錄鏡像
- (3)擴(kuò)展:通過(guò)串口燒錄image.ub
- 6.6 相關(guān)知識(shí)
- (1)從image.ub文件到FIT
- (2)RAMDisk Filesystem
- 參考資料
- 1. 相關(guān)信息
- 2. 參考描述
0. 聲明
本文由長(zhǎng)春理工大學(xué)電子信息工程學(xué)院C&I實(shí)驗(yàn)室所有,已獲得原作者發(fā)布授權(quán)。轉(zhuǎn)載請(qǐng)注明出處。
本文編寫(xiě)過(guò)程中參考了很多前輩的記錄,在此表示感謝,已將所有參考項(xiàng)列于文末。
當(dāng)前版本R1.0(預(yù)發(fā)布)。
作者聯(lián)系方式:E-mail: WindForest@yeah.net
6. 基于Petalinux的鏡像構(gòu)建、驗(yàn)證和燒錄
網(wǎng)上有大佬前輩從源碼構(gòu)建了礦卡可用的鏡像,參見(jiàn)zynq[2] Linux from scratch,實(shí)在是太詳細(xì)了,因此不再重復(fù)(實(shí)際上是我太懶不想去做)。本章嘗試使用官方提供的Petalinux工具生成啟動(dòng)鏡像,使用TF卡啟動(dòng)方式驗(yàn)證鏡像的正確性,并將其燒錄到NAND Flash中。
本章涉及到的外設(shè)有:DDR、UART1、TF、NET0。
6.1 Petalinux介紹
PetaLinux 是一種嵌入式Linux軟件開(kāi)發(fā)套件(SDK),主要用于XILINX FPGA基片上系統(tǒng)設(shè)計(jì)。由于其采用Buildroot構(gòu)建系統(tǒng),因此可以在簡(jiǎn)單的配置下,一步生成所需要的bootloader、kernel、rootfs鏡像以及應(yīng)用軟件庫(kù)。
Petalinux由Xilinx官方提供,對(duì)于不同版本的Vivado,Petalinux也有對(duì)應(yīng)的版本,安裝時(shí)需注意選擇和區(qū)分。
6.2 在Ubuntu中安裝Petalinux
這里必須得意一下,安裝流程我曾經(jīng)在CSDN上寫(xiě)過(guò),慶幸于使用的同樣是Markdown語(yǔ)言,我可以輕松將那些文字和圖片拷貝過(guò)來(lái),哈哈。
對(duì)于使用流程來(lái)說(shuō),大部分人可能還是比較喜歡Windows環(huán)境,而且因?yàn)楸緳C(jī)安裝的是Windows,而計(jì)算機(jī)硬件的資源又有限,所以在虛擬機(jī)中運(yùn)行XILINX所有的開(kāi)發(fā)工具不太方便。在參考了大部分開(kāi)發(fā)環(huán)境搭建方式后,個(gè)人覺(jué)得“在Windows下使用Vivado生成板級(jí)描述文件,傳到虛擬機(jī)中使用Petalinux生成燒錄鏡像,再使用Windows下的SDK進(jìn)行燒寫(xiě)”的開(kāi)發(fā)方式是在本地計(jì)算機(jī)資源有限的情況下比較容易被接受的。
安裝準(zhǔn)備包括安裝文件和參考文件。
(1)安裝包下載
安裝文件的名稱(chēng)是petalinux-v2017.4-final-installer.run,官方網(wǎng)站可以下載,頁(yè)面鏈接:
XILINX下載頁(yè)-petalinux存檔
安裝包選擇其中MD5值為9b406fa5cc732da52944b3ce6718e19d的7.86GB的單文件。
(2)參考手冊(cè)下載
UG1144是非常實(shí)用的手冊(cè),該用戶(hù)指南中介紹了Petalinux的一切官方讓你知道的。上圖中的右側(cè),點(diǎn)擊 Petalinux工具文檔 項(xiàng),在頁(yè)面中找到 《UG1144 - PetaLinux 工具文檔:參考指南 (中文版) (v2019.1)》 文檔下載之(當(dāng)然你照著這篇文章安裝的話(huà)可以不用參考此指南)。
可能你想問(wèn),我安裝的是2017.4版本的Petalinux,為什么這里要下載的是2019.1版本的呢?因?yàn)榻刂聊壳?#xff0c;官網(wǎng)中只有這個(gè)版本的UG1144是中文的,讀起來(lái)比較順暢,而且與2017.4版本在大體描述上相差不大(…也許吧)。
(3)虛擬機(jī)環(huán)境搭建
搭建過(guò)程網(wǎng)上有的是說(shuō)明,在此只說(shuō)一下硬盤(pán)空間分配的問(wèn)題,我把我目前安裝完之后的情況告訴你,在Ubuntu采用最小安裝、移除無(wú)關(guān)組件、安裝必要組件、安裝vmware-tool、保存安裝文件和安裝完之后的文件的情況下,硬盤(pán)占用小于30GB。
注意,這個(gè)版本的Petalinux推薦使用Ubuntu16.04.6LTS進(jìn)行安裝,因?yàn)槠渌姹镜腢buntu對(duì)它的支持可能不是很好,會(huì)出問(wèn)題,比如在Ubuntu18.04中,安裝后執(zhí)行settings.sh后會(huì)出現(xiàn)下圖所示錯(cuò)誤、以及使用petalinux-build命令編譯的時(shí)候會(huì)出現(xiàn)“需要支持en_US.UTF8”等問(wèn)題,而在Ubuntu16.04中是正常的。比如:
(4)安裝依賴(lài)包
《UG1144 - PetaLinux 工具文檔:參考指南 (中文版) (v2019.1)》文檔對(duì)Ubuntu下依賴(lài)包的配置描述不完全適用于2017.4版本的Petalinux。Petalinux2017.4的依賴(lài)包如下,直接復(fù)制粘貼運(yùn)行就行了(其中有可能安裝時(shí)會(huì)重復(fù),但是無(wú)關(guān)緊要),安裝時(shí)注意保持網(wǎng)絡(luò)暢通:
sudo apt install make net-tools libncurses-dev libncurses-dev zlib1g:i386 flex libssl-dev bison libselinux1 gnupg wget diffstat chrpath socat xterm autoconf libtool tftpd unzip texinfo zlib1g-dev gcc-multilib build-essential gzip pax screen gawk tofrodos xvfb python git libsdl1.2-dev libglib2.0-dev(5)安裝Petalinux
首先要注意此程序不能在root權(quán)限下安裝,比如運(yùn)行前加“sudo”是不行的,它會(huì)提示并且運(yùn)行不下去。
在運(yùn)行時(shí)如果不指定安裝的目錄,會(huì)安裝到安裝文件所在目錄下,而且還不會(huì)自動(dòng)新建文件夾,如果安裝到opt之類(lèi)的目錄,記得把目錄權(quán)限改成rwxr-xr-x(755),不然等上十幾分鐘之后安裝不了心情是很崩潰的。
./petalinux-v2017.4-final-installer.run /安裝位置安裝流程大致為:對(duì)安裝包校驗(yàn)->解壓文件->確認(rèn)3個(gè)協(xié)議->(安裝目錄提示——如果沒(méi)有指明目錄的話(huà))->完成安裝。
(6)安裝驗(yàn)證
首先進(jìn)入到安裝目錄下執(zhí)行:
source settings.sh而后在終端中輸入 petalinux- 并按兩次TAB鍵,如果出現(xiàn)命令補(bǔ)全提示,那么就是OK了。
如果這臺(tái)虛擬機(jī)只用來(lái)開(kāi)發(fā)Petalinux,那么可以把source語(yǔ)句寫(xiě)入到.bashrc文件中,這樣在每次啟動(dòng)終端的時(shí)候都會(huì)自動(dòng)加載了。
即在~/.bashrc文件最后增加如下語(yǔ)句:
source /petalinux安裝路徑/settings.sh那這些petalinux命令是用來(lái)干嘛的呢?參考手冊(cè)中13頁(yè)中的說(shuō)明如下:
至此,Petalinux2017.4在Ubuntu16.04下的環(huán)境配置完成。
6.3 網(wǎng)口、TF卡的適配和Vivado工程修改
(1)電路修改
在使用Etron的DRAM版本的礦卡上,建議斷開(kāi)R1485電阻并焊接C377、C380電容(22pF)和Y3晶振(25.000MHz)為IP101GA提供時(shí)鐘信號(hào),否則在U-Boot和Linux下網(wǎng)絡(luò)功能將不可用。具體說(shuō)明參見(jiàn)4.6-(1)小節(jié)。
注:為方便本章后續(xù)調(diào)試,建議修改R2584和R2577電阻接法,使用開(kāi)關(guān)選擇啟動(dòng)引腳MIO[5]為高電平或低電平,進(jìn)而實(shí)現(xiàn)TF卡啟動(dòng)方式和NAND啟動(dòng)方式的切換。
若采用上圖焊接方法,確認(rèn)無(wú)誤后切記固定,防止外力導(dǎo)致電阻焊盤(pán)脫落!
(2)修改ZYNQ7的IP核配置
Vivado工程的修改緊接著5.4-(2)小節(jié)進(jìn)行,TF卡可用于內(nèi)核鏡像的快速驗(yàn)證,網(wǎng)口則是Linux開(kāi)發(fā)的必備接口。
在ZYNQ配置界面“MIO Configuration”中,繼續(xù)勾選“ENET 0”和“SD 0”:
其中,ENET 0的IO選擇EMIO,因?yàn)樵赑S_MIO[16:27]中,MIO[24]和MIO[25]已經(jīng)被UART1占用了。SD 0的IO保持默認(rèn),其CD、WP和Power均不需選擇,因?yàn)榈V卡上未做引出。
注:因?yàn)镾D 0僅引出了數(shù)據(jù)/時(shí)鐘引腳,故不支持插拔檢測(cè)。例如從NAND啟動(dòng)后再插入TF卡,不會(huì)自動(dòng)生成設(shè)備節(jié)點(diǎn);在TF卡空閑狀態(tài)下帶電拔出后重新插入不一定會(huì)影響后續(xù)讀寫(xiě)等。
解釋:在ZYNQ中,EMIO是指從PL端引出的PS端口,與此相對(duì)的MIO是在PS內(nèi)部集成,功能固定的具有復(fù)用功能的引腳。
在“Clock Configuration”中,設(shè)置ENET 0為百兆速度:
接著,把之前裸機(jī)調(diào)試時(shí)精簡(jiǎn)掉的選項(xiàng)增加上(注:暫不清楚是否有必要):
最后,增加一個(gè)TTC模塊,Linux需要它:
(3)修改塊設(shè)計(jì)
因?yàn)榈V卡的網(wǎng)口通過(guò)EMIO引出,因此需手動(dòng)分配這些引腳。另外,由于IP101GA是千兆網(wǎng)卡,查看原理圖可知,其TXD和RXD共有8個(gè),而在百兆網(wǎng)卡使用的MII接口中,TXD和RXD僅有4個(gè),故需顯式地增加兩個(gè)Concat模塊將8位轉(zhuǎn)為4位,否則多余的引腳引出但未分配IO,最后生成比特流文件時(shí)會(huì)報(bào)錯(cuò)。
注:在ZYNQ的Block Design中,Concat IP可用于將分離的線拼接成單一線輸出,相當(dāng)于Verilog描述的拼接操作。其輸入端口數(shù)和位寬均可配置。在其它參考設(shè)計(jì)中,有使用Slice模塊代替下圖中xlconcat_1模塊的,其最終實(shí)現(xiàn)效果與下圖所示一致。
增加IP核的操作與增加ZYNQ7的IP核操作相同。
最后將這些器件按照下圖所示連接起來(lái):
注:可通過(guò)右鍵端口->“Make External”做端口引出;通過(guò)右鍵端口->“Disconnect Pin”取消引出。
(4)綜合、實(shí)現(xiàn)和比特流生成
點(diǎn)擊左側(cè)邊欄“Run Synthesis(運(yùn)行綜合)”,綜合過(guò)程中會(huì)彈出關(guān)于數(shù)據(jù)位寬的警告,此處忽略:
而后點(diǎn)擊“Open Synthesized Design(打開(kāi)綜合設(shè)計(jì))”對(duì)網(wǎng)口的引腳進(jìn)行分配,在彈出的框中點(diǎn)“Define Target”
點(diǎn)擊以生成引腳約束文件:
點(diǎn)擊“Create File”,并輸入文件名:
在“Source(資源)”視窗中打開(kāi)該引腳約束文件:
并在編輯器中輸入下列約束:
此處EMIO的設(shè)計(jì)流程大致為:將設(shè)計(jì)圖中的端口名與PL端擴(kuò)展IO建立對(duì)應(yīng)關(guān)系,并對(duì)這些擴(kuò)展IO的基本屬性和狀態(tài)進(jìn)行設(shè)置即可。
Ctrl+S保存,此時(shí)效果如下:
直接點(diǎn)擊左側(cè)邊欄的“Generate Bitstream(生成比特流)”,一鍵完成綜合、實(shí)現(xiàn)和比特流生成。
注:這里點(diǎn)擊“Generate Bitstream”只是為了方便,Petalinux構(gòu)建過(guò)程中將基于hdf文件自動(dòng)生成FSBL和需要的比特流文件。
6.4 Petalinux工程構(gòu)建過(guò)程
(1)準(zhǔn)備工作
接續(xù)上一步,Petalinux需要Vivado生成的硬件描述文件(*.hdf)作為生成鏡像的配置依據(jù),且可自動(dòng)生成FSBL和比特流文件。因此SDK中只需要建立前文中適配礦卡的下載用FSBL即可。
(2)創(chuàng)建Petalinux工程
恭喜你走到這一步!接下來(lái)我們轉(zhuǎn)到Ubuntu平臺(tái),開(kāi)始激動(dòng)人心的Petalinux工程!
注意:這里假設(shè)你已經(jīng)安裝好了Petalinux2017.4環(huán)境。
注意:請(qǐng)確保每一次打開(kāi)Terminal運(yùn)行“petalinux-xxx”命令之前,總是執(zhí)行了“source settings.sh”操作。每次打開(kāi)Terminal都需重新進(jìn)行該操作。
說(shuō)明:本文示例目錄在/home/wind/下(我的用戶(hù)名為wind),后續(xù)示例基于此路徑。
在當(dāng)前用戶(hù)目錄下打開(kāi)Terminal,執(zhí)行:
petalinux-create --type project --template zynq --name EBAZ4205-linux即可在當(dāng)前目錄下建立一個(gè)名為EBAZ4205-linux、面向ZYNQ的空白Petalinux工程。
(3)配置Petalinux工程
·1)從hdf文件初始化工程
將Vivado中導(dǎo)出的硬件描述文件(*.hdf)拷貝到Petalinux工程目錄下,并在工程目錄執(zhí)行:
petalinux-config --get-hw-description=./即可完成工程的初始化。
·2)修改Petalinux工程配置
在工程目錄下執(zhí)行:
petalinux-config進(jìn)入Petalinux的配置菜單,并做以下修改:
注:在“Linux Components Selection”項(xiàng)中我們可以看到其中默認(rèn)已經(jīng)勾選了自動(dòng)生成FSBL。
修改“Subsystem AUTO Hardware Settings(子系統(tǒng)自動(dòng)硬件設(shè)置)”->“Advance bootable images storage Settings(高級(jí)啟動(dòng)鏡像存儲(chǔ)設(shè)置)”->“boot image settings(啟動(dòng)鏡像設(shè)置)”->“image storage media(鏡像存儲(chǔ)介質(zhì))”,如果需要從NAND Flash啟動(dòng),請(qǐng)選擇“primary flash(Flash優(yōu)先)”,如果需要從TF卡啟動(dòng),請(qǐng)選擇“primary sd(SD優(yōu)先)”;
注:在此修改過(guò)程中可注意到,啟動(dòng)鏡像名(默認(rèn)為BOOT.BIN)在此處修改。
修改“Subsystem AUTO Hardware Settings(子系統(tǒng)自動(dòng)硬件設(shè)置)”->“Advance bootable images storage Settings(高級(jí)啟動(dòng)鏡像存儲(chǔ)設(shè)置)”->“kernel image settings(內(nèi)核鏡像設(shè)置)”->“image storage media(鏡像存儲(chǔ)介質(zhì))”,如果需要從NAND Flash啟動(dòng),請(qǐng)選擇“primary flash(Flash優(yōu)先)”,如果需要從TF卡啟動(dòng),請(qǐng)選擇“primary sd(SD優(yōu)先)”;
注:在此修改過(guò)程中可注意到,Uboot載入的鏡像名(默認(rèn)為image.ub)在此處修改。
修改“u-boot Configuration”->“netboot offset”項(xiàng)的值為0x08000000;
注:該值為Uboot將鏡像加載到的內(nèi)存地址,默認(rèn)為0x10000000,即256MiB,然而礦卡采用的DDR3是單片的256MiB顆粒,如果保持默認(rèn)值,會(huì)在啟動(dòng)時(shí)出現(xiàn)以下提示:
...... Loading Kernel Image ... OK Loading Ramdisk to 07a8a000, end 07fff726 ... OK ERROR: image is not a fdt - must RESET the board to recover. FDT creation failed! hanging...### ERROR ### Please RESET the board ###建議修改“Image Packaging Configuration(鏡像打包配置)”,取消選擇“Copy final images to tftpboot(拷貝最終鏡像到tftp啟動(dòng)目錄)”,這可以消除掉編譯結(jié)束后的惱人提示,讓結(jié)果展示的更加完美一點(diǎn)>v<;
建議修改“Image Packaging Configuration(鏡像打包配置)”->“Root filesystem type(根文件系統(tǒng)類(lèi)型)”為“INITRAMFS”,這將使本章進(jìn)行的更加順利,并降低學(xué)習(xí)難度。
注:不要因?yàn)閺腡F卡啟動(dòng)而將此項(xiàng)選擇為“SD Card”,否則默認(rèn)將從TF卡的第二分區(qū)啟動(dòng)根文件系統(tǒng),而本章還沒(méi)進(jìn)行到“制作、構(gòu)建和移植根文件系統(tǒng)”那一步。
而后保存并退出,等待命令完成。
·3)修改Uboot配置(可選)
在工程目錄下執(zhí)行:
petalinux-config -c u-boot進(jìn)入U(xiǎn)boot的配置菜單,并可做以下修改:
建議修改“delay in seconds before automatically booting”為2(秒),減少系統(tǒng)啟動(dòng)時(shí)間,從而提高調(diào)試效率;
建議使能“Networking support”項(xiàng),以便于網(wǎng)絡(luò)調(diào)試;
建議在“Command line interface”->“Network commands”中,增加對(duì)tftp相關(guān)命令和ping命令的支持,以便于網(wǎng)絡(luò)調(diào)試;
可以修改“Command line interface”->“Shell prompt”為自己喜歡的字符。
而后保存并退出,等待命令完成。
(4)編譯Petalinux工程
在工程目錄下執(zhí)行:
petalinux-build有記錄如此說(shuō):二次修改后可使用:
petalinux-build -x mrproper -f清除編譯緩存以防止出現(xiàn)修改不生效的情況。
注意:此命令會(huì)重置整個(gè)工程目錄,petalinux-config需要重新讀取hdf文件,但u-boot等的配置文件不會(huì)被重置。
注:作者在首次編譯通過(guò)后,使用該命令清除緩存,再次編譯出現(xiàn)了不通過(guò)的情況,不知何故。
編譯可能需要幾十分鐘(取決于計(jì)算機(jī)配置),編譯完成后,在./images/linux/下存放著生成的鏡像文件。
(5)生成啟動(dòng)鏡像
在工程目錄下執(zhí)行:
cd ./images/linux/ petalinux-package --boot --format BIN --fsbl zynq_fsbl.elf --fpga ZYNQ7010_wrapper.bit --u-boot即可在當(dāng)前目錄下生成BOOT.BIN和image.ub兩個(gè)文件,其中BOOT.BIN=FSBL+bitstream+SSBL(U-Boot);image.ub=dtb+kernel+rootfs。
注:如果./images/linux/下已經(jīng)存在BOOT.BIN和image.ub文件,則需在上述命令末尾增加“–force”以執(zhí)行覆蓋,否則會(huì)出現(xiàn)失敗提示。
(6)使用TF卡啟動(dòng)方式驗(yàn)證鏡像
取一張TF卡,格式化為FAT或FAT32,將上一步生成的BOOT.BIN和image.ub保存其中。插入到礦卡的TF卡槽中,并設(shè)置礦卡為SD啟動(dòng)方式。連接調(diào)試串口到計(jì)算機(jī)并在終端中打開(kāi),礦卡上電即可看到輸出。默認(rèn)的用戶(hù)名和密碼均為“root”。
注:需從TF卡啟動(dòng)時(shí),請(qǐng)確保Petalinux工程配置中“image storage media(鏡像存儲(chǔ)介質(zhì))”設(shè)置為“primary sd(SD優(yōu)先)”,修改后需重新編譯并生成鏡像。詳見(jiàn)6.4-(3)-2)章節(jié)。
6.5 將啟動(dòng)鏡像固化到NAND Flash
(1)生成啟動(dòng)鏡像
首先,為了使Petalinux構(gòu)建出從NAND啟動(dòng)的鏡像,需確保Petalinux工程配置中“image storage media(鏡像存儲(chǔ)介質(zhì))”設(shè)置為“primary flash(Flash優(yōu)先)”。詳見(jiàn)6.4-(3)-2)章節(jié)。
注:如果將TF卡啟動(dòng)鏡像的BOOT.BIN下載到NAND,其Uboot依然會(huì)嘗試從MMC加載,縱使SD卡存在且存有有效鏡像,這也不是我們希望的。
TF和NAND啟動(dòng)方式最大的不同在于,前者使用的啟動(dòng)命令:
fatload mmc SD器件號(hào)[0,1] 內(nèi)存載入地址 鏡像名稱(chēng)是基于文件名的,因?yàn)槲募到y(tǒng)的存在,文件的存儲(chǔ)位置顯得不那么重要。但在NAND啟動(dòng)方式中,Uboot使用的:
nand read 內(nèi)存載入地址 存儲(chǔ)起始地址 數(shù)據(jù)長(zhǎng)度則是基于地址的拷貝。因此,我們需要對(duì)Uboot分區(qū)做一些調(diào)整。
在這里我們不妨貼出兩種啟動(dòng)方式下的Uboot啟動(dòng)指令,在Uboot命令行執(zhí)行:
printenv即可打印當(dāng)前Uboot環(huán)境設(shè)置,它們有點(diǎn)多,因此我只摘抄了默認(rèn)啟動(dòng)指令部分。
SD啟動(dòng)方式的啟動(dòng)指令如下:
bootcmd=run default_bootcmd default_bootcmd=run cp_kernel2ram && bootm ${netstart} cp_kernel2ram=mmcinfo && fatload mmc 0 0x8000000 image.ub netstart=0x8000000NAND啟動(dòng)方式的啟動(dòng)指令如下:
bootcmd=run default_bootcmd default_bootcmd=run cp_kernel2ram && bootm ${netstart} cp_kernel2ram=nand read ${netstart} ${kernelstart} ${kernelsize} netstart=0x08000000 kernelstart=0x300000 kernelsize=0xa00000這里的具體設(shè)置與后文匹配。
在工程目錄下執(zhí)行:
petalinux-config進(jìn)入Petalinux工程配置,修改“Subsystem AUTO Hardware Settings(子系統(tǒng)自動(dòng)硬件設(shè)置)”->“Flash Settings(Flash設(shè)置)”為下圖所示的參數(shù):
注:這些參數(shù)取決于生成的鏡像的大小,上面的設(shè)置留出了一部分余量。
而后執(zhí)行編譯和打包,重新生成BOOT.BIN和image.ub文件,具體過(guò)程如前文所述。
(2)使用Xilinx SDK燒錄鏡像
打開(kāi)Xilinx SDK的下載界面,連接好礦卡的JTAG、串口線和供電。首先燒錄BOOT.BIN,注意BOOT.BIN的偏移為0:
而后再下載image.ub,將該文件重命名為*.bin,因?yàn)镾DK的下載器只認(rèn).mcs和.bin類(lèi)型的文件。另外別忘了設(shè)置下載偏移:
確保礦卡為NAND啟動(dòng)方式。連接調(diào)試串口到計(jì)算機(jī)并在終端中打開(kāi),礦卡重新上電即可看到輸出。默認(rèn)的用戶(hù)名和密碼均為“root”。
注:Uboot啟動(dòng)時(shí)打印:
*** Warning - bad CRC, using default environment表示從bootenv空間(前文分配的0x2E0000~0x300000)讀取的數(shù)據(jù)的CRC校驗(yàn)不正確,這是因?yàn)槭状蜗螺d時(shí)該區(qū)域中沒(méi)有有效內(nèi)容,只需在Uboot命令行中執(zhí)行一次:
saveenv保存啟動(dòng)環(huán)境配置到指定分區(qū)即可消除該警告。
(3)擴(kuò)展:通過(guò)串口燒錄image.ub
在已經(jīng)有Uboot的情況下,可使用Uboot本身提供的讀寫(xiě)命令燒錄鏡像,這里用此方式嘗試一下吧!這里使用的終端軟件為SecureCRT V8.5.3。
在Uboot命令行執(zhí)行:
mw.b 0x800000 ff 0xA00000 #將內(nèi)存中8MiB~18MiB的空間全部填充0xFF loadb 0x800000 #使用Kermit傳輸,向0x800000地址寫(xiě)入二進(jìn)制數(shù)據(jù)而后選擇“傳輸”->“發(fā)送Kermit(K)…”,找到image.ub文件并發(fā)送(下圖中發(fā)送的是之前改名之后的image.bin):
發(fā)送有點(diǎn)慢,它的速度還是很穩(wěn)定的,所以剩余時(shí)間也基本是它顯示的時(shí)長(zhǎng),趁著它下載,起來(lái)走動(dòng)走動(dòng)休息一下吧!
完成后依次執(zhí)行以下命令將內(nèi)存中的鏡像拷貝到NAND中:
nand erase 0x300000 0xA00000 #擦除NAND Flash中3MiB~13MiB的空間 nand write 0x800000 0x300000 0xA00000 #將內(nèi)存中的數(shù)據(jù)寫(xiě)入到NAND Flash整個(gè)過(guò)程的打印如下:
而后重新上電即可。
6.6 相關(guān)知識(shí)
(1)從image.ub文件到FIT
如果你有過(guò)嵌入式開(kāi)發(fā)經(jīng)驗(yàn),一定見(jiàn)過(guò)許多種不同的啟動(dòng)鏡像結(jié)構(gòu),例如海思的uboot+kernel(with dtb)+rootfs的形式、全志的u-boot spl+u-boot+dtb+kernel+rootfs的形式等等,更別說(shuō)從網(wǎng)絡(luò)啟動(dòng)以及眾多的文件系統(tǒng)類(lèi)型。但是Petalinux中使用的image.ub是什么?
還記得Petalinux的編譯過(guò)程嗎?我覺(jué)得大部分人都會(huì)在第一次編譯的時(shí)候興奮地盯著屏幕看完這一整個(gè)過(guò)程的。你會(huì)發(fā)現(xiàn)petalinux-build命令的執(zhí)行過(guò)程中依然包含了對(duì)u-boot和kernel的單獨(dú)編譯,在工程目錄下的./images/linux/下生成的文件也證實(shí)了這一點(diǎn)。另外,在配置Petalinux的時(shí)候,有指定啟動(dòng)鏡像名稱(chēng)的設(shè)置項(xiàng)。好吧,不賣(mài)關(guān)子了,餡兒都快漏出來(lái)了,image.ub是由mkimage命令生成的鏡像,是一種打包文件。(Linux中“打包”的想法真是很常見(jiàn)呢!)
在Terminal中運(yùn)行如下命令:
mkimage -l image.ub可查看某次生成的image.ub的文件組織結(jié)構(gòu)如下:
FIT description: U-Boot fitImage for plnx_arm kernel Created: Sat Nov 7 14:30:08 2020Image 0 (kernel@0)Description: Linux KernelCreated: Sat Nov 7 14:30:08 2020Type: Kernel ImageCompression: uncompressedData Size: 3745696 Bytes = 3657.91 kB = 3.57 MBArchitecture: ARMOS: LinuxLoad Address: 0x00008000Entry Point: 0x00008000Hash algo: sha1Hash value: bacb21fcc869a66f89282c1445a1bf233792c66fImage 1 (fdt@0)Description: Flattened Device Tree blobCreated: Sat Nov 7 14:30:08 2020Type: Flat Device TreeCompression: uncompressedData Size: 13641 Bytes = 13.32 kB = 0.01 MBArchitecture: ARMHash algo: sha1Hash value: 4df8b976010f034a10f63072b61051413c6ed443Image 2 (ramdisk@0)Description: ramdiskCreated: Sat Nov 7 14:30:08 2020Type: RAMDisk ImageCompression: uncompressedData Size: 5723987 Bytes = 5589.83 kB = 5.46 MBArchitecture: ARMOS: LinuxLoad Address: unavailableEntry Point: unavailableHash algo: sha1Hash value: 726dbb5b6575cdf601e6ad4973507afcd1f68b79Default Configuration: 'conf@1'Configuration 0 (conf@1)Description: Boot Linux kernel with FDT blob + ramdiskKernel: kernel@0Init Ramdisk: ramdisk@0FDT: fdt@0Configuration 1 (conf@2)Description: Boot Linux kernel with FDT blobKernel: kernel@0FDT: fdt@0從上述信息中,我們可以發(fā)現(xiàn),在所生成的image.ub中,打包了Kernel鏡像、FDT設(shè)備樹(shù)、一個(gè)RAMDisk鏡像和兩份配置,一份啟動(dòng)到RAMDisk,另一份則僅啟動(dòng)到Kernel。
在早期的Uboot鏡像格式中,Kernel(±dtb)被包裝成uImage的形式,即在二進(jìn)制文件前增加一個(gè)文件頭,用以說(shuō)明壓縮格式、鏡像類(lèi)型等。隨著FDT(Flattened Device Tree,扁平設(shè)備樹(shù))在ARM中逐漸普及,為了達(dá)成“同一內(nèi)核”的目標(biāo),Uboot設(shè)計(jì)了一種全新的鏡像格式,即FIT uImage,FIT即Flattened Image Tree(扁平鏡像樹(shù))。FIT格式可以在一個(gè)文件中包含多個(gè)鏡像和配置,這樣同一份鏡像文件就可以適配多個(gè)平臺(tái)。
FIT鏡像的使用依賴(lài)其中保存的配置項(xiàng),使用非默認(rèn)配置項(xiàng)可使用如下Uboot命令(其中#和@必須有,配置號(hào)參照上面的文件結(jié)構(gòu)):
bootm 鏡像所在內(nèi)存地址#conf@配置號(hào)具體的內(nèi)容可參見(jiàn)這篇博文:u-boot FIT image介紹
(2)RAMDisk Filesystem
我們?cè)谂渲肞etalinux的時(shí)候選擇的根文件系統(tǒng)類(lèi)型為“INITRAMFS”,還記得嗎?這種文件系統(tǒng)在啟動(dòng)時(shí)加載到內(nèi)存,因?yàn)槠溥\(yùn)行基于內(nèi)存,因此讀寫(xiě)速度很快,但它是一個(gè)只讀文件系統(tǒng)。因此想要將礦卡作為開(kāi)發(fā)板,則最好的方法還是使用可讀寫(xiě)的文件系統(tǒng)管理存儲(chǔ)器。
當(dāng)然我不打算在這章嘗試使用NAND常用的yaffs2或者TF卡常用的ext4,那是后面章節(jié)要做的事情,我只是想稍微了解一下RAMFS,并記錄下來(lái)而已。
“Initramfs”背后似乎隱藏著一個(gè)龐大的故事個(gè)長(zhǎng)長(zhǎng)的時(shí)間線。在了解Initramfs之前,我們要首先了解Initrd(Init RAM Disk,初始化RAM磁盤(pán))。Initrd是一個(gè)在系統(tǒng)引導(dǎo)過(guò)程中掛載的、以磁盤(pán)結(jié)構(gòu)存儲(chǔ)在內(nèi)存中的臨時(shí)根文件系統(tǒng),用來(lái)支持兩階段的引導(dǎo)過(guò)程。Initrd中包含必要的工具和腳本,用于在將控制權(quán)交給根文件系統(tǒng)上的init應(yīng)用程序之前掛載所需的文件系統(tǒng)。Linux內(nèi)核在此根磁盤(pán)上觸發(fā)安裝腳本(通常稱(chēng)為 linuxrc,但該名稱(chēng)不是必需的),此腳本的工作是準(zhǔn)備系統(tǒng)、切換到真正的根文件系統(tǒng),然后調(diào)用init。
雖然在一些情況下使用Initrd是必要的,但是它有一些缺點(diǎn):
- Initrd是一個(gè)完整的塊設(shè)備,他需要整個(gè)文件系統(tǒng)的開(kāi)銷(xiāo),它有一個(gè)固定的大小。選擇的Initrd太小了,所需要的腳本不適用;過(guò)大的話(huà)則會(huì)浪費(fèi)內(nèi)存。
- 因?yàn)樗且粋€(gè)真實(shí)的、 靜態(tài)的設(shè)備,它消耗 Linux 內(nèi)核中的緩存內(nèi)存和易于使用的文件(如分頁(yè)),這使得 Initrd 有更大的內(nèi)存消耗。
Initramfs 的誕生就是為了解決這些問(wèn)題。Initramfs基于tmpfs,使用cpio進(jìn)行歸檔,通過(guò)gzip進(jìn)行壓縮,它不是一個(gè)單獨(dú)的塊設(shè)備,所以沒(méi)有緩存和額外的開(kāi)銷(xiāo)。
更多的介紹來(lái)源已放在文末參考資料列表中。
參考資料
本文編寫(xiě)過(guò)程中參考的所有資料均列在下方。本文若與任何列表之外的文章、博客、視頻、教程等描述相同或相似則純屬巧合。
另在此處再次對(duì)以下資料的作者們表示感謝。
1. 相關(guān)信息
2. 參考描述
————2020-11-17 @燕衛(wèi)博————
總結(jié)
以上是生活随笔為你收集整理的从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【论文阅读笔记】Ocean: 目标感知的
- 下一篇: 【Cloudaily】3.15五招教你辨