ZYBOのクロス開発環境の構築  (2017年10月時点)

#はじめに
積みボード化していたDigilent社のZynq-7010の開発ボード"ZYBO"のLinux開発環境構築に伴うメモを記載する。
XilinxのWikiを眺めたり先駆者の方々の記事を参考にさせて頂き、なるべくシンプルな方法で進めたつもり。実働工数は24h程度。

#開発環境
- Windows10 OSのVaio Pro 13インチ、VirtualBoxの仮想環境にUbuntu 16.04 LTS 64bitをインストール
- VivadoもインストールするつもりなのでHDDは100GB確保 

#FPGA開発環境の構築
##Vivado 2017.3とSDKのインストール
XilinxのWebのダウンロードページからLinux用インストーラ(binファイル)をダウンロードし、実行権限を付与して/opt/Xilinxにインストールする。とり急ぎ必要のないZynq-7000以外のデバイスに関するファイルを削り5.2GB程度の容量になった。

```bash
$ sudo chmod +x FileName.bin
$ sudo ./FileName.bin
```

ちなみに仮想環境ではホストのWindowsとゲストのUbuntuの”日付と時刻”がずれていると、Vivadoインストール時にXilinxのユーザー認証画面が出たままインストールが進まないことがあるようでハマった…。[(Xilinxのフォーラムで解決済)](https://forums.xilinx.com/t5/Installation-and-Licensing/Vivado-HLx-2015-4-Installation-User-Authentication-Loop/td-p/676758)

##CableDriverその他設定
[こちら](http://marsee101.blog19.fc2.com/blog-entry-3740.html)のmarseeさんの記事をそのまま参考にさせて頂きインストール完了。

#Yoctoの環境構築
ZYBOの発売当時はDigilent社のチュートリアルに従いVivado及びSDKを利用してブートイメージ(FSBL, U-boot)を作成する手順が広く紹介されていたようだが、最近はXilinxの開発環境を使わずYocto Projectのクロスコンパイル環境で進めたほうがシンプルなよう。[XilinxのWiki](http://www.wiki.xilinx.com/Getting+Started)も一通り目を通してみたもののイマイチ要領が掴めなかったこともあり(PetalinuxもYoctoの派生のようだし)、ここでは後者で進めることにする。ちなみにZynqのブート詳細は有難いことに[ikwzmさんの記事](https://qiita.com/ikwzm/items/efacec8d8e0744e17d45)で非常に詳しく解説されている。

参考にさせて頂いた資料は下記の通り
- [Yocto Project Quick Start](https://www.yoctoproject.org/docs/current/yocto-project-qs/yocto-project-qs.html)
- [ZynqでYoctoを使う](http://www.sinby.com/backyard-report/004-Yocto/Yocto-for-Zynq.html)
- [ZyboのSPLをQSPIで動かす](https://qiita.com/ryos36/items/7700f33618365d1618a9)
- [Zynq + Yocto で USB デバイスをつくってみた](https://qiita.com/ryos36/items/d892a40a695ef54dc5b1)
- [ZedBoard向けYoctoのビルド(1)](http://msyksphinz.hatenablog.com/entry/2015/02/12/074450)

###必要なpackageのインストール

```bash:Ubuntu
$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
     build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
     xz-utils debianutils iputils-ping libsdl1.2-dev xterm
```

###Yocto Projectリリースファイルとメタファイルの入手
2017年10月現在の最新版であるpyro 2.3.2を利用する。ZYBO含むXilinx FPGAの開発ボードをサポートするメタファイルも入手する。
(※追記　meta-xilinxについてはこの時点のmasterをcloneしてしまったが、pyroのbranchがあるためそっちを持ってきたほうが良かったかも)

```bash
$ git clone -b pyro git://git.yoctoproject.org/poky.git
$ git clone git://git.yoctoproject.org/meta-xilinx.git
```

###セットアップスクリプトの実行

```bash
$ cd poky
$ source oe-init-build-env
```

ここまででbitbakeのための基本環境設定が完了(カレントディレクトリは/poky/buildになる)。以降はZYBO開発ボードのための設定を行うため`/poky/build/conf`にあるlocal.confとbblayers.confを編集する。まずはlocal.confのMACHINEをZYBO用に変更する。因みにMACHINEに設定可能なリストはmeta-xilinxで見つけることができる。

```bash
$ find ../../meta-xilinx/conf -name \*.conf | grep conf/machine
../../meta-xilinx/conf/machine/zc706-zynq7.conf
../../meta-xilinx/conf/machine/kc705-microblazeel.conf
中略
../../meta-xilinx/conf/machine/zybo-linux-bd-zynq7.conf
../../meta-xilinx/conf/machine/zybo-zynq7.conf
```

上記のうち、zybo-linux-bd-zynq7に関しては[ここ](https://lists.yoctoproject.org/pipermail/meta-xilinx/2016-April/001537.html)に説明があった。
> This series has the following changes:
  * Machine:
    * Add zybo-linux-bd-zynq7 machine support. The hardware enables the
      follows:
      - HDMI output
      - Sound
      - AXI GPIO
  * Kenrel:
    * Add Digilent encoder driver and AXI Dynclk drivers for both linux-xlnx
      and linux-xlnx-dev
    * Add config fragments for:
      - Xilinx DRM
      - Keyboard GPIO
      - V4L2
      - Digilent DRM
  * U-boot:
    * Add SPL load bitstream and uEnv.txt support to 2016.03 u-boot
    * Add custom uEnv.txt file for zybo-linux-bd-zynq7
  * Add wic SD card kickstart image defintion and use it to generate wic image
    for sd card.
  * Add fitiamge generation support with xilinx-fitimage image type
  * Add workaround recipes (X and console) for screen wakeup issue
  * New recipe to fetch HDF from external website to provide bitstream and
    ps7_init_gpl.h/c

>This series provides a working Zybo BSP support base on Digilent's linux_bd
poject design which can be found in github
(https://github.com/Digilent/ZYBO/tree/master/Projects/linux_bd). The key
feature of this hardware project is to provide HDMI out.

Digilentの特定のプロジェクトに関連するようなので、今回は上記ではなくzybo-zynq7を素直に設定することにする。
Default設定としてqemux86が記述されているので書き換えるとともに、Yocto ProjectのQuick Startに記載されているINHERIT += "rm_work"を追記。ビルド中のディスクスペース節約になるとのこと。

```bash
$ vim conf/local.conf

MACHINE ?= "zybo-zynq7"
INHERIT += "rm_work"
```

続いてBitBakeのレイヤー設定。

```bash
$ vim conf/bblayers.conf

# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "1"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  /home/ryuichiro/sources/poky/meta \
  /home/ryuichiro/sources/poky/meta-poky \
  /home/ryuichiro/sources/poky/meta-yocto-bsp \
  /home/ryuichiro/sources/meta-xilinx \
  "
```

ここまで終われば、あとはbitbakeのビルドを実行するのみ。[ここ](https://www.ibm.com/developerworks/jp/linux/library/l-yocto-linux/index.html)の説明の通りGUIは必要ないので最小構成で実行する。
>Poky は Yocto Project のリファレンス・ビルド・システムです。Poky には、BitBake、OpenEmbedded-Core、BSP (Board Support Package) に加え、ビルドに組み込まれる他のあらゆるパッケージやレイヤーが含まれています。また Poky という名前は、このリファレンス・ビルド・システムを使用してビルドされたデフォルトの Linux ディストリビューションのことも指しています。このディストリビューションは最小限のシステム (core-image-minimal) の場合もあれば、GUI を備えた完全な Linux システム (core-image-sato) の場合もあります。

```bash
$ bitbake core-image-minimal
```

ビルド終了まで数時間待ち。
次回はビルド生成物からzynq起動までを行う。