【Zynq】PetaLinux 2021.2构建Zynq7020的固件

赛灵思官方有提供 Zynq 的 Linux 支持包。

  • 系统:Ubuntu 18.04 x86_64

  • 版本:2021.2(参考 ug1144-petalinux-tools-reference-guide.pdfZynq Linux

  • 终端:bash(不建议使用 MobaXterm 工具连接 SSH,可能会导致无法打开配置 GUI,然后一直卡死在那边;Windows 自带的 SSH 可以用,但是在 GUI 的输入中可能看不到退格;推荐使用 Putty)

  • 用户:szc(普通用户,可调用sudo)

安装

  1. 安装依赖

    1
    sudo apt install -y gcc git make 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 zlib1g:i386 screen pax gzip gawk
  2. 前往下载 PetaLinux

    下载 PetaLinux 2021.2 安装程序 (2.1 GB)

    文件名为:petalinux-v2021.2-final-installer.run

    1
    2
    # 校验 我下载的文件MD5校验结果为:fc307268822433258b006b7be02bf78e
    md5sum petalinux-v2021.2-final-installer.run
  3. (可选)下载 PetaLinux 工具 sstate-cache 工件

    考虑到可能每次全新编译都要重新下载文件,非常慢,还是推荐下个完整包,后面编译可以跳过下载过程,会很快

    下载 sstate-cache 2021.2 完整包(57.4 GB)

    文件名为:downloads_2021.2.tar.gz

    1
    2
    3
    4
    5
    # 校验 我下载的文件MD5校验结果为:44d9103360894914a1469046a1ae4d67
    md5sum downloads_2021.2.tar.gz

    # 解压缩,会解压到当前目录下的 downloads 文件夹中
    tar -zxvf downloads_2021.2.tar.gz
  4. 安装

    1
    2
    3
    4
    sudo chown szc:szc petalinux-v2021.2-final-installer.run
    sudo chmod 777 petalinux-v2021.2-final-installer.run
    mkdir petalinux
    ./petalinux-v2021.2-final-installer.run -d petalinux

    安装过程中,查看的两个文件后按q退出,按y同意

  5. 配置 tftp 服务

    1
    2
    3
    4
    5
    6
    7
    8
    # 安装依赖
    sudo apt install -y tftp-hpa tftpd-hpa xinetd

    # 创建工作文件夹
    mkdir -p /home/szc/workspace/zynq_petalinux/tftpboot

    # 创建客户端配置
    sudo vim /etc/xinetd.d/tftp

    配置如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    service tftp
    {
    disable = no 138
    socket_type = dgram
    protocol = udp
    wait = yes
    user = root
    server = /usr/sbin/in.tftpd
    server_args = -s /home/szc/workspace/zynq_petalinux/tftpboot -c
    per_source = 11
    cps = 100 2
    }

    修改服务端配置文件

    1
    sudo vim /etc/default/tftpd-hpa

    TFTP_DIRECTORY 的值修改为 /home/szc/workspace/zynq_petalinux/tftpboot

    然后重启相关服务

    1
    2
    3
    sudo /etc/init.d/xinetd reload
    sudo /etc/init.d/xinetd restart
    sudo /etc/init.d/tftpd-hpa restart

创建工程

  1. 创建工程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # 更新环境变量
    source petalinux/settings.sh
    echo $PETALINUX

    # 创建 Zynq 工程
    petalinux-create --type project --template zynq --name linux_proj

    # 打开工程目录
    cd linux_proj

    # 运行清理工程命令,这会清除所有下载的内容和编译的内容
    # 用于创建 .petalinux/metadata 文件,防止 git 管理出现问题
    petalinux-build -x mrproper

    # 初始化 git 本地仓库
    git init

    # 查看文件跟踪状态
    git status

    # 初次提交
    git add .
    git commit -m "Initial commit"

    *注1:创建的工程里面有默认的git排除文件,可以将整个工程使用git做管理,这边方便跟踪文件修改状态,初始化了git仓库,不做git的也是可以的

    *注2:因为默认创建的工程下没有 .petalinux/metadata 文件,所以 .petalinux 文件夹在提交时会被删除,导致无法创建工程,所以需要先清理一下工程创建这个文件

  2. 使用 Vivado 2021.2 创建硬件工程并配置 PetaLinux 工程

    创建项目并存放在 ../basepl_proj,工程有以下要求

    • 启用一路TTC(必须)

      若启用了多个TTC,则只会用到设备树里的第一个

    • 启用DDR,并确保配置正确(必须)

      需要至少512MB内存

    • 启用串口(必须)

    • 启用SD卡(可选)

    • 启用以太网(可选)

    最后生成 xsa 文件,可以不需要包含 BitStream

    1
    2
    # 载入硬件工程并配置项目
    petalinux-config --get-hw-description=../basepl_proj
    1. 找到 Image Packaging Configuration > tftpboot directory

      修改为 /home/szc/workspace/zynq_petalinux/tftpboot

    2. 确保 Auto Config Settings > [*] Device tree autoconfig 已选中

    3. 确保 FPGA Manager > [*] Fpga Manager 已选中,启用加载FPGA比特流的能力

    4. (可选)上面下载了 sstate-cache 包,可以设置一下增加一下编译速度

      1
      2
      3
      Yocto Settings  --->
      Add pre-mirror url --->
      (file:///home/szc/workspace/zynq_petalinux/downloads) pre-mirror url path

      注意需要在前面加一个 file://,不然编译时会报错

    然后直接退出保存即可,其他设置编译完再改

  3. 全部编译

    先全部编译,需要下载很多包,会花不少时间。

    1
    petalinux-build
  4. 使用 Jtag 运行工程

    1. 关闭板卡电源

    2. 设置启动方式为 JTAG

    3. 连接 USB Cable 到工作站

      由于非Root用户无法使用 JTAG 工具,这里在 /etc/udev/rules.d 中添加一个规则

      1
      vim /etc/udev/rules.d/52-xilinx-digilent-usb.rules

      然后添加以下内容

      1
      2
      3
      # /etc/udev/rules.d/52-xilinx-digilent-usb.rules
      ATTR{idVendor}=="1443", MODE:="777"
      ACTION=="add", ATTR{idVendor}=="0403", ATTR{manufacturer}=="Digilent", MODE:="777"

      保存并退出

      然后重新插拔一下 USB Cable

    4. 连接 USB TTL 到板卡和普通PC

      我将 USB TTL 连接到了我的手提电脑上

    5. 打开板卡电源

    6. 打开手提电脑上的 终端工具 并连接到串口,波特率 115200

      我用的还是 Putty 进行连接的

    7. 在工作站上打包预构建镜像

      1
      petalinux-package --prebuilt --force
    8. 在工作站上启动

      重新烧写之前需要先复位目标板

      1
      petalinux-boot --jtag --prebuilt 3

      速度较慢,需要等好一会儿

    9. 在 串口终端工具中 操作

  5. 使用 TFTP 运行(推荐)

    使用 TFTP 会比纯 JTAG 方式快很多,但前提是需要先在 uboot 中调通 ETH

    1. 参考完成【使用 Jtag 运行工程】前 7 个步骤

    2. 使用网线连接板卡到本地局域网

    3. 在工作站上设置通过 JTAG 引导到 U-Boot

      重新烧写之前需要先复位目标板

      1
      petalinux-boot --jtag --prebuilt 2
    4. 在 串口终端工具中 操作

      可以观察到输出了关于 *** ERROR: 'serverip' not set 的错误

      这是因为没有设置工作站的IP地址导致的

      使用命令 ifconfig 查看工作站的IP地址,我这边是 192.168.2.3

      然后在板卡终端中操作

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 查看设置
      print serverip

      # 设置 TFTP 服务器 IP 地址 并保存环境变量
      setenv serverip 192.168.2.3;saveenv

      # 获取引导固件 并 引导
      pxe get;pxe boot

      ### 可以合成一句话
      setenv serverip 192.168.2.3;pxe get;pxe boot

      然后就启动了

      不过这种方式,每次通过 JTAG 启动就没了 serverip 的环境变量

      可以考虑将 uboot 放到 SD 卡或烧到 spi flash 中

  6. 使用SD卡启动

    1. 创建 BOOT.BIN

      1
      petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --u-boot --force
    2. images/linux 目录下或 TFTP 目录下的 BOOT.BINboot.scrimage.ub 放入 SD 卡的 FAT32 分区下

    3. rootfs.tar.gz 解压到 SD 卡的 ext4 分区

    4. 将 SD 卡插入板卡

    5. 将板卡设置为 SD 卡启动

    6. 板卡上电

    7. 在 串口终端工具中 操作

    *注1:默认启动的 u-boot 中不会启动 dhcp 分配,需要输入 dhcp 才能分配到 ip 地址

定制系统

  1. SSH 服务器

    默认自带了 SSH 服务器,默认密码是 root

  2. OpenAMP(Linux + 裸机)

    参考本站的 【Zynq】PetaLinux裸机配置OpenAMP

Petalinux 系统中相关命令参考

  1. 烧写 FPGA

    使用参考:Solution Zynq PL Programming With FPGA Manager

    状态参考:sysfs-class-fpga-manager

    他只支持烧写 bin 格式的 bit 文件

    1. bit 转成 bin

      在工作站上执行

      1
      bootgen -image Full_Bitstream.bif -arch zynq -process_bitstream bin

      Full_Bitstream.bif 的内容如下

      1
      2
      3
      4
      all:
      {
      design_1_wrapper.bit /* Bitstream file name */
      }
    2. 使用 sysfs 烧写

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      # 设置标志
      echo 0 > /sys/class/fpga_manager/fpga0/flags

      # 创建文件夹,这个文件夹是驱动程序默认加载固件的地方
      mkdir -p /lib/firmware

      # 将固件复制到该文件夹
      cp design_1_wrapper.bit.bin /lib/firmware/

      # 开始加载固件,加载成功会立刻开始运行,支持重复加载
      echo design_1_wrapper.bit.bin > /sys/class/fpga_manager/fpga0/firmware

      # 查看是否加载成功,operating 就是成功且在运行了
      cat /sys/class/fpga_manager/fpga0/state
  2. 睡眠

    1
    2
    3
    4
    5
    6
    7
    8
    # 查看支持哪几种睡眠方式
    cat /sys/power/state

    # IO设备低功耗,处理器进入空闲状态
    echo "freeze" > /sys/power/state

    # 进入睡眠,将状态保存到内存然后停止运行
    echo "mem" > /sys/power/state

    这几种睡眠方式并不能停止 PL 端的工作

【Zynq】PetaLinux 2021.2构建Zynq7020的固件

https://biteax.com/bfdbb1ca.html

作者

石志超

发布于

2022-04-20

更新于

2023-09-27

许可协议