前面我已經把PetaLinux成功安裝到了Ubuntu虛擬機當中了,接下來就要實際操做,將PetaLinux移植到咱們本身的硬件平臺當中去。linux
step1:硬件描述文件ios
有兩種PetaLinux工程創建的方法,一種是下載官方開發板的BSP包並安裝,一種就是針對本身的硬件平臺去剪裁Linux功能以適應本身的需求。bash
第一種,比較簡單,官方提供了完整的demo和已經預編譯好的各類文件。app
好比說咱們從網上下載了Avnet-Digilent-ZedBoard-v2015.4-final.bsp,咱們直接執行下面的命令就能夠安裝這個BSP包了。安裝完成後,PetaLinux工程就安裝在了Avnet-Digilent-ZedBoard-v2015.4-final文件夾下面。能夠選擇本身從新編譯,或者直接使用預編譯好的文件直接拷貝到SD卡中,立刻就可以在ZedBoard上運行PetaLinux了。ide
petalinux-create -t project -s ./Avnet-Digilent-ZedBoard-v2015.4-final.bsp
第二種,根據咱們自行設計的硬件平臺去建立PetaLinux工程。這就稍微複雜一些了,須要進行各類配置,我也是嘗試了各類配置方法,最終得到了一個基本上知足我需求的結果。測試
選用的芯片是ZYNQ系列的芯片,咱們將會在內部的ARM硬核上去跑Linux。ui
首先,爲了讓PetaLinux正常的運行,須要分配一些硬件外設資源給PetaLinux,文檔ug1144中也說明了PetaLinux中對Zynq-7000系列FPGA硬件資源的需求。若用到了MicroBlaze或者Zynq Ultrascal+ MPSoC的話,本身查看文檔說明吧。spa
1.TTC模塊(必須) #若是多個TTC都使用了的話,Linux內核將會使用第一個TTC模塊。 2.外部32MB存儲空間(必須) 3.UART模塊(可選,控制檯打印信息用) #若是用UART IP模塊的話,如AXI UART,須要確保中斷信號有鏈接到PS 4.非易失存儲器(可選) #如QSPI Flash,SD/MMC 5.以太網接口(可選) #若果用Ethernet IP模塊或外部PHY的話,須要確保中斷信號鏈接道PS
知道這些後,咱們在Vivado中設計硬件平臺時須要預留好上述模塊就能夠了。Vivado設計,綜合,實現後,咱們在Vivado中使用「Export Hardware」輸出PetaLinux須要的硬件描述文件。設計
輸出的文件都在「/<vivado project>/<project name>.sdk/<top module name>_hw_platform_0」文件夾下。版本控制
若是咱們使用的是Windows版本的Vivado,咱們就須要把「***_hw_platform_0」這個文件夾拖到Linux虛擬機當中去。若是使用Linux版本的Vivado,以後直接定位到這個文件夾就能夠了。
step2:建立PetaLinux工程
接下來就可以根據這些硬件描述文件,來建立基於咱們本身的硬件平臺的PetaLinux工程了。
首先,建立一個PetaLinux工程目錄。執行命令:
#建立工程,針對Zynq芯片,工程名稱ifc_petalinux petalinux-create --type project --template zynq --name ifc_petalinux
建立成功後,在ifc_petalinux目錄下將包含2個文件夾和一個文件,以下所示。
接着,咱們來引用剛纔輸出的硬件描述文件。執行命令:
petalinux-config --get-hw-description=/home/xilinx-arm/PetaLinux/ifc_v1_0/ifc_hw_description/IFC_TOP_wrapper_hw_platform_0
由於是空工程,咱們會進入一個配置界面。在裏面咱們能夠配置一些系統參數,主要的配置包括:啓動方式,啓動存儲器分區表,啓動文件名稱等等。
這裏咱們僅須要修改兩個啓動方式選項便可。boot和kernel的存儲位置,都選到QSPI Flash便可。配置以下:
#Subsystem AUTO Hardware Settings ---> # Advanced bootable images storage Settings ---> # boot image settings ---> # image storage media ---> choose primary flash # kernel image settings ---> # image storage media ---> choose primary flash
這裏要說明一下,由於我本身的板子上包含了QSPI Flash、eMMC、USB,而沒有SD卡、以太網。
因此很是尷尬,不能經過簡單的SD卡複製文件去進行系統boot,必須經過JTAG下載BOOT.bin和image.ub文件。很是很是的e'xin!!下載兩個文件就要下載很久,這也致使我每次嘗試都花費大量時間在下載Flash上。
因此在這裏,建議你們必定要在設計板子的時候儘可能留好SD卡的位置,或者就算留上幾個測試點飛線出來也好,對開發來講確定會提供不少方便。
回到正題,配置完成後,按ESC並選擇YES保存配置。系統就自動進行配置了,配置成功的打印信息以下:
爲了方便咱們以後複製和修改文件,執行命令:
chmod -R 777 ../ifc_petalinux/
step3:內核配置
由於硬件平臺沒有SD卡和網口,尷尬的我很難複製文件。想了個辦法,就是經過U盤去複製文件,因此我須要把USB配置一下,讓系統可以識別出U盤,並進行讀寫操做。並且之後可能用到USB攝像頭,就順便把這個功能也打開吧。參考網址:http://www.wiki.xilinx.com/Zynq+Linux+USB+Device+Driver
配置kernel,執行命令:
petalinux-config -c kernel
打開了kernel的配置界面,
USB的配置以下:
#Device Drivers ---> # USB support ---> # <*> Support for Host-side USB # <*> OTG support # <*> EHCI HCD (USB 2.0) support # <*> USB Mass Storage support # <*> ChipIdea Highspeed Dual Role Controller # <*> ChipIdea host controller # <*> ChipIdea device controller # USB Physical Layer drivers ---> # <*> NOP USB Transceiver Driver ####!!!在2015.4中不用打開這個 # <*> USB Gadget Support # <M> USB Gadget Drivers # <M> USB functions configurable through configfs # [*] Mass storage
上面都是按照OTG功能來配置的,但我暫時沒有OTG的轉接線,無法調試不敢確認是否能用,因此咱們最後在設備樹中只開啓host功能。
其實除了「NOP USB Transceiver Driver」是默認沒有打開,剩下都是默認打開的,我最終根據本身的配置並無打開這個選項!!!
USB攝像頭配置以下:
#Device Drivers ---> # Multimedia Support ---> # Media USB Adapter ---> # <*>USB Video Class (UVC) (also UVC Input Event Support) #打開 # USB Support ---> # < >USB 2.0 OTG FSM Implementation #關閉
配置完成後,ESC並保存。
step4:設備樹配置
我設計的板子是參考ZYBO開發板的,usb phy上有一個reset引腳鏈接到了PS的MIO46管腳上。
須要在設備樹中告訴系統。
設備樹文件都在目錄 ./subsystems/linux/configs/device-tree 底下
首先修改pcw.dtsi文件:(在最下面的問題二中,解決了usb reset的問題。按照解決方法配置好後,就不用修改pcw.dtsi文件了,它可以自動生成!)
gedit subsystems/linux/configs/device-tree/pcw.dtsi #在&usb0上增長一行usb-reset = <&gpio0 46 0>; #最後以下: &usb0 { dr_mode = "host"; phy_type = "ulpi"; status = "okay"; usb-reset = <&gpio0 46 0>; };
接着修改system-top.dts文件:
gedit subsystems/linux/configs/device-tree/system-top.dts #能夠看到裏面基本是空的 #在裏面增長如下內容 &qspi { flash0: flash@0 { compatible = "micron,n25q128a11"; }; }; /{ usb_phy0: usb_phy@0 { compatible="ulpi-phy"; ###假如前面的kernel配置中打開了「NOP USB Transceiver Driver」,須要配置爲compatible="usb-nop-xceiv"; #phy-cells = <0>; reg = <0xe0002000 0x1000>; view-port=<0x170>; reset-gpios = <&gpio0 46 1>; drv-vbus; }; }; &usb0 { status = "okay"; dr_mode = "host"; usb-phy = <&usb_phy0>; };
其中QSPI Flash我用到型號是N25Q128A11EF740E,因此要在這個設備樹中說明。而USB配置爲host模式,並打開VBUS電源。
step5:編譯和下載程序
終於,配置完成了,接下來就能夠愉快的編譯了,執行命令:
petalinux-build
編譯成功log:
最終在./images/linux文件夾下,就可以找到咱們須要的各類文件了。
咱們須要的四個文件是:
zynq_fsbl.elf #FSBL可執行文件 IFC_TOP_wrapper.bit #FPGA配置bit文件 u-boot.elf #SSBL可執行文件 image.ub #linux鏡像文件
因爲我沒有在Linux虛擬機中安裝Vivado,因此我沒有辦法使用「petalinux-package」命令。
所以我將這四個文件拖到Windows中進行處理,
在Windows中打開Xilinx SDK,選擇 Xilinx Tools->Create Boot Image,能夠參考一下官方手冊,
分別按順序加入 zynq_fsbl.elf--->IFC_TOP_wrapper.bit--->u-boot.elf 三個文件。點擊 Create Image 按鈕,生成BOOT.bin文件。
由於個人系統中沒有SD卡,並且一開始就配置爲了QSPI FLASH啓動的方式,在Xilinx SDK中選擇 Xilinx Tools->Program Flash。
Image File選擇剛纔生成的BOOT.bin文件,Flash Type選擇qspi_single,Offset填寫0,點擊Program按鈕。燒錄完成後,咱們的FSBL,bit,SSBL就成功下載到QSPI Flash中去了,咱們就已經能夠實現u-boot的啓動了,可是還不能引導kernel。
接下來燒錄image.ub文件,由於Image File只能選擇.bin或者.mcs文件,因此須要把image.ub從新命名爲image.ub.bin,好像有點粗暴。。。
而後Offset須要填寫偏移地址,這個地址能夠經過petalinux-config配置,或者能夠經過system-config.dtsi文件查看。內容以下:
&qspi { #address-cells = <1>; #size-cells = <0>; flash0: flash@0 { compatible = "micron,n25q128"; reg = <0x0>; #address-cells = <1>; #size-cells = <1>; spi-max-frequency = <50000000>; partition@0x00000000 { label = "boot"; reg = <0x00000000 0x00500000>; }; partition@0x00500000 { label = "bootenv"; reg = <0x00500000 0x00020000>; }; partition@0x00520000 { label = "kernel"; reg = <0x00520000 0x00a80000>; }; partition@0x00fa0000 { label = "spare"; reg = <0x00fa0000 0x00000000>; }; }; };
能夠看到kernel的偏移地址是0x00520000,因此Offset就填寫這個數值。點擊Program燒錄。
最終,咱們經過跳線方式將板子的啓動方式配置爲QSPI Flash,上電,啓動~~~~
咱們的PetaLinux就成功運行了~~~~哈哈哈哈
運行後插入了USB Hub和U盤,成功掛載!以後傳輸文件或者更新BOOT.bin和image.ub就能夠用U盤複製了,JTAG下載flash的方式實在是太慢了!
Log打印沒有截圖,有空了copy一下。先留個位置。
log信息
須要作PetaLinux版本控制時,須要備份以下幾個文件夾內的全部文件:
• "<plnx-proj-root>/.petalinux" • "<plnx-proj-root>/build/" • "<plnx-proj-root>/images/"
須要注意的問題:
1.假如在FPGA中用到了VDMA模塊,在編譯時會提示有錯誤出現。
緣由是VDMA的中斷編號有錯誤,個人處理方法是在pl.dtsi設備樹文件中,把每一個VDMA模塊裏的MM2S,S2MM通道的interrupt=-1那兩行直接刪除,這樣就可以成功編譯了。可是有什麼影響我就不知道了。之後再研究吧。
2.在petalinux-config配置完成後,提示相似No USB reset found, No ethernet reset found相似的警告。
一直覺得是設備樹的問題,最後發現原來是在Vivado中Zynq系統配置時,沒有設置Reset對應的MIO管腳。配置好後就不須要修改pcw.dtsi文件了。以下圖,配置了USB的Reset爲MIO46。
配置這個後,當調用 petalinux-config --get-hw-description=/*** 命令時,就會自動在pcw.dtsi文件中生成「usb-reset = <&gpio0 46 0>;」這段描述了。
3.USB HOST模式,USB PHY的CPEN不使能電源,致使不能向外供電。
因爲我使用的是2015.4的PetaLinux,這個bug已經被修復了。在以前的版本會出現這個現象,大體緣由就是就算配置設備樹成host模式,系統仍然按otg方式配置了USB。
問題描述的網址:
https://forums.xilinx.com/t5/Embedded-Linux/Petalinux-2015-2-1-usb-not-working/td-p/654349
http://zedboard.org/content/using-petalinux-configure-zedboard%EF%BC%8C-usb-otg-can-not-work解決方法就是在petalinux中安裝一個app,每次啓動時候運行腳本強制打開USB。也能夠手動打開,針對usb0,執行命令:devmem 0xe0002170 32 0x600a0067
補丁網址:https://forums.xilinx.com/xlnx/attachments/xlnx/ELINUX/14090/1/force_usb_power.tar.gz
app的安裝方法參考ug1144,執行的命令大體包括:
mkdir ./components/apps/force_usb_power #複製force_usb_power.sh, Kconfig, Makefile, README四個文件到文件夾下 petalinux-config -c rootfs #進入Applications ---> 使能force_usb_power應用 petalinux-build -c /rootfs/force_usb_power petalinux-build -c /rootfs/force_usb_power petalinux-build -x package #獲得了打了補丁的image.ub文件