基于Xilinx zcu104版的petalinux移植linux(ffmpeg)

Petalinux是Xilinx推出的嵌入式Linux开发工具。本篇文章基于Xilinx官方文档Petalinux Tools Documentation,另外在本篇文章中指出了我在编译过程中遇到的一些错误,希望能帮大家节省时间,轻喷。

(如遇到问题请在我的githubsuikammd上提issue,谢谢,还没有搞评论区,拖延症=。=)

环境准备

  1. Ubuntu虚拟机,我是在Google Cloud Engine上免费申请的虚拟机,区域是台湾,速度比较快,大小是15GB内存、4个vCPU以及60GB硬盘。(不要自己折腾VMware,后续petalinux编译需要翻墙,速度极慢,而且GCE上面可以随便折腾,感谢咕咕!)
  2. Petalinux SDK Installer、zcu104 BSP file,这两个文件均可以在file download中下载,我下载的版本都是2018.1的。如果需要下载高版本的,请注意查看板子是否支持,SDK installer和BSP的版本必须一致!

安装步骤

  1. GCE账号配置:申请GCE账号就不多说了,记得在申请虚拟机时,在防火墙处勾选允许HTTP流量、允许HTTPS流量,并在SSH密钥处添加你的公钥。这样就会自动生成虚拟机的外部IP,通过ssh连上去就可以使用了。

  2. 安装依赖包:在开头提到的官方文档中可以找到需要安装的依赖包,为方便大家使用,我在这里贴一下需要用的依赖包。

    sudo apt-get update
    sudo apt-get install tofrodos iproute2 gawk gcc git make xvfb net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget diffstat chrpath socat xterm autoconf libtool tar unzip texinfo zlib1g-dev gcc-multilib build-essential libsdl1.2-dev libglib2.0-dev screen pax gzip tar

    在安装过程中发现还需要安装zlib1g-dev:i386,这时候只要

    sudo dpkg --add-architecture i386
    sudo apt-get update
    sudo apt-get install zlib1g-dev:i386

    这样我们的依赖包就安装完毕了。

  3. 下载Petalinux SDK Installer、zcu104 BSP file:wget一下对应的链接就行了,可能需要重命名下载的文件为相应的名称,可以分别是petalinux-v2018.1-final-installer.run、zcu104.bsp。

  4. 安装Petalinux Tools:在安装过程中同意三个协议即可,这样Petalinux Tools就被安装到了/home/xxx/petalinux下。

    mkdir /home/xxx/petalinux
    ./petalinux-v2018.1-final-installer.run /home/xxx/petalinux

    不用在意WARNING: No tftp server found,不影响编译,但是可以通过下面的指令消除warning。

    sudo apt-get install tftpd-hpa

    修改 /etc/default/tftpd-hpa

    sudo vim /etc/default/tftpd-hpa

    TFTP_USERNAME="tftp"
    TFTP_DIRECTORY="/var/lib/tftpboot"
    TFTP_ADDRESS="0.0.0.0:69"
    TFTP_OPTIONS="-l -c -s"

    最后启动tptp server sudo service tftpd-hpa restart,再检查下是否启动成功sudo netstat -a | grep tftp

  5. 构建Petalinux工作环境

    source /home/xxx/petalinux/settings.sh

    建议将这句话加到bashrc中,不然每次都要手动source。最后再执行下面这句话确认下工作环境已经设置完毕,如果结果是/home/xxx/petalinux说明设置成功!

    echo $PETALINUX
  6. 安装Petalinux BSP:这样会生成一个文件夹xilinx-zcu104-2018.1,当然这个与你安装的BSP版本一致,这个文件夹就是你的project_dir。

    cd /home/xxx
    petalinux-create -t project -s <path-to-bsp>
  7. Enable ffmpeg in rootfs:不需要在petalinux中支持ffmpeg的可以直接跳过此步。

    在你的 <project_dir>/project-spec/meta-user/recipes-core/images/petalinux-image.bbappend文件中增加这句话IMAGE_INSTALL_append = " ffmpeg"。之后

    cd <project_dir>
    petalinux-config -c rootfs

    在弹框中选择user packages,然后enable ffmpeg即可。

  8. U-boot启动自动设置内网ip:

    <project_dir>输入petalinux-config,依次选择Subsystem AUTO Hardware Settings->Ethernet Settings->Obtain IP address automatically,然后取消Obtain IP address automatically,会自动出现三行信息来设置IP address/netmask/gateway

  9. 编译系统镜像:这个过程稍微有些久,耐心等待即可。为防止遇到奇怪的编码错误,在编译前请加上这三句

    export LC_ALL=en_US.UTF-8
    export LANG=en_US.UTF-8
    export LANGUAGE=en_US.UTF-8

    这时候执行下面的代码即可。

    cd <project_dir>
    petalinux-build
  10. 生成固件BOOT.BIN、image.ub

    cd <project_dir>
    petalinux-package --boot --fsbl ./images/linux/zynqmp_fsbl.elf --fpga ./images/linux/system.bit --pmufw ./images/linux/pmufw.elf --u-boot
  11. 验证:接下来就是激动人心的时刻了,我们把生成的BOOT.BIN、image.ub拷进SD卡中,放入zcu104板子,选择从SD卡启动,如果能看到linux的操作界面,那就说明你成功啦。若rootfs中包含了ffmpeg,输入ffmpeg验证下ffmpeg是否安装成功。以上。

    在写DMA驱动的时候发现了,更简单的验证方法,不需要将数据拷贝到SD卡,直接命令行输入petalinux-boot --qemu --kernel可以使用模拟器进行测试,具体需要测试的东西同我上文提到的。

#AWS迁移

然后今天GCE的300刀用完了(还不是因为穷加不记事),于是写了个半自动化的naive脚本帮我在AWS上完成安装petalinux的操作,第一个参数是petalinux installer的下载路径,第二个参数是bsp的下载路径。

#!/bin/sh

#input to installer and bsp
#while getopts ":a:b:" opt; do
# case "${opt}" in
# a)
# INSTALLER_FILE=$a
# echo ${a}
# echo 'haha'
# echo $INSTALLER_FILE
# ;;
# b)
# BSP_FILE=$b
# echo $b
# echo $BSP_FILE
# ;;
# ?)
# echo "You must specify petalinux installer and bsp file download url paths and the urls should be verified by xilinx."
# exit 1;;
# esac
#done
INSTALLER_FILE=$1
BSP_FILE=$2
echo $INSTALLER_FILE
echo $BSP_FILE

#install relay
sudo apt-get update
sudo apt-get install tofrodos iproute2 gawk gcc git make xvfb net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget diffstat chrpath socat xterm autoconf libtool tar unzip texinfo zlib1g-dev gcc-multilib build-essential libsdl1.2-dev libglib2.0-dev screen pax gzip tar -y
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install zlib1g-dev:i386 -y
#depend on ur machine
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

#download installer and bsp
PETALINUX_INSTALLER_NAME=petalinux-installer.run
BSP_FILE_NAME=board.bsp
PETALINUX=petalinux
BOARD=board
cd $HOME
wget $INSTALLER_FILE -O $PETALINUX_INSTALLER_NAME
wget $BSP_FILE -O $BSP_FILE_NAME
chmod +x $PETALINUX_INSTALLER_NAME
mkdir $PETALINUX
mkdir $BOARD

#install installer and bsp
PETALINUX_INSTALL_SCRIPT=./$PETALINUX_INSTALLER_NAME $PETALINUX
$PETALINUX_INSTALL_SCRIPT
sh $(HOME)/$(PETALINUX)/settings.sh
cd $BOARD
BSP_INSTALL_SCRIPT=petalinux-create -t project -s $HOME/$(BSP_FILE_NAME)
$BSP_INSTALL_SCRIPT
Author: suikammd
Link: https://suikammd.github.io/2019/04/24/petalinux_build_based_on_xilinx_zcu104/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.