操作系統:Ubuntu 16.04 LTS
應用軟件:Vivado 2016.2 + petalinux 2016.2
參考官方應用手冊:ug1144-petalinux-tools-reference-guide.pdf
1、軟件安裝
1.1 基礎軟件安裝
在安裝應用軟件前,需要為zynq開發環境安裝必要的基礎軟件,在手冊11頁已經明確標明。
注意:tftp軟件使用tftp-hpa,如下所示:
#1、安裝 sudo apt-get install tftp-hpa tftpd-hpa #2、建立目錄 sudo mkdir /tftpboot sudo chmod 777 /tftpboot #3、配置 sudo vim /etc/default/tftpd-hpa #修改以下兩項 TFTP_DIRECTORY="/tftpboot" TFTP_OPTIONS="-l -c -s" #4、啟動 sudo service tftpd-hpa restart
在此基礎上,為了啟動eclipse需要安裝java開發環境和支持庫:
sudo apt-get install openjdk-8-jre sudo apt-get install lib32z1 sudo apt-get install lib32ncurses5 sudo apt-get install lib32bz2-1.0 (官方說需要安裝,但實際沒有找到這個庫) sudo apt-get install lib32stdc++6
1.2安裝配置
完成1.1步驟后,需要打開tftp服務器,在后期可以直接通過petalinux給zynq更新代碼
1.3安裝應用軟件
參考官方手冊
注意:為安裝目錄打開所有可讀可寫可執行權限!
1.4應用軟件配置
為了能夠順利啟動vivado、sdk以及petalinux,需要做如下幾步:
1、在/opt/Xilinx/SDK/2016.2/.settings64-Software_Development_Kit__SDK_.sh中增加
export SWT_GTK3=0
2、在home目錄下新建文件:.bash_aliases,
在啟動控制台頭bash會自動調用.bash_aliases里的內容。做如下設置:
echo "<----自啟動設置---->" echo "1.設置快捷操作命令" ############################ #重命名 ########################### echo "2.設置zynq sdk環境" ############################ #自動運行 ###########################
export EXTERN_COMPILER=/opt/Xilinx/petaLinux/petalinux-v2016.2-final/tools/linux-i386/gcc-arm-linux-gnueabi/bin/ source /opt/Xilinx/petaLinux/petalinux-v2016.2-final/settings.sh source /opt/Xilinx/Vivado/2016.2/settings64.sh
3、安裝的應用軟件目錄很多默認需要root權限,如果是用普通用戶操作應用軟件,需要為很多目錄增加權限。
4、修復awk錯誤
官方bug報告中有如下說明:
If you are not using the AXI BFM IP, you can remove the LD_LIBRARY_PATH setting from settings64.sh
通過屏蔽.settings64-Vivado.sh中對“LD_LIBRARY_PATH”的賦值,便可修復awk錯誤。
5、鏈接新庫
官方包里有些庫已經過時了,需要重新鏈接到系統的庫。
#先做更新 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade #然后鏈接 cd /opt/Xilinx/SDK/2016.2/lib/lnx64.o/ mv libstdc++.so.6 libstdc++.so.6.old ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 libstdc++.so.6
2、生成嵌入式文件
2.1生成硬件描述文件
根據系統需求,使用vivado生成硬件描述文件並啟動sdk生成硬件描述文件夾。
注意:linux下需要主動安裝驅動,在 <xilnix安裝目錄>/Vivado/2016.2/data/xicom/cable_drivers/lin64/install_scripts/install_drivers/
運行:
sudo install_drivers
完成后重啟電腦。
2.2根據已經存在的bsp生成petalinux工程
#生成工程bsp petalinux-create -t project -s <path-to-bsp> <path-to-bsp>= petalinux結構的bsp文件夾
關於版本控制:
使用git在工程目錄下需要忽略三個文件夾:
1、.petalinux
2、build
3、images
2.3從頭新建petalinux工程
在petalinux工程目錄下使用命令:
petalinux-create --type project --template <CPU_TYPE> --name <PROJECT_NAME> CPU_TYPE = zynqMP 或 zynq 或 microblaze PROJECT_NAME 即為新建工程名字
petalinux-config --get-hw-description=<path-to-directory-which-contains-hardware-description-file> path-to-directory-which-contains-hardware-description-file:即為包含.hdf的文件夾
此過程中,會自動調用配置界面。配置完成后,生成fsbl,u-boot,內核,設備樹,根文件系統等。
問題:
在生成設備樹的過程中,會出現警告:
WARNING: ps7_ethernet_0: No reset found
WARNING: ps7_usb_0: No reset found
這個警告會導致以太網口不能使用!
解決:
2.4編譯生成鏡像文件
在petalinux工程目錄下使用命令:
petalinux-build -x distclean
LANG=C petalinux-build
生成uImage文件使用命令
petalinux-package --image -c kernel --format uImage
2.5生成啟動文件
在petalinux工程目錄下使用命令:
petalinux-package --boot --fsbl <FSBL image> --fpga <FPGA bitstream> --u-boot FSBL image :fsbl文件位置,位於./images/linux FPGA bitstream:bit :文件,位於./images/linux
執行命令后,會在工程目錄下生成BOOT.BIN文件。
在配置好啟動方式為SD卡啟動后,將此文件和image/linux下的image.ub拷貝進SD卡,便可啟動Linux
2.6生成打包文件
在petalinux工程目錄下使用命令:
petalinux-package --prebuilt --fpga <FPGA bitstream>
在工程目錄,生成pre-built文件夾,里面有系統需要的所有文件。
默認的登錄名及密碼都是root
2.7 將SD卡作為硬盤啟動Linux
這種情況下linux下所做的改動將會保存在SD卡上。
1、將linux下將SD卡分為兩個區,第一個區至少40M字節且格式化為FAT32,另一個區至少4G且格式化為EXT4。
2、使用"petalinux-config"命令,進入 "Image Packaging Configuration"->" Root filesystem type"然后選中SD卡,並保存配置。
3、重新編譯並生成BOOT.BIN及image文件
4、使用以下命令生成文件系統壓縮包:
#生成文件名為 rootfs.cpio,位於image/linux下
petalinux-package --image -c rootfs --format initramfs
5、將BOOT.BIN和image.ub拷貝進SD卡的第一分區
6、將rootfs.cpio拷貝進SD卡的第二分區,並且使用以下命令解壓
sudo pax -rvf rootfs.cpio
3、軟件應用
規定命令的使用均在petalinux工程根目錄下使用!
使用petalinux啟動zynq,可以選擇3個階段。
階段1:僅僅下載FPGA 的bit流文件
階段2:啟動至uboot
階段3:完全啟動
3.1仿真啟動
使用以下命令調用軟件仿真:
petalinux-boot --qemu --prebuilt 3 3代表啟動等級為3,即為全部啟動。 1和2分別代表啟動至fsbl和u-boot。
軟件仿真僅能使用2和3!
退出軟件仿真使用 “ctrl+a” 松開以后按下 “x” 就可以了。
注意:若重新配置系統代碼,在編譯系統文件后,也需要重新更新pre-built文件夾(參考2.6節)
也可以為仿真指定新文件:
#調用./images/linux/u-boot.elf petalinux-boot --qemu --u-boot #調用./images/linux/zImage petalinux-boot --qemu --kernel #或者指定內核路徑,設備樹路徑(從zImage中提取設備樹文件) petalinux-boot --qemu --image ./images/linux/zImage --dtb ./images/linux/system.dtb
3.2 jtga啟動
首先需要將啟動方式改為JTAG啟動。
與3.1命令類似,僅僅是將 "qemu"替換為"jtag"即可
petalinux-boot --jtag --prebuilt 3
除此之外也可以單獨下載部分代碼:
#下載bit文件 petalinux-boot --jtag --fpga --bitstream <BITSTREAM> #下載uboot代碼(image/linux/u-boot.elf) petalinux-boot --jtag --u-boot #下載內核文件(image/linux/zImage) petalinux-boot --jtag --kernel #查看啟動的詳細信息 petalinux-boot --jtag --u-boot -v #下載pmu 固件 petalinux-boot --jtag --pmufw <PATH_TO_PMUFW_ELF> --u-boot #獲取xmd日志信息 petalinux-boot --jtag --prebuilt 3 --tcl test.txt
3.3使用tftp啟動目標板
在配置好tftp服務器的基礎上,需要運行命令:
petalinux-config #進入 "Image Packaging Configuration". #選中 "Copy final images to tftpboot" #默認服務器文件位於“/tftpboot”,若不同還需要設置"tftpboot directory"
目標板需要連接網線,並且已經運行了U-boot(通過sd卡載入等)。在u-boot下進行如下設置:
#設置服務器ip set serverip <HOST IP ADDRESS>; saveenv #啟動 run netboot
3.3固件打包
固件打包用於將工程文件(fsbl+bit+ssbl+linux)打包成為.tar.gz文件
petalinux-package --firmware --bootbin=<BOOT_BIN> --linux #BOOT_BIN-> boot.bin文件所在位置 #linux自動引用./images/linux/image.ub文件
3.4 bsp打包
將當前工程打包為一個bsp文件,形成結構和其他開發板商提供的bsp包一樣。
在工程包外執行命令:
petalinux-package --bsp -p <plnx-proj-root> --output <name>
#<name>即為bsp包名稱(比如name = exercise,則會生成exercise.bsp文件)
3.5工程配置
petalinux提供了kconfig配置界面,能夠很詳細的配置系統很多參數。使用命令:
petalinux-config
具體配置說明及操作從手冊第52頁往后都有說明。
3.6基於petalinux的app開發
使用命令生成工程:
petalinux-create -t apps [--template TYPE] --name <user-application-name> --enable --template TYPE :可以選擇模板類型 <user-application-name> :工程名稱 #創建一個C模版應用 petalinux-create -t apps --template c --name myapp --enable #創建一個C++模版應用 petalinux-create -t apps --template c++ --name myapp --enable
生成的工程位於./components/apps,在此工程模板的基礎上編輯源代碼,當有新文件需要修改當前目錄下的Makefile。
1、當要添加更多的源文件,可以簡單粗暴的添加對應的.o文件名
2、當要添加其他配置文件,在"install"目標下加入
#將myfile.conf 固化進 /etc目錄下 $(TARGETINST) myfile.conf /etc #將字符串"some text here" 固化進 /etc/system.conf下 $(TARGETINST) -a "some test here" /etc/system.conf
同時在petalinux配置菜單里面也會出現這項,可以通過修改kconfig來配置APP選項。
#進入配置界面后,Applications選項可以找到APP,並使能 petalinux-config -c rootfs #使用命令編譯重新編譯,並將bin文件固化進文件系統 petalinux-build
當需要完全編譯整個系統時,使用:
LANG=C petalinux-build
當僅僅需要修改根文件系統時,在petalinux工程目錄下使用:
#假設app工程名為myapp petalinux-build -c rootfs -x do_gen_sysroot petalinux-build -c rootfs/myapp LANG=C petalinux-build -x package
此app便被加入了文件系統,可以使用以下命令來選擇app是否被編譯
petalinux-config -c rootfs
3.7 在文件系統中增加庫
3.8 自動登錄(開機自動運行APP)
創建一個新的app,並做如下修改:
#修改app內容 #include <unistd.h> #include <stdio.h> int main() { execlp( "login", "login", "-f", "root", 0); } #修改makefile 的install 目標內容,這樣可以開機自動運行 $(TARGETINST) -d -p 0755 autologin /etc/init.d/autologin $(TARGETINST) -s /etc/init.d/autologin /etc/rc5.d/S99autologin
注意:當需要設置一個APP開機運行且不會退出時,應當以守護進程的方式啟動它。
3.9 調試內核
使用GDB在QEMU仿真的支持下調試
#1.啟動仿真內核 petalinux-boot --qemu --kernel #2.在QEMU啟動輸出的前幾行中,可以找到gdb 的 tcp端口號 -gdb tcp:<TCP_PORT> #3.啟動linux另外一個命令行窗口,進入images/linux目錄 #4.啟動gdb調試 petalinux-util --gdb vmlinux #5.在GDB中使用剛才顯示的端口號 (gdb) target remote :9000 #6.然后盡情調試吧,折騰吧
注意:可以在配置菜單中打開內核調試選項:
petalinux-config--kernel > Kernel hacking > Kernel debugging
3.10 通過SDK下的TCF工具調試APP(未驗證通過)
首先生成執行文件
#1.進入根文件配置界面 petalinux-config -c rootfs #2.在 Filesystem Packages 中進入base 子菜單 #3. 使能 tcf-agent 選項 #4.進入上層的 console/network 子菜單 #5.使能 dropbear-openssh-sftp-server 子菜單 #6.重新編譯
然后進行調試
#1.使用QEMU或者硬件啟動系統 #2.啟動SDK並新建工程 #3.在新建工程中選擇硬件描述符文件,位於"<plnx-proj-root> #/subsystems/linux/hw-description/system.hdf" #4.新建linux類型的debug
3.11 修改設備樹
設備樹的編輯在文件system-top.dts下,此文件位於subsystems/linux/configs/device-tree文件夾下。
設備樹的文檔位於內核跟目錄下的:Documentation/devicetree
3.12 u-boot配置
若需要在u-boot下打開某些命令或選項,官方建議編輯 ./subsystems/linux/configs/u-boot/platform-top.h 文件,然后重新編譯u-boot
#編譯u-boot petalinux-build -c u-boot #生成u-boot.bin petalinux-package --boot --fsbl <FSBL image> --fpga <FPGA bitstream> --u-boot
3.13 深度定制
關於需要修改最底層的驅動、源碼等等,需要將自己生成的uboot、linux源碼等放在當前工程根目錄的components目錄下操作。
4 petalinux 工作流程
4.1基於官方提供的bsp上開發
在官方bsp開發可以提高開發速度,使用以下命令關聯bsp:
#關聯bsp,並在當前目錄創建工程 petalinux-create -t project -s <path-to-bsp> #編譯生成最終的鏡像文件 LANG=C petalinux-build
在./build/build.log中有具體的編譯日志,在./images有編譯文件,在/tftpboot(tftp服務區文件夾,默認為此路徑)中也復制了一份。