【Xilinx-Petalinux學習】-02-創建PetaLinux工程

前面我已經把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文件
相關文章
相關標籤/搜索