前言
Xilinx的MPSoC系列芯片的部分型号提供了Video Codec Unit,可用于H.264/H.265格式视频的编解码。想要用起来Video Codec Unit需要花一番功夫,大体有三步:硬件层比特流的搭建,驱动层Linux内核+驱动的编译以及rootfs制作,应用层编译。我们尝试将VCU跟PYNQ(这里提到的PYNQ框架而不是PYNQ-Z1/Z2板卡)结合便于分发,这样在编译zcu104、ultra96等板卡的PYNQ img的时候VCU就已经集成在里面了,开发者拿过来编译好的PYNQ img就可以直接用了。
VCU的驱动分成kernel space跟user space两部分,kernel space的驱动在用petalinux编译内核时就打包进了内核,user space的驱动是存放在rootfs中的,所以直接使用petalinux编译出来的rootfs是没问题的,但是想在Ubuntu下跑起来VCU还要在Ubuntu里编译下驱动。
参考:
- https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842539/Zynq+UltraScale+MPSoC+VCU+TRD+2018.2
- https://github.com/Xilinx/PYNQ
- https://gstreamer.freedesktop.org/
- https://www.xilinx.com/support/documentation/boards_and_kits/zcu106/2018_2/ug1250-zcu106-vcu-trd.pdf
- https://www.xilinx.com/support/documentation/ip_documentation/vcu/v1_1/pg252-vcu.pdf
目前PYNQ框架还没有正式支持ZCU106,因此我们将在ZCU104上完成该设计。总共分三步:
- VCU在ZCU104上跑起来,使用petalinux编译的内核+rootfs
- VCU在ZCU104上跑起来,使用petalinux编译的内核+Ubuntu18.04 rootfs
- 把前面的步骤做成脚本集成到PYNQ框架下
VCU在ZCU104上跑起来
搭建VCU的Vivado工程
通过 Vivado 内置的 ZCU104模板新建一个工程,命名为zcu104_vcu,按照下图搭建Block Diagram
或在Vivado Tcl下输入
source <path to zcu104_vcu>/zcu104_vcu_bd.tcl
tcl文件在https://github.com/jiangwx/PYNQ-VCU/tree/master/zcu104_vcu下
Generate Bitsream并Export Design,选择将 Bit 打包进 HDF
创建Petalinux工程
- 新建工程
- 在Xilinx官网上下载xilinx-zcu104-v2018.2-final.bsp在Xilinx官网上下载xilinx-zcu104-v2018.2-final.bsp
$ petalinux-create -t project -n zcu104_vcu_plnx -s <path to bsp>/xilinx-zcu104-v2018.2-final.bsp
$ cd zcu104_vcu_plnx
- 将刚才生成的.hdf文件复制到zcu104_vcu_plnx下
- 导入硬件设计
$ petalinux-config --get-hw-description ./
- 将linux的rootfs改为SD卡
Image Packaging Configurations -> Root filesystem type -> SD card
DTG Settings->Kernel Bootargs->generate boot args automatically 取消勾选该选项,手动将bootargs 设置成
earlycon clk_ignore_unused earlyprintk root=/dev/mmcblk0p2 rw rootwait
- 配置内核
$ petalinux-config -c kernel
General setup > Initial RAM file system and RAM disk (initramfs/initrd) support取消勾选
- 添加gstreamer组件(用于驱动VCU)
$ petalinux-config -c rootfs
勾选packagegroup-petalinux-gstreamer,从bsp创建的petalinux工程已经勾选了这个选项
编译工程
$ petalinux-build
$ petalinux-package --boot --force --fsbl images/linux/zynqmp_fsbl.elf --fpga images/linux/*.bit --u-boot
我们要用到的images/linux下的rootfs.tar.gz,BOOT.BIN,image.ub这三个文件
将rootfs烧写进SD卡
准备SD卡
这部分工作在Linux 系统下可以用Gparted 来完成, 打开一个terminal。
$ sudo gparted
启动gparted工具,如果没有装Gparted, 输入
$ sudo apt-get install gparted
准备SD 卡的步骤如下:
- 在Gparted 中选择SD 卡
Gparted选择SD卡,读者可以根据容量确定/dev下的哪个设备是SD卡 - umount SD 卡并删除SD 卡中已经存在的分区, 最终在Gparted 中显示unallocated。
unmount SD卡
删除已有分区
Gparted中显示unallocated - 右键被分配的空间并按照下面的设置创建新的分区
Free Space Proceeding (MiB): 4, New Size (MiB) : 512, File System : FAT32, Label : BOOT
不要改变其他的设置, 点击Add 结束
- 右键剩下的被分配的空间并按照下面的设置创建新的分区
Free Space Proceeding (MiB): 0, Free Space Following(MiB): 0, File System : ext4, Label :
RootFS 不要改变其他的设置, 点击Add 结束,设置完应如图所示
设置完成界面
- 点击绿色的大对号应用所有设置创建分区
- 关掉Gparted并mount刚才格式化过的两个分区
烧写SD卡
cd <path to petalinux project>/images/linux
sudo tar xzf rootfs.tar.gz -C /media/$(whoami)/rootfs/
sync
sudo chown root:root /media/$(whoami)/rootfs/
sudo chmod 755 /media/$(whoami)/rootfs/
cp BOOT.BIN image.ub /media/$(whoami)/BOOT
测试
- 准备一个720p或1080p的mp4视频,也可以是其他分辨率,但是要是8的倍数
- 将 ZCU104 设置为从 SD 卡启动: SW6[1:4] = ON, OFF, OFF, OFF,上电启动
- 连接串口登陆板卡,Login: root, password: root
- Mount SD 卡: mount /dev/mmcblk0p1 /mnt
- 测试
尝试从 MP4 文件解码:
gst-launch-1.0 filesrc location=xx.mp4 ! qtdemux ! h264parse ! omxh264dec ! queue max-size-bytes=0 ! filesink location=yy.yuv
尝试从 RAW YUV Video 文件编码为 MP4:
gst-launch-1.0 filesrc location=xx.yuv ! videoparse format=nv12 width=WW height=HH framerate=20/1 ! omxh264enc ! queue ! h264parse ! mp4mux ! filesink location=yy.mp4
欢迎大家关注Xilinx学术合作以及Pynq的官方公众号,里面有许多优质的学习资源等着你哦
希望了解HLS的同学可以关注公众号Xilinx学术合作以及PYNQ中文社区获取最新版《FPGA并行编程-- 以HLS实现信号处理为例》pdf ,关注任一公众号,回复 pp4fpgas 即可获得