前面我已經把PetaLinux成功安裝到了Ubuntu虛擬機當中了,接下來就要實際操作,將PetaLinux移植到我們自己的硬件平台當中去。
step1:硬件描述文件
有兩種PetaLinux工程建立的方法,一種是下載官方開發板的BSP包並安裝,一種就是針對自己的硬件平台去剪裁Linux功能以適應自己的需求。
第一種,比較簡單,官方提供了完整的demo和已經預編譯好的各種文件。
比如說我們從網上下載了Avnet-Digilent-ZedBoard-v2015.4-final.bsp,我們直接執行下面的命令就可以安裝這個BSP包了。安裝完成后,PetaLinux工程就安裝在了Avnet-Digilent-ZedBoard-v2015.4-final文件夾下面。可以選擇自己重新編譯,或者直接使用預編譯好的文件直接拷貝到SD卡中,馬上就能夠在ZedBoard上運行PetaLinux了。
petalinux-create -t project -s ./Avnet-Digilent-ZedBoard-v2015.4-final.bsp
第二種,根據我們自行設計的硬件平台去創建PetaLinux工程。這就稍微復雜一些了,需要進行各種配置,我也是嘗試了各種配置方法,最終獲得了一個基本上滿足我需求的結果。
選用的芯片是ZYNQ系列的芯片,我們將會在內部的ARM硬核上去跑Linux。
首先,為了讓PetaLinux正常的運行,需要分配一些硬件外設資源給PetaLinux,文檔ug1144中也說明了PetaLinux中對Zynq-7000系列FPGA硬件資源的需求。若用到了MicroBlaze或者Zynq Ultrascal+ MPSoC的話,自己查看文檔說明吧。
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文件
