Ultra96-PYNQを自分でビルドする

Avnet社Ultra96ボードで動作するPYNQ v2.4を自前でビルドする手順です。

単にUltra96-PYNQを使うだけなら、ビルド済のイメージを[Avnetのページ](http://zedboard.org/product/ultra96-and-pynq-framework)からダウンロードしてSDカードに書き込めばOKですが、カーネルの設定を変えたいなどの場合は一からビルドする必要があると思います。

おおまかな手順は[Ultra96-PYNQリポジトリのREADME.md](https://github.com/Avnet/Ultra96-PYNQ/blob/master/README.md)に書いてある通りです。備忘録として詳細をまとめました。

## 準備
### OS
Ubuntu 16.04をインストールしたマシンを用意します。
ディスクの空き容量は~~200GB~~130GBぐらい必要です。メモリは最低8GB必要とのことです。

### Xilinx開発環境のインストール
#### SDSoC 2018.3
Xilinxの[ダウンロードページ](https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/sdx-development-environments.html)から「Linux 64 用 SDSoC 2018.3 ウェブ インストーラー」をダウンロードしてインストールします。
#### PetaLinuxツール 2018.3
同じくXilinxの[ダウンロードページ](https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/embedded-design-tools.html)から「PetaLinux 2018.3 インストーラー」をダウンロードしてインストールします。
足りないパッケージがある場合は適宜sudo apt installします。

zshを使っている場合、設定スクリプトのsettings.shを次の通り書き換えるとよいです。
(インストールしたディレクトリは /opt/petalinux-v2018.3-final )

```diff
 SETTINGS_FILE='settings.sh'
 # The right location will be replaced by the installer
-XIL_SCRIPT_LOC="./"
+XIL_SCRIPT_LOC="/opt/petalinux-v2018.3-final/"
 
 if [ $# != 0 ]; then
 	# The first argument is the location of PetaLinux Installation
@@ -14,18 +14,18 @@
 	XIL_SCRIPT_LOC="$1"
 else
 	#  XIL_SCRIPT_LOC should point to script location
-	if [ "$0" == "ksh" ]; then
+	if [ "$0" = "ksh" ]; then
 		XIL_SCRIPT_LOC_TMP_UNI=`readlink -f ${XIL_ARG_}`
 	else
 		XIL_SCRIPT_LOC_TMP_UNI=$BASH_SOURCE
 	fi
 	XIL_SCRIPT_LOC_TMP_UNI=${XIL_SCRIPT_LOC_TMP_UNI%/*}
 	if [ "$XIL_SCRIPT_LOC_TMP_UNI" != "" ]; then
-		if [ "$XIL_SCRIPT_LOC_TMP_UNI" == "settings.sh" ]; then
+		if [ "$XIL_SCRIPT_LOC_TMP_UNI" = "settings.sh" ]; then
 			XIL_SCRIPT_LOC_TMP_UNI="./"
 		fi
 		XIL_SCRIPT_LOC_TMP_UNI=`readlink -f ${XIL_SCRIPT_LOC_TMP_UNI}`
-		if [ $? == 0 ]; then
+		if [ $? = 0 ]; then
 			XIL_SCRIPT_LOC=${XIL_SCRIPT_LOC_TMP_UNI}
 		fi
 	fi
```

それぞれのツールにパスを通します。

```sh
$ source /opt/sdsoc.2018.3/SDx/2018.3/settings64.sh
$ source /opt/petalinux-v2018.3-final/settings.sh
```
## Ultra96-PYNQのビルド

### Ultra96-PYNQの取得
Ultra96-PYNQをGitHubからcloneします。

```sh
$ git clone https://github.com/Avnet/Ultra96-PYNQ
```

最新のimage_v2.4ブランチをチェックアウトします。2018.3より古いXilinxツールをインストールしている場合は適当なブランチに変更して下さい。

```sh
$ git checkout image_v2.4
```

### PYNQの取得
PYNQをGitHubからcloneします。

```sh
$ git clone https://github.com/Xilinx/PYNQ
```

image_v2.4ブランチをチェックアウトします。

```sh
$ git checkout image_v2.4
```

### ビルド

ビルド用のディレクトリに移動します。

```sh
$ cd PYNQ/sdbuild
```

PYNQのビルドに必要なパッケージとQEMUとCrosstool-NGは、スクリプトでまとめてインストールするようになっています。スクリプトの途中sudoを使っているところがあるため、パスワードなしでsudoできるようにしておきます。

```sh
$ sudo visudo
```

で設定ファイルを開き、

```
<ユーザ名> ALL=NOPASSWD: ALL
```
を最後の行に追加します。

ビルドのセットアップスクリプトを実行します。

```sh
$ scripts/setup_host.sh
```

QEMUとCrosstool-NGのインストールディレクトリにパスを通します。

```sh
$ export PATH=/opt/qemu/bin:/opt/crosstool-ng/bin:$PATH
```

これで準備が整いました。Ultra96-PYNQをcloneしたパスを指定してビルドします。

```sh
$ make clean
$ make BOARDDIR=/home/okuhata/Ultra96-PYNQ
```

かなり時間がかかります。パスワードなしでsudoができない場合、ビルド途中でパスワード入力を求められます。


### 完了

ビルドしてできたイメージは`PYNQ/sdbuild/output/Ultra96-2.4.img`にあります。
出来上がったイメージをmicroSDカードに書き込み、Ultra96ボードに挿入して起動します。


# 参考
[ZCU102向けPYNQビルド 備忘録](https://qiita.com/jin0g/items/42d53fd1eca42ec17c0f)