This page describes how to build and run the Angstrom Distribution on Zynq UltraScale+

Table of Contents

Introduction

Angstrom is an embedded Linux Distribution similar to Poky. It provides opkg as the package manager to install binaries from package feeds similar to higher level distros like Ubuntu and CentOS. Angstrom is based on OpenEmbedded-Core and currently supports the Yocto build flow hosted on Github. This article is intended for those who want to migrate existing Angstrom platforms to Zynq UltraScale+ platforms. Angstrom Thud and Zeus releases will build and run on ZCU102.

note

Poky is the Xilinx preferred Yocto Distribution. Angstrom should only be used by experienced customers who need to maintain a legacy code base.

Poky is the Xilinx preferred Yocto Distribution. Angstrom should only be used by experienced customers who need to maintain a legacy code base.

Angstrom is not WTS supported. Please do your due diligence and regression test against your requirements.

Build Angstrom

note

This build flow does not generate the low level boot components such as FSBL and PMUFW, nor does it package a boot.bin bootable image. These images need to be built outside of this flow.

This build flow does not generate the low level boot components such as FSBL and PMUFW, nor does it package a boot.bin bootable image. These images need to be built outside of this flow.

Zeus release builds and runs, but does have some build warnings. Thud release is a cleaner build.

The build flow is Yocto based using meta-angstrom as the distro layer. Angstrom uses Repo to manage the repositories.

Install Repo

Cd into a directory where you keep utilities and make sure it's in your PATH.

$ mkdir ~/bin && cd ~/bin/

Download the Repo script.

$ curl https://storage.googleapis.com/git-repo-downloads/repo > repo

Make Repo executable.

$ chmod a+x repo

Fetch Angstrom Manifest

Create and cd into your working directory.

$ mkdir ~/angstrom && cd ~/angstrom

Fetch the manifest and checkout the target release version, e.g. angstrom-v2019.12-zeus.

$ repo init -u https://github.com/Angstrom-distribution/angstrom-manifest -b angstrom-v2019.12-zeus

Recommend checking out either Zeus or Thud release.

Patch the Manifest

The “meta-xilinx” layer is supported by the repo manifest, but it is not supported in the default “bblayers.conf”, so we need to do some work to enable it. There are also some layers that cause errors, so we need to fix them.

note

The patches below are based on commit ID 89ea19b94b58f1cfdcbc5fd0bbbf2df6d34e90c7 from Zeus branch. You may or may not need these patches depending on the state of the repo.

The patches below are based on commit ID 89ea19b94b58f1cfdcbc5fd0bbbf2df6d34e90c7 from Zeus branch. You may or may not need these patches depending on the state of the repo.

Create a new manifest development branch, e.g. xlnx-angstom.

$ git checkout xlnx-angstrom

Cd into the “manifests” directory and edit “default.xml”.

$ cd .repo/manifests
$ vi default.xml

Change the “meta-xilinx” revision to “zeus”.

   <project name="meta-virtualization" path="layers/meta-virtualization" remote="yocto"/>
-  <project name="meta-xilinx" path="layers/meta-xilinx" remote="yocto" revision="f3c8b1c9a8ae6a1690f7f5d907b65c588f65446a"/>
+  <project name="meta-xilinx" path="layers/meta-xilinx" remote="yocto" revision="zeus"/>
   <project name="ndechesne/meta-qcom" path="layers/meta-qcom" remote="github"/>
   <project name="openembedded/bitbake" path="bitbake" remote="github" revision="1.44"/>

Save the default.xml and commit the change.

$ git commit -a -m "updated meta-xilinx branch to zeus"
note

The Angstrom manifest points to the meta-xilinx layer hosted on yoctoproject.org. If desired, you may use the forked meta-xilinx layer hosted on Xilinx GitHub which has the latest Xilinx commits.

The Angstrom manifest points to the meta-xilinx layer hosted on yoctoproject.org. If desired, you may use the forked meta-xilinx layer hosted on Xilinx GitHub which has the latest Xilinx commits.

Cd into the “conf” directory and edit the bblayers.conf file.

$ cd conf
$ vi bblayers.conf

Add the meta-xilinx-bsp and meta-xilinx-standalone layers.

   ${OEROOT}/layers/meta-meson \
+    ${OEROOT}/layers/meta-xilinx/meta-xilinx-bsp \
+    ${OEROOT}/layers/meta-xilinx/meta-xilinx-standalone \
 "

Save “bblayers.conf” and and commit the change.

$ git commit -a -m "added meta-xilinx to bblayers.conf"

Edit “bblayers.conf” and delete the “meta-edison” layer, otherwise the build will fail.

   ${OEROOT}/layers/meta-qcom \
-  ${OEROOT}/layers/meta-edison \
   ${OEROOT}/layers/meta-96boards \

Save “bblayers.conf” and and commit the change.

$ git commit -a -m "remove meta-edison from bblayers.conf"
note

Thud release does not require this patch.

Thud release does not require this patch.

Cd up a directory.

cd ..

Edit “default.xml” and change the “meta-maker” revision to “zeus”.

   <project name="koenkooi/meta-kodi" path="layers/meta-kodi" remote="github" revision="thud"/>
-  <project name="koenkooi/meta-maker" path="layers/meta-maker" remote="github" revision="warrior"/>
+  <project name="koenkooi/meta-maker" path="layers/meta-maker" remote="github" revision="zeus"/>
   <project name="koenkooi/meta-photography" path="layers/meta-photography" remote="github" revision="thud"/>
$ git commit -a -m "updated meta-maker branch to zeus"
note

Thud release does not require this patch.

Thud release does not require this patch.

Create the patches directory and generate a patchset for these 4 commits (2 if building Thud).

$ git format-patch -o patches -4

Cd to your top level Yocto directory.

$ cd ../..

Fetch Source Repositories

Fetch all the source from the repositories in the manifest.

$ repo sync

Create local branches with your project name, e.g. xlnx-angstrom.

$ repo start xlnx-angstrom --all

Configure Angstrom for ZCU102

Configure the Yocto build environment.

$ MACHINE=zcu102-zynqmp . setup-environment

The setup-environment script will generate the “conf/auto.conf” file. Edit “conf/auto.conf” and remove SPL and boot.bin targets as shown below.

SPL_BINARY = ""
EXTRA_IMAGEDEPENDS_remove = "virtual/boot-bin"
note

This “auto.conf” change is persistent and only needs to be done once following the initial run of the setup script.

This “auto.conf” change is persistent and only needs to be done once following the initial run of the setup script.

Bitbake Angstrom

Bitbake an image, e.g. angstrom-image.

$ MACHINE=zcu102-zynqmp bitbake angstrom-image

The angstrom-image builds, however, other images may not build by default due to missing dependencies.

Run Angstrom on ZCU102

Format an SD card with 2 partitions where the first partition is FAT (boot) and the second partition is EXT4 Linux (rootfs). Mount the partitions on your host. Copy a compatible boot.bin from either Petalinux or Xilinx Yocto flow to the boot partition.

Cd into the deploy directory for the ZCU102.

$ cd deploy/glibc/images/zcu102-zynqmp

Then copy Image, zynqmp-zcu102-rev1.0.dtb and boot.scr to the FAT partition.

$ cp Image zynqmp-zcu102-rev1.0.dtb boot.scr <sd-p1>

Finally extract the root filesystem to the EXT4 partition (may need to be root).

$ tar xf base-image-zcu102-zynqmp.tar.gz -C <sd-p2>

Plug in the SD card to the ZCU102 and boot the board.

Related Links

  1. https://github.com/Angstrom-distribution/angstrom-manifest

  2. https://github.com/Angstrom-distribution/meta-angstrom