操作系统: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服务区文件夹,默认为此路径)中也复制了一份。