Welcome to Avnet-Ultra96-V2 Documentation

For this course on Xilinx Zynq UltraScale+ MPSoC development, we have selected the Avnet-Ultra96-V2 platform as the reference development kit. There are several advantages in using this platform for an introductory course, enabling the potential reach to a wider audience:

  • The Avnet Ultra96-V2 is powered by a Xilinx ZU3EG device that contains a fully featured processing system (PS) and a smaller programmable logic (PL) supported by free Xilinx development licenses.

  • The Avnet Ultra96-V2 is one of the cheapest development kits based on the Xilinx Zynq UltraScale+ MPSoC devices, which makes it the ideal choice for both hobbyist and enterprise level courses.

  • The Avnet Ultra96-V2 follows the 96 Boards standard promoted by Linaro for advanced ARM based platforms, so it supports a huge range of commercially available mezzanine and expansion cards.

Bootloader ( U-boot )

  • configure

    How to configure bootloader.

  • compile

    How to compile bootloader.

  • development

    Guidelines and release planning and check dependencies.

  • changelog

    The bootloader development changelog.

Configure

1. —

1.1 —
1.1.1 —

Compile

Development

Changelog

Kernel ( Linux )

Configure

Compile

Development

Changelog

RootFS ( Linux )

  • build

    How to create a rootfs image

  • development

    Guidelines and release planning and check dependencies.

  • changelog

    The rootfs development changelog.

Build

Development

Changelog

Petalinux

  • Build

    How to build in Petalinux

  • debug

    Guidelines and release planning and check dependencies.

  • changelog

    The petalinux development environment changelog.

Build

1. Setup Build Environment

1.1 Docker
1.2 NFS

【 Host Server 】

1.2.1 리눅스 커널 설정 변경
  • NFS 파일 시스템을 지원할 수 있도록 리눅스 커널 설정 변경

$ petalinux-config -c kernel
_images/nfs_0.jpg _images/nfs_1.jpg
$ petalinux-config -c kernel -x build
1.2.2 NFS 서버 패키지 설치
$ sudo apt insall nfs-kernel-server
$ sudo apt install nfs-common
1.2.3 NFS 서버 환경 설정
  • 공유 디렉토리 설정

$ sudo vim /etc/exports

/nfs *(rw,sync,no_subtree_check,no_root_squash)
Options

Option

Description

/nfs

공유 디렉토리 ( 경로 포함 )

IP

허용 클라이언트 IP 를 지정 ( *: 전체 서브넷 허용 )

rw

Stands for read / write ( ro: Read-only file system )

sync

Requires changes to be written to the disk beefore the are applied

no_subtree_check

Eliminates subtree checking

no_root_squash

클라이언트에게 root 권한 접금을 허용하지

  • NFS 서버 재구동

$ sudo exportfs -a
$ sudo exportfs -v    # or showmount -e

/nfs            <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

$ service nfs-kernel-server restart    # stop -> start

【 Target Board Client 】

1.2.4 NFS 파일 시스템 지원 여부 확인
  • /proc/filesystems 에서 커널이 지원하는 파일 시스템들 중에 NFS 를 지원하는지 확인

$ cat /proc/filesystems

nodev    nfs
nodev    nfs4
_images/nfs_2.jpg
1.2.5 NFS 클라이언트 패키지 설치
  • NFS 디렉토리를 마운트하기 위해 필요한 패키지 설치

$ petalinux-config -c rootfs
_images/nfs_3.jpg
$ petalinux-build -c rootfs -x build
1.2.6 NFS 네트워크 드라이브 연결
  • 부팅 후 자동 마운트

$ sudo vi /etc/fstab

x.x.x.x:/nfs /mnt/nfs nfs defaults 0 0
1.3 CIFS

【 Host Server 】

1.3.1 리눅스 커널 설정 변경
  • CIFS 파일 시스템을 지원할 수 있도록 리눅스 커널 설정 변경

$ petalinux-config -c kernel
_images/cifs_0.jpg _images/cifs_1.jpg
$ petalinux-config -c kernel -x build
1.3.2 CIFS 서버 패키지 설치
$ sudo apt insall cifs-utils
1.3.3 Samba 계정 생성
$ sudo smbpasswd -a [ID]
1.3.4 공유 디렉토리 설정
_images/cifs_2.jpg

【 Target Board Client 】

1.3.5 CIFS 클라이언트 패키지 설치
  • CIFS 디렉토리를 마운트하기 위해 필요한 패키지 설치

$ vim ./components/yocto/layers/meta-petalinux/recipes-core/images/petalinux-image-user.bb
_images/cifs_3.jpg
$ vim ./components/yocto/layers/meta-petalinux/recipes-core/images/petalinux-image-user.inc

# 아래 두 패키지 추가
cifs-utils \
nfs-utils \
_images/cifs_4.jpg
1.2.6 CIFS 네트워크 드라이브 연결
  • CLI에서 명령어 입력을 통한 마운트

$ mount -t cifs -o user=xxx,password=xxx \\x.x.x.x\cifs /mnt/cifs
# mount -t cifs -o user=[ID],password=[PASSWORD] \\[IP]\[공유 디렉토리] [마운트 디렉토리]
  • 부팅 후 자동 마운트

$ sudo vi /etc/fstab

//x.x.x.x/Public /mnt/cifs cifs user=xxx,password=xxx,_netdev 0 0

2. Compile

$ source ./settings.sh
$ petalinux-build    # Full build
2.1 Bootloader Compile
$ petalinux-build -c u-boot -x clean
$ petalinux-build -c u-boot -x cleansstate
$ petalinux-build -c u-boot -x mrproper
$ petalinux-config -c u-boot
$ petalinux-build -c u-boot -x build
2.2 Kernel Compile
$ petalinux-build -c kernel -x clean
$ petalinux-build -c kernel -x cleansstate
$ petalinux-build -c kernel -x mrproper
$ petalinux-config -c kernel
$ petalinux-build -c kernel -x build

3. Create Rootfs

Small rootfs:

$ vim ./components/yocto/layers/meta-petalinux/recipes-core/images/petalinux-image-user.bb
$ vim ./components/yocto/layers/meta-petalinux/recipes-core/images/petalinux-image-user.inc

$ petalinux-build -c petalinux-image-user -x clean
$ petalinux-build -c petalinux-image-user -x cleansstate
$ petalinux-build -c petalinux-image-user -x mrproper
$ petalinux-build -c petalinux-image-user -x build

Normal rootfs:

$ petalinux-build -c rootfs -x clean
$ petalinux-build -c rootfs -x cleansstate
$ petalinux-build -c rootfs -x mrproper
$ petalinux-config -c rootfs
$ petalinux-build -c rootfs -x build

Mount rootfs:

$ mkdir rootfs/
$ sudo mount -t ext4 rootfs.ext4 rootfs/
$ ls rootfs/
$ sudo umount rootfs/

4. Create Boot Images

$ cd ./petalinux_u96v2/bsp/images/linux
$ petalinux-package --boot --fsbl zynqmp_fsbl.elf --fpga system.bit --pmufw pmufw.elf --u-boot --force

5. Flash Images

$ cd ./petalinux_u96v2/bsp/images/linux
5.1 INITRAMFS
  • RAM-based File System ( INITRAMFS, JTAG )

  1. Petalinux Configuration for INITRAMFS

    $ petalinux-config
    
    _images/initramfs_0.png

    _images/initramfs_1.png

  1. Create RootFS

    $ petalinux-build -c petalinux-image-user -x build
    $ mkdir initramfs
    $ tar -xf rootfs.tar.gz -C initramfs
    or
    $ sudo mount -t ext4 rootfs.ext4 initramfs
    
  1. Kernel Configuration for INITRAMFS

    $ petalinux-config -c kernel
    
    _images/initramfs_3.png _images/initramfs_4.png _images/initramfs_5.png

    1. Modify boot argument

      $ vim ./project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
      

      Note

      Modify ‘chosen’ node.

      bootargs = "earlycon console=ttyPS0,115200 clk_ignore_unused root=/dev/ram0 rw rootwait quiet

    2. Apply the modification to DTB and Create linux kernel image included RooFS

      $ petalinux-build -c kernel -x build
      

      Note

      chosen 노드 수정 사항이 제대로 적용되었는지 DTB을 DTS로 변환하여 확인해본다.

      $ dtc -I dtb -O dts -f system.dtb -o system.dts

  2. Create BOOT.BIN

    $ petalinux-package --boot --fsbl zynqmp_fsbl.elf --fpga design_1_wrapper.bit --pmufw pmufw.elf --u-boot --force
    
  3. JTAG Downloads

    $ petalinux-boot --jtag --u-boot --fpga --bitstream design_1_wrapper.bit --pmufw pmufw.elf
    $ petalinux-boot --jtag --kernel --fpga --bitstream design_1_wrapper.bit --pmufw pmufw.elf
    
    _images/initramfs_6.png

    $ df -h
    
    _images/initramfs_7.png

    Note

    PMUFW / FSBL은 bitstream의 XSA ( Export Hardware )로 생성한 Vitis IDE ‘Platform project’에서 빌드한 이미지를 사용한다.

    Warning

    --u-boot 옵션은 u-boot CLI에서 빠르게 작업을 진행하기 위해 linux kernel 이미지와 RooFS를 메모리에 적재하지 않는다.

5.2 eMMC
  • Flash-based File System ( eMMC, JTAG )

  1. Petalinux Configuration for Ext4 File System

    $ petalinux-config
    
    _images/emmc_0.png _images/emmc_1.png
    $ petalinux-build -c petalinux-image-user -x build
    
  2. Kernel Configuration for Ext4 File System

    $ petalinux-config -c kernel
    
    _images/emmc_2.png _images/emmc_3.png
    1. Modify boot argument

      $ vim ./project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
      

      Note

      Modify ‘chosen’ node.

      bootargs = "earlycon console=ttyPS0,115200 clk_ignore_unused root=/dev/mmcblk0p2 rw rootwait quiet

    2. Apply the modification to DTB and Create linux kernel image included RooFS

      $ petalinux-build -c kernel -x build
      

      Note

      chosen 노드 수정 사항이 제대로 적용되었는지 DTB을 DTS로 변환하여 확인해본다.

      $ dtc -I dtb -O dts -f system.dtb -o system.dts

  3. Create BOOT.BIN

    $ petalinux-package --boot --fsbl zynqmp_fsbl.elf --fpga design_1_wrapper.bit --pmufw pmufw.elf --u-boot --force
    
5.2 SD Card

Partition:

$ sudo fdisk /dev/sdx
$ sudo fdisk -l

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sdx1          2048  2099199  2097152    1G  c W95 FAT32 (LBA)
/dev/sdx2       2099200 31205375 29106176 13.9G 83 Linux

Format:

$ sudo mkfs -t ext4 /dev/sdx2

Specify mount directory:

$ sudo vim /etc/fstab

UUID=5AA3-7D75 /media/louis/SD_BOOT vfat defaults 0 0
UUID=2749244d-79ab-4493-87b1-2dace4105cbb /media/louis/SD_ROOTFS ext4 defaults 0 0

Insert SD Card and Check mount info:

$ dmesg | tail
$ mount

Write boot images BOOT.BIN image.ub boot.scr to BOOT partition:

$ sudo cp BOOT.BIN image.ub boot.scr /media/louis/SD_BOOT

Write rootfs images rootfs.ext4 to ROOTFS partition:

$ sudo dd if=rootfs.ext4 of=/dev/sdx2
or
$ make rootfs/
$ mount -t ext4 rootfs.ext4 rootfs/
$ sudo cp -rf rootfs/* /media/louis/SD_ROOTFS
$ sync
5.4 NFS

Host:

$ sudo cp BOOT.BIN boot.scr image.ub /mnt/shared/images/u96v2-v2021.2-images/linux/
$ sudo cp rootfs.ext4 /mnt/shared/images/u96v2-v2021.2-images/linux/

Target Board:

$ ifconfig eth0 up x.x.x.x or ifup eth0 ( /etc/network/interface )
$ cp /mnt/cifs/images/u96v2-v2021.2-images/linux/BOOT.BIN
$ cp /mnt/cifs/images/u96v2-v2021.2-images/linux/image.ub
$ reboot

Debug

Changelog

Vitis IDE

  • Build

    How to build using Vitis IDE tool

  • Debug

    How to debug using Vitis IDE tool

Build

Debug