日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二)

發(fā)布時(shí)間:2023/12/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前情提要:從零開(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)增加上(注:暫不清楚是否有必要):

  • 選擇“Clock Configuration”->“PL Fabric Clocks”中“FCLK_CLK0”項(xiàng);
  • 選擇“PS-PL Configuration”->“AXI Non Secure Enablement”->“GP Master AXI Interface”中“M AXI GP0 interface”項(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)該引腳約束文件:


    并在編輯器中輸入下列約束:

    set_property IOSTANDARD LVCMOS33 [get_ports ENET0_GMII_RX_CLK_0] set_property IOSTANDARD LVCMOS33 [get_ports ENET0_GMII_TX_CLK_0] set_property IOSTANDARD LVCMOS33 [get_ports {ENET0_GMII_TX_EN_0[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_txd[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_txd[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_txd[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_txd[3]}] set_property IOSTANDARD LVCMOS33 [get_ports ENET0_GMII_RX_DV_0] set_property IOSTANDARD LVCMOS33 [get_ports MDIO_ETHERNET_0_0_mdc] set_property IOSTANDARD LVCMOS33 [get_ports MDIO_ETHERNET_0_0_mdio_io] set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_rxd[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_rxd[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_rxd[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {enet0_gmii_rxd[3]}]set_property PACKAGE_PIN U14 [get_ports ENET0_GMII_RX_CLK_0] set_property PACKAGE_PIN U15 [get_ports ENET0_GMII_TX_CLK_0] set_property PACKAGE_PIN W19 [get_ports {ENET0_GMII_TX_EN_0[0]}] set_property PACKAGE_PIN W18 [get_ports {enet0_gmii_txd[0]}] set_property PACKAGE_PIN Y18 [get_ports {enet0_gmii_txd[1]}] set_property PACKAGE_PIN V18 [get_ports {enet0_gmii_txd[2]}] set_property PACKAGE_PIN Y19 [get_ports {enet0_gmii_txd[3]}] set_property PACKAGE_PIN W16 [get_ports ENET0_GMII_RX_DV_0] set_property PACKAGE_PIN W15 [get_ports MDIO_ETHERNET_0_0_mdc] set_property PACKAGE_PIN Y14 [get_ports MDIO_ETHERNET_0_0_mdio_io] set_property PACKAGE_PIN Y16 [get_ports {enet0_gmii_rxd[0]}] set_property PACKAGE_PIN V16 [get_ports {enet0_gmii_rxd[1]}] set_property PACKAGE_PIN V17 [get_ports {enet0_gmii_rxd[2]}] set_property PACKAGE_PIN Y17 [get_ports {enet0_gmii_rxd[3]}]

    此處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=0x8000000

    NAND啟動(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)信息

  • ZYNQ Block Design中總線位寬的截取與合并操作
  • ZYNQ跑系統(tǒng) 系列(二) petalinux方式移植linux_CSDN
  • zynq的uboot模式下TFTP更新bit、內(nèi)核等文件_CSDN
  • ZYNQ petalinux系統(tǒng)啟動(dòng)文件固化到FLASH
  • Petalinux制作linux系統(tǒng)(續(xù))image.ub文件來(lái)龍去脈_CSDN
  • u-boot FIT image介紹
  • ZYNQ SoC嵌入式開(kāi)發(fā)(一):配置SD卡作為根文件系統(tǒng)_CSDN
  • PetaLinux啟動(dòng)過(guò)程解析
  • [Bootloader]uboot的環(huán)境變量保存在哪?
  • U-Boot移植–環(huán)境變量保存位置
  • nandflash啟動(dòng)設(shè)置環(huán)境變量導(dǎo)致不能啟動(dòng)
  • NAND上 u-boot 保存環(huán)境變量
  • linux中的rootfs/initrd/ramfs/initramfs
  • Initramfs/指南
  • initramfs
  • 2. 參考描述

  • zynq7010之EBAZ4205入門(mén)改造_CSDN
  • “關(guān)于EBAZ4205的PL部分的時(shí)鐘的說(shuō)明_OSCHINA”
  • zynq7010之EBAZ4205之helloworld_CSDN
  • 100塊學(xué)會(huì)ZYNQ-礦板Nand Flash燒寫(xiě)和啟動(dòng)_CSDN
  • zynq 制作鏡像_CSDN
  • EBAZ4205 ZYNQ 7Z010 裸機(jī)程序NAND固化 JTAG調(diào)試方法_簡(jiǎn)書(shū)
  • 【ZYNQ】EBAZ4205 ZYNQ 7010礦板改造開(kāi)發(fā)板_CSDN
  • ZYNQ 從NAND flash啟動(dòng)應(yīng)用筆記_CSDN
  • zynq[1] 礦板helloworld
  • zynq[2] Linux from scratch
  • zynq[3] bootstrap Ubuntu
  • EBAZ4205礦板petalinux開(kāi)發(fā) LINUX工程_CSDN
  • ————2020-11-17 @燕衛(wèi)博————

    總結(jié)

    以上是生活随笔為你收集整理的从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。