嵌入式开发之zynqMp —Zynq UltraScale+ MPSoC 图像编码板zcu102
1.1 xilinx zynqMp 架构
1.1.1 16nm 级别工艺
Zynq UltraScale+ MPSoC架构
Xilinx新一代Zynq针对控制、图像和网络应用推出了差异化的产品系,这在Xilinx早期的宣传和现在已经发布的文档里已经说得很清楚了。她的产品系如图2所示。
图2 产品表
从图2看到,这个系列的Zynq算是8核(或9核)异构产品:四核的ARM-CortexA53 CPU、双核的Cortex-R5 RPU、Mali-400 GPU(一个Geometry核,两个像素核)、PL逻辑以及视频编解码器Codec核。
在表2中,ZU2E、ZU3E为针对控制类应用,逻辑和Block RAM资源较少,没有Video Codec和高速收发器。ZU4E、ZU2E和ZU7E针对视频类应用,有内部的UltraRAM资源、Video Codec和GTH高速收发器。其他型号针对网络应用,除了Video Code没有外,其它高大上的东西都有,比如更高速的收发器GTY,还有150G Interlaken和100G Ethernet MAC/PCS/RS-FEC等。
熊猫君是做图像的,下面的描述都是针对图像版的Zynq UltraScale+而言的。
因为PS部分的资源是固定的,大家都一样,在后面一起说就行。PL部分因为有这三个东西,将使设计如虎添翼:
a)大量的Block RAM和Ultra RAM资源,小20Mb的内部RAM资源,对分块处理图像,那应该会带来不少的便捷;
b)Video Code:这个东西是集成在PL侧的硬核,有了它,图像压缩和解压缩都不用愁了;
c)GTH:PL端集成的GTH收发器,对SDI、DP等图像接口接入那是十分的方便,当然也可以做PCIe咯。
不多说了,熊猫君从Xilinx官方文档UG1085上截一个图来表示这个高大上通用SoC的系统级架构,也就是下面的图3啦。
图3 Zynq UltraScale+ MPSoC系统架构图
http://blog.csdn.net/haoxingheng/article/details/50098777
时隔三年,Xilinx推出了其全新的异构SoC,大名叫ZynqUltraScale+。相比它的前辈Zynq-7000,这款SoC功能显得更加强劲:最显著的变化是新加入了GPU和视频编解码器,而且编解码器在PL端,PS端的高速接口更加丰富。按照Xilinx官方的说法,Zynq UltraScale+主要针对控制、图像和网络这三大块,比如说汽车辅助驾驶、8K图像、100G网、物联网等等领域(兵马未动,粮草先行啦,Xilinx早早的就针对这些差异化应用推出了SDx集成开发环境)。
从图4可以看到,这是一个带SDI接口的IP相机。大致分为两大块:
a)PL负责原始数据采集、Bayer域处理、ISP和图像编码;
b)PS负责对PL的管理、控制和协处理、RTSP服务器、千兆网和SD卡数据存储。
http://blog.csdn.net/haoxingheng/article/details/50076591
1.2 xilinux zynqMp 开发环境搭建
1.2.1 移植petaLinux之安装petalinux
start.安装虚拟机,在虚拟机里安装linux系统(ubuntu16)
sudo passwd
命令,设置超级用户su时的密码a.更新apt-get(可选,加速用,同传统方式移植那篇文章的第二节)
b.安装petalinux的依赖环境
安装petalinux的必要依赖环境,直接复制粘贴下面的命令行到shell中,系统自动下载安装下面的工具:
sudo apt-get install build-essential vim tofrodos \
iproute2 gawk gcc git make net-tools zlib1g-dev \
libssl-dev flex bison libselinux1 libncurses5-dev \
tftpd lib32z1 lib32ncurses5 libbz2-1.0:i386 \
lib32stdc++6 xvfb chrpath socat autoconf libtool
c.修改/bin/sh
shell中输入:dpkg-reconfigure dash
,在出现的界面中选择‘否’
d.下载petalinux
去官网下载petalinux-v2017.1-final-installer.run
(文件8个G,上传不了)
e.安装petalinux
home/hlf/mnt
),用鼠标右键,新建一个文件夹petalinux
hlf@hlf-virtual-machine:~/mnt$
这样的),shell中输入命令:./petalinux-v2017.1-final-installer.run ./petalinux
f.补一些库的安装
apt-get install texinfo gcc-multilib libsdl1.2-dev libglib2.0-dev zlib1g:i386 libncurses5 libncurses5-dev libc6:i386 libstdc++6:i386 zlib1g:i386 libssl-dev tftpd tftp openbsd-inetd
先安装刚刚安装时,提示缺少的库:
apt-get install texinfo gcc-multilib libsdl1.2-dev libglib2.0-dev zlib1g:i386
安装一些之后需要的库,全都安装了避免麻烦:
apt-get install libncurses5 libncurses5-dev
apt-get install libc6:i386 libstdc++6:i386 zlib1g:i386
apt-get install libssl-dev
apt-get install tftpd tftp openbsd-inetd
,安装完成后,编辑一下/etc/inetd.conf里的东西: gedit /etc/inetd.conf
,打开了文件,并在文件最后一行增加: tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftproot
然后保存并退出 ,之后再进行一些简单操作: mkdir /tftproot
chmod 777 /tftproot
/etc/init.d/openbsd-inetd restart
netstat -an | more | grep udp
命令,以确定成功(打印出udp 0 0 0.0.0.0:69 0.0.0.0:*
)g.验证是否安装成功 source /home/hlf/mnt/petalinux/settings.sh
成功定位不报错的话,基本是成功了的 echo $PETALINUX
命令行会打印出安装路径/home/hlf/mnt/petalinux
1.2.2 搭建硬件环境
新建工程,选择对应的芯片型号,并新建一个 BD 原理图文件(命名为system),然后添加一个ZYNQ Processing system的IP核,并设置好与硬件相符合的PS和PL时钟以及DDR型号
然后右键单击 Block 文件,文件选择 Generate the Output Products,然后右键单击 Block 文件,选择 Create a HDL wrapper,根据 Block 文件内容产生一个 HDL 的顶层文件,并选择让 vivado 自动完成
经Vivado综合,实现后,在Vivado中导出硬件,输出PetaLinux所需要的硬件描述文件
输出的文件就在“/(工程文件夹)/(工程名).sdk”这个文件夹下,这个文件夹下的system_wrapper.hdf待用
1.2.3 搭建petalinux bsp工程
a.定位目录
先在shell中找一个准备存放工程的地方,(我的是home/hlf/PRO
),命令行cd home/hlf/PRO
b.定位编译链
根据安装petalinux的路径: source /home/hlf/mnt/petalinux/settings.sh
c.创建petalinux工程
将在PRO目录下面,创建一个工程: petalinux-create --type project --template zynq --name h1_petalinux_test
h1_petalinux_test是工程名,该命令会自动在PRO文件夹里创建h1_petalinux_test文件夹
d.引用刚才输出的硬件描述文件
把之前导出的硬件描述文件system_wrapper.hdf拷贝到虚拟机中的h1_petalinux_test工程文件夹下,然后: petalinux-config --get-hw-description=/home/hlf/PRO/h1_petalinux_test
会进入一个配置界面,在里面我们可以配置一些系统参数,主要的配置包括:启动方式,启动存储器分区表,启动文件名称等等,本文暂不对其修改(默认是从SD卡中启动),然后等待其配置(时间较长)
上图可以进行基本项配置,
e.获取文件夹权限
在上一步完成后,输入命令sudo chmod -R 777 /home/hlf
获取文件夹权限(工程文件夹和petalinux的安装文件夹),否则编译的时候,会发生错误
目前为止,在shell中的命令既可以以超级用户su的身份运行也可以以普通用户的方式运行(建议全部都用普通用户的方式,免得切换),但是等下编译u-boot和kernel以及rootfs的时候,必须以普通用户的身份运行命令行,否则会报错的
f.编译u-boot
注意:到此处的时候,不能再用超级用户了,要切换到普通用户下,之后的所有操作都在普通用户下
普通用户的shell中输入petalinux-config -c u-boot
(依然要事先输入source /home/hlf/mnt/petalinux/settings.sh
命令),然后等待GUI出来,这里暂时不改动啥,直接save(save为u-boot.config
,名字随便取但不要留空),然后继续等(新建工程要等的时间还是比较长的,后来就会好的)
g.编译kernel
命令petalinux-config -c kernel
,操作同上(save为kernel.config
)
h.编译rootfs
命令petalinux-config -c rootfs
,操作同上(save为默认即可)
i.设备树配置
若要修改,直接在工程文件夹下,Ctr+F搜索.dts
就可以找到相关文件,做出相应修改”
暂时默认吧,不修改,按照它自动生成的设备树
j.编译工程
配置完成后可以生成适配该硬件的fsbl,u-boot,kernel,rootfs等文件, 输入命令petalinux-build
,等待即可,最后生成的文件在 image/linux下
k.生成BOOT.BIN
把shell定位到image/linux目录下,执行命令 petalinux-package --boot --format BIN --fsbl zynq_fsbl.elf --fpga system_wrapper.bit --u-boot
,在文件夹下就可以发现,多了一个BOOT.BIN
l.将如下文件拷入SD卡
m.开机
将SD卡,插回,开机,串口打印信息为:
....
n。生成完启动文件后可以进行模拟适配
如果不想连接开发板可以先用模拟题运行u-boot,kernel,看看是不是正确
petalinux-boot –qemu –u-boot
petalinux-boot –qemu –kernel
密码:root
如果模拟器运行没问题就可以用jtag下载到zynq板子上进行后续调试了,命令参看ug1157-petalinux-tools-command-line-guide
http://blog.csdn.net/zhaoxinfan/article/details/57530627
http://blog.csdn.net/long_fly/article/details/78727813
1.3.Xilinx zynqMP开发基本步骤
a)使用Vivado 工具生成 .hdf文件,比如ZU9_cpu.hdf
b)使用SDK工具生成FSBL。FSBL的作用主要是初始化PLL,DDR,MIO管脚分配,烧写FPGA,运行uboot等。核心代码代码位于psu_init.c中。
c)生成uboot
d)使用bootgen工具生成BOOT.BIN文件,bootgen需要使用.bif文件做输入。bif指导那个文件用作输入,targets等
//arch = zynqmp; split = false; format = BIN
the_ROM_image:
{
[fsbl_config]a53_x64
[bootloader]C:\cpu_test\cpu_test\cpu_test.sdk\fsbl\Debug\fsbl.elf
[destination_device = pl]C:\cpu_test\cpu_test\cpu_test.sdk\cpu_test_wrapper_hw_platform_0\cpu_test_wrapper.bit
[destination_cpu = a53-0]C:\cpu_test\cpu_test\cpu_test.sdk\uboot.elf
}
e)把BOOT.BIN,system.dtb和Image文件copy到SD卡第一分区,把rootfs解压到SD卡ext4分区。
http://blog.csdn.net/ambercctv/article/details/69945902
1.3.1 zynq MP的启动
(1)启动过程
下图时xilinx手册上摘录的图,描述了zynqMP 上的linux的整个boot过程
系统复位后,首先PMU(Platform Management Unit)会执行PMU ROM中固化代码,执行完后会启动CSU处理核,CSU会负责从启动存储介质中加载FSBL(First Stage Boot Loader)至on-chip ram中,FSBL可以由RPU负责执行也可由APU负责执行,须在制作FSBL时确定。继而,CSU激励RPU或APU执行FSBL。FSBL会加载PMU Frameware交付PMU执行。继而FSBL执行完成后切换至ATF(Arm Trusted Frame),ATF于APU上执行。然后ATF启动u-boot,u-boot为linux配置好运行环境将执行权交付给Linux内核。
可以看出和Zynq-7000类似,ZynqUltraScale+ MPSoC也是三级启动方式,只是Xilinx又给它们起了一个新名字,启动分为以下三级:
a) Pre-configuration:复位后执行PMU ROM代码,讲外部FSBL代码搬到内部的OCM。相当于Zynq 的Boot ROM执行。
b) Configuration:在内部的OCM代码,系统根据BOOTHeader的内容选择在CPU(Cortex-A53)还是RPU(Cortex-R5)上执行。负责初始化必要的时钟、内存和外设,加载Bit文件和用户代码等。
c) Post-configuration:执行用户代码。
http://blog.csdn.net/haoxingheng/article/details/50099373
(2)启动文件详解
对于ZYNQ MPSoC有以下几个文件,
a.FSBL
这个FSBL跟zynq-7000的fsbl是一样的,用户可以选择用cortex-a53制作启动的fsbl文件,也可以选择用cortex-r5来制作启动的fsbl文件。
b.PMUFW (pmufw.elf)
PMU的配置文件,但这个不是必须的,用户是可选的,MPSOC有LPD.FPD.PL三路电源轨,PMU是为了更好的管理电源和控制功耗,一般情况下,大部分客户不需要修改这个elf文件,这个文件不是制作BOOT.bin必须要的。
c.ARM Trusted Firmware(bl31.elf)
ARM Trusted Firmware文件,是一个arm加密固件,用户根据需要来定制,这个文件不是制作BOOT.bin必须要的。
d.PL bitstream(design_1_wrapper.bit)
这是FPGA端的bit配置文件,用户根据自己的需要来配置bit文件,这个文件不是制作BOOT.bin必须要的。
e.uboot(u-boot.elf)
uboot文件,目前我使用的是version是2016.7,制作BOOT.bin需要这个文件。
f.image.ub
这个文件是由petalinux-package --image 打包kernel rootfs device-tree这个三个文件合成的image.ub文件,也就是说,当你启动mpsoc的时候,你最终只需要两个文件BOOT.bin image.ub。
http://blog.csdn.net/luhao806/article/details/58591497
1.3.2 uboot 的生成
MPSOC系列基于ZCU102 uboot的编译生成
查看board/xilinx/zynqmp/zynqmp.c 中board_late_init
这里需要检查了zynqMP的启动方式,并设置了环境参数 modeboot ,此次测试使用sd卡boot,故modeboot 会被设置为sdboot,故u-boot会执行run sdboot命令,其中sdboot 环境参数设置在include/configs/xilinx_zynqmp.h中定义,
此处还实现了TFTP形式的boot以及nfs文件系统,这里就不解释TFTP Boot及nfs(xilinx默认配置是从sd卡第一分区(FAT格式)读取devicetree以及Image实现boot,并以sd卡第二分区(ext4格式)作为系统的跟文件系统)。
uboot 生成:
cd $u-boot-xlnx-dir
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make distclean
make xilinx_zynqmp_zcu102_rev1_0_defconfig
make -j4 #-jn 为你要运行的核数
http://blog.csdn.net/baidu_23935667/article/details/79099803
or:
1)windows vivado sdk create uboot.bin
打开vivado工程并生成bit stream
导入到 sdk
打开sdk
创建预置的fsbl工程
Xilinx Tools>Creat Boot Image
选择BIF file path
选择Output path
在Boot image partitions中
add>fsbl.elf
add>XXX.bit
add>u-boot.elf
Creat Image
其中bif为路径配置文件:
bif文件如下所示:
//arch = zynqmp; split = false; format = BIN
the_ROM_image:
{
[fsbl_config]a53_x64
[bootloader]PROJECT_DIR/project_1.sdk/fsbl/Debug/fsbl.elf
[pmufw_image]PROJECT_DIR/project_1.sdk/pmu/Debug/pmu.elf [destination_device = pl]PROJECT_DIR/project_1.sdk/design_1_wrapper_hw_platform_0/design_1_wrapper.bit [destination_cpu = a53-0, exception_level = el-3]PROJECT_DIR/project_1.sdk/bl31.elf [destination_cpu = a53-0, exception_level = el-2]PROJECT_DIR/project_1.sdk/u-boot.elf }
其中PMU、FSBL由SDK中生成
http://blog.csdn.net/aostas/article/details/78149300
2)petalinux 合成 boot.bin
1.3.3 MPSOC系列基于ZCU102的linux的kernel的编译
cd linux-xlnx
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make xilinx_zynqmp_defconfig
make menuconfig make -j4 #-jn n为你要运行的核数
http://blog.csdn.net/baidu_23935667/article/details/79099803
or:
手头必备的TRM UG1085(http://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf)
寄存器手册(http://www.xilinx.com/support/documentation/registers/ug1087/ug1087-zynq-ultrascale-registers.html)
http://blog.csdn.net/kkk584520/article/details/50042757
https://wiki.trenz-electronic.de/pages/viewpage.action?pageId=14746264
1.4.2
在详细介绍具体做法之前,有必要花点时间来探讨针对基于FPGA的嵌入式系统提供的操作系统选项。PetaLinux是FPGA上最常用的操作系统,另外还有μClinux 和Xilkernel。μClinux为Linux发行版,是一款包含小型Linux内核的移植型Linux操作系统,适用于无存储器管理单元(MMU)的处理器[1]。μClinux配备有各种库、应用和工具链。Xilkernel就其本身而言,是一款小型、高稳健性、模块化内核,能够提供高于μClinux 的定制性能,有助于用户通过定制内核来优化其设计尺寸与功能[2]。同时,PetaLinux也是一款完整的Linux发行版及开发环境,适用于基于FPGA的片上系统(SoC)设计。PetaLinux包含预配置二进制可引导映像、面向赛灵思器件的完全可定制Linux 以及配套提供的PetaLinux软件开发套件(SDK)[3]。其中SDK包括用于自动完成配置、构建和部署过程中各种复杂工作的工具和实用程序。赛灵思提供可免费下载的PetaLinux开发包,其中包括针对各种赛灵思FGPA开发套件而设计的硬件参考项目。同时包含在内的还有适用于赛灵思FPGA的内核配置实用程序、交叉编译器等软件工具、硬件设计创建工具以及大量其它设计辅助功能。据报道,Xilkernel 的性能优于μClinux[4],而PetaLinux的性能又优于Xilkernel [5]。由于这个原因,特别是由于已针对我们赛灵思目标板提供的软件包原因,我们为我们的项目选择了PetaLinux。移植PetaLinux的另一大优势是用户可以轻松实现远程编程。这就意味着用户可使用远程接入方式,通过远程登录,采用新的配置文件(或比特流文件)加载FPGA目标板。有两种方法可以创建用于构建PetaLinux系统的软件平台:在Linux终端上使用PetaLinux命令或通过下拉菜单使用GUI。
附录:
1. zcu102 Linux 完整打印信息log
http://blog.csdn.net/luhao806/article/details/58602337
2. http://www.wiki.xilinx.com/
(提供 了几乎所有的学习资料,包括:创建FSBL,配置编译内核,配置编译u-boot,编译生成dtb,制作根文件系统,linux 设备驱动程序,设计例程等等)
3.zc702 学习总结
http://blog.csdn.net/Klaus_Wei/article/details/38063349
4. zcu102 pcie视频传输方案
http://blog.csdn.net/vacajk/article/details/78970368
5.zcu102
ZCU102 HDMI Demo测试:
http://blog.csdn.net/vacajk/article/details/78970533
6. zcu102 xen 开源视频监视
http://blog.csdn.net/telantan/article/details/78872451
7.
闲话Zynq UltraScale+ MPSoC(连载4)——IO资源
http://blog.csdn.net/haoxingheng/article/details/50100573
闲话Zynq UltraScale+ MPSoC (连载3)——启动加载
http://blog.csdn.net/haoxingheng/article/details/50099373
闲话Zynq UltraScale+ MPSoC (连载2)——架构和电源要求
http://blog.csdn.net/haoxingheng/article/details/50098777
Zynq UltraScale+ MPSoC新鲜出炉
http://blog.csdn.net/kkk584520/article/details/50042757
8. zynq petalinux编译用户自定义系统
http://blog.csdn.net/shichaog/article/details/51544173
9.ZYNQ跑系统 系列(二) petalinux方式移植linux
http://blog.csdn.net/long_fly/article/details/78727813
10 ZCU102开发 (1) 运行基于ubuntu文件系统的Linux
http://blog.csdn.net/telantan/article/details/73928695
【Zynq学习笔记3】petaLinux使用
http://blog.csdn.net/wt881010/article/details/71597478
zynq之petalinux安装和编译
http://blog.csdn.net/shichaog/article/details/51074980
将PetaLinux移植到FPGA上的原因和步骤详解 - 全文
http://www.elecfans.com/emb/fpga/20171117581662_a.html
11. xlinux官网资料
http://china.xilinx.com/products/boards-and-kits/ek-u1-zcu102-g.html#documentation
https://china.xilinx.com/search/support-keyword-search.html?searchKeywords=PetaLinux%20Tools%20Documentation
https://china.xilinx.com/support/documentation/sw_manuals/xilinx2017_4/ug1156-petalinux-tools-workflow-tutorial.pdf
http://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html
https://china.xilinx.com/support/documentation/sw_manuals/xilinx2017_4/ug1144-petalinux-tools-reference-guide.pdf