(開発中・いずれ整理します)Ultra96-V2の起動まで

# はじめに
開発中に記載したものを放置してしまっている状態です．もっといい方法も見つかっていますが，自分が抱えているタスクが落ち着いたら整理します．参照する方は参考程度にお願いします。

プログラマブルSoCを活用したCPU-FPGA協調システムを開発するために，Ultra96-V2を採用しました．文献を参考にしながら，Petalinuxをインストールし，Ultra96-V2を起動するところまででも躓きポイントがいくつかあったので，これから開発を始める人のために残しておきます．

※もっと簡単で良い方法がこのリンク先で紹介されています。こちらはavnetによるgithubから、git cloneして、BSPファイルの生成からSDカード書き込み用イメージの作成まで行う。この方法で行えば、avnet hdlファイルもあるので、Vivadoプロジェクトを編集することもできる。
https://qiita.com/basaro_k/items/fa64871ada20eb9ea2e4






# 目次
<!-- タイトルとアンカー名を編集 -->
1. [ultra96v2用bspファイルのダウンロード](#bsp_download)
2. [petalinuxのインストール](#peta_install)
3. [petalinuxのセットアップ](#peta_setup)
4. [ultra96v2用bspファイルのビルド](#bsp_build)
5. [ビルド時の原因不明なエラーの報告](#error_report)
6. [Ultra96-V2起動用BOOT.BINイメージの作成](#bootbin_create)
7. [Ultra96v2ボードのブート用SDカードの作成](#sd_create)
8. [Ultra96v2ボードの起動とssh接続](#boot)
6. [参考文献(公式)](#ref_official)
7. [参考文献(ブログ)](#ref_blog)
8. [文献紹介](#reference)



# 開発環境
PetalinuxをインストールするPCのOSはLinuxである必要があります．自分はubuntu18.04LTSです．


<a id="#bsp_download"></a>
# Ultra96-V2用bspファイルのダウンロード
bspファイルとPetalinuxのバージョンを合わせる必要があるので注意．また，2019.1以前と2019.2以降ではFPGA開発に使用するツール(Vivado, Vitis)が大きく変わってしまうので注意。
参考URL: https://qiita.com/basaro_k/items/fa64871ada20eb9ea2e4

```言語名:端末
$ git clone -b 2019.1 https://github.com/Avnet/hdl.git
$ git clone -b 2019.1 https://github.com/Avnet/petalinux.git
$ git clone https://github.com/Avnet/bdf.git
$ cd ./petalinux/scripts
$ source ./make_ultra96v2_obb_bsp.sh 
```

以下の2サイトでもUltra96-V2用のbspファイルが配布されていますが，使用されているIPの定義ファイルがなかったりと既知の問題がそのままになっています．githubで最新版を取得するようにしましょう．

AVNETホームページ / サポート / リファレンスデザイン・チュートリアル / Ultra96-V2開発ボード
http://zedboard.org/support/design/28476/181
element14 AVNETコミュニティサイト / ULTRA96-V2で検索 / Reference Designsを選択
https://www.element14.com/community/docs/DOC-95649






<a id="#peta_install"></a>
# petalinuxのインストール
下記のサイトで、petalinuxを選択、バージョンを選択、Petalinuxインストーラーをクリックして、petalinuxのインストーラーをダウンロードする。
XILINXホームページ / サポート / サポート / ダウンロードとライセンス
https://japan.xilinx.com/support/download.html

次に、ダウンロードしたインストーラーに実行権限を付与してから実行する。

```言語名:端末
$ chmod +x petalinux-v2018.3-final-installer.run   //実行権限の付与
$ ./petalinux-v2018.3-final-installer.run <インストール先ディレクトリ>   //実行
```
※chmodはパーミッション変更コマンド。オプションで+(付与)x(実行権限)を与えている。
※インストール後にインストールディレクトリを移動したりコピーしたりできないで注意。
※実行時にインストール先ディレクトリを与えていると、

```言語名:端末
ERROR: Invalid options: <インストール先ディレクトリ>
```
と言われるので、そのときは以下のようにインストール先ディレクトリにインストーラを動かせば実行できます。

```言語名:端末
$mv petalinux-v2018.3-final-installer.run -d <インストール先ディレクトリ>
$ ./petalinux-v2018.3-final-installer.run
```



パッケージが足りない場合はインストールできません。エラーメッセージを確認すれば足りないパッケージが書いてあるのでインストールすればOKです。自分の場合は以下が不足していたのでインストールしました．

```言語名:端末
$ sudo apt-get install gawk
$ sudo apt-get install gcc-multilib
$ sudo apt-get install xterm
$ sudo apt-get install texinfo
$ sudo apt-get install zlib1g:i386
$ ./petalinux-v2018.3-final-installer.run <インストール先ディレクトリ>
```

また、TFTPサービスが実行されていないというWARNINGが出たので、インストールしておきます。

```言語名:端末
$ sudo apt-get install tftpd-hpa   //tftpサーバーのインストール(一例、ubuntu以外なら変わる)
$ sudo systemctl enable tftpd-hpa   //有効化
$ sudo systemctl restart tftpd-hpa
$ ./petalinux-v2018.3-final-installer.run <インストール先ディレクトリ>
```






<a id="#peta_setup"></a>
# Petalinuxのセットアップ
環境変数の設定等が行われます。使用するPetalinuxのバージョンを変更するようなときは、ここから行う必要があります。

```言語名:端末
$ cd <petalinuxをインストールしたディレクトリ>
$ source settings.sh
```
正しく設定されていれば以下のようになります。

```
$echo $PETALINUX   //環境変数
/home/usr/tools/petalinux   //インストールされたディレクトリ
```

※初めて行うときは以下のWARNINGが出る可能性があります。そのときはデフォルトのシェルをbashに変更します。

```言語名:端末
$ source settings.sh
WARNING: /bin/sh is not bash!
$ rm /bin/sh
$ ln -s /bin/bash /bin/sh   // /bin/shのリンク先を/bin/bashにする
$ source settings.sh
```






<a id="#bsp_install"></a>
# PetaLinux BSPのインストール
PetaLinuxプロジェクト作成ディレクトリに移動し、petalinux-createコマンドを実行する。

```言語名:端末
$ cd ~/work/petalinux/2018_3   //プロジェクト作成ディレクトリ
$ petalinux-create -t project -s <path-to>/ultra96v2_oob_2018_3.bsp   //プロジェクト作成
$ ls
ultra96v2_oob_2018_3   //ディレクトリが作成されている。
```

次にプロジェクト内部に移動し作成したプロジェクトをビルドする。

```言語名:端末
$ cd ultra96v2_oob_2018_3
$ petalinux-build
```

※Petalinuxのバージョンとbspファイルを作ったpetalinuxのバージョンが異なるとエラーが発生する可能性が高いので素直にバージョンは合わせましょう。逆は当然ですが、ツールが新しくてbspファイルが古い組み合わせでもエラーが発生します。






<a id="#error_report"></a>
# ビルド時の原因不明なエラーの報告
petalinux2019.1を使ってultra96v2_oob_2019_1.bsp, ultra96v2_oob_2018_3.bspのビルドしようとすると、chromium, webkitgtk関連のコンパイルエラーが起きてしまい、ビルドできませんでした。これはpetalinux, bspファイルをそれぞれダウンロードからやり直しても同様でした。

```言語名:端末
webkitgtk関係のエラーメッセージ(余裕があれば再現します)
大量のメッセージ
collect2: fatal error: id terminated with signal 9 [Killed]
compilation terminated
ninja: build stopped: subcommanc failed.
WARNING: <path>/work/petalinux/2018_3/ultra96v2_oob_2018_3/build/tmp/work/aarch64-xilinx-linux/chromium/54.0.2810.2-r0/temp/run.do_compile.25802:1 exit 1 from 'ninja -v -j 8 chrome chrome_sandbox chromedriver'
ERROR: Function failed: do_compile (log file is located at <path>/work/petalinux/2018_3/ultra96v2_oob_2018_3/build/tmp/work/aarch64-xilinx-linux/chromium/54.0.2810.2-r0/temp/log.do_compile.25802)
ERROR: Task (<path>/tools/petalinux/components/yocto/source/aarch64/layers/meta-browser/recipes-browser/chromium/chromium_54.0.2810.2.bb:do_compile) failed with exit code '1'

Summary: 2 tasks failed:
   <path>/tools/petalinux/components/yocto/source/aarch64/layers/core/meta/recipes-sato/webkit/webkitgtk_2.20.5.bb:do_compile
   <path>/tools/petalinux/components/yocto/source/aarch64/layers/meta-browser/recipes-browser/chromium/chromium_54.0.2810.2.bb:do_compile
Summary: There were 2 WARNING messages shown.
Summary: There were 2 ERROR messages shown, returning a non-zero exit code.
ERROR: Failed to build project
```
そこで、petalinux2018.3, ultra96v2_oob_2018_3.bspの組み合わせに変えるとビルドできました。
しかしながら、[リンク先](https://www.element14.com/community/community/design-challenges/path2programmable/blog/2019/12/04/p2p-petalinux-labs)では、2018.3で同様の現象が起きているようなので、この組み合わせなら必ず大丈夫とも言えないです。

もし、この件について原因・解決策を知っている方はコメントで教えていただけると非常に助かります。






<a id="#bootbin_create"></a>
# Ultra96-V2起動用BOOT.BINイメージの作成
petalinux-buildを行ったディレクトリで以下のコマンドを実行することで、システムを起動するための<path>/images/linux/BOOT.BINを作成する。

- いろいろなサイトや書籍で紹介されているやり方

```言語名:端末
$ petalinux-package --boot --fsbl components/plnx_workspace/fsbl/fsbl/Release/fsbl.elf --fpga hardware/xilinx-ultra96-reva-2018.2/xilinx-ultra96-reva-2018.2.runs/impl_1/design_1_wrapper.bit --pmufw components/plnx_workspace/pmu-firmware/pmu-firmware/Release/pmu-firmware.elf --u-boot
```

- 自分がやった手順

```言語名:端末
$ find * -type f -name "fsbl.elf"
build/tmp/sysroots-components/ultra96_zynqmp/fsbl/boot/fsbl.elf
$ find * -type f -name "pmu-firmware.elf"
build/tmp/sysroots-components/ultra96_zynqmp/pmu-firmware/boot/pmu-firmware.elf
$ find * -type f -name "*.bit"
components/plnx_workspace/device-tree/device-tree/ultra96v2_oob_wrapper.bit
hardware/ULTRA96V2_2018_3/ultra96v2_oob.runs/impl_1/ultra96v2_oob_wrapper.bit
images/linux/system.bit
pre-build/linux/implementation/download.bit
project-spec/hw-description/ultra96v2_oob_wrapper.bit
$ petalinux-package --boot --fsbl build/tmp/sysroots-components/ultra96_zynqmp/fsbl/boot/fsbl.elf --fpga hardware/ULTRA96V2_2018_3/ultra96v2_oob.runs/impl_1/ultra96v2_oob_wrapper.bit --pmufw build/tmp/sysroots-components/ultra96_zynqmp/pmu-firmware/boot/pmu-firmware.elf --u-boot --force
```
※今回はBSPファイル付属の.bitファイルを使用しているが、実際の開発時には、自分で合成したPL領域データを含む.bitファイルに変更する。
※--forceは2回目以降のすでにBOOT.BINが存在する場合に必要になる。
※なお、今回選択したfsbl.elf, pmu-firmware.elf, .bitファイルが適切なのかはわからずにやってます。自分の環境では紹介されているコードの場所にファイルが存在しなかったので、ファイル名やディレクトリ構成が似ているものを選んだだけです。この点についてもわかる方はコメントいただけると非常に助かります。






<a id="#sd_create"></a>
# Ultra96v2ボードのブート用SDカードの作成
16GB以上の新しいmicroSDカードを用意する。アンマウントし、パーティション削除、パーティション作成、フォーマット、Linuxイメージのコピーを行う。
Linuxのシステムイメージは、<petalinuxプロジェクトのパス>/images/linuxにあるBOOT.BIN, image.ub, rootfs.ext4を使う。
パーティション1は、フォーマット: FAT32, サイズ: 1GB, ラベル: bootで作成する。
パーティション2は、フォーマット: ext4, サイズ: 残り, ラベル: rootfsで作成する。

```言語名:端末
//sdカードを入れずに
$ lsblk   //ブロックデバイスの一覧表示
//sdカードを入れて
$ lsblk
//増えた部分がsdカードのデバイス名とパーティションを示す
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
...
mmcblk0      179:0    0 14.9G  0 disk
 -mmcblk0p1  179:1    0 14.9G  0 part

//MOUNTPOINTが空欄でないときはパーティションをアンマウントする
$ umount /dev/mmcblk0p1

//パーティションの削除と作成を行う
$ sudo fdisk /dev/mmcblk0

コマンド(mでヘルプ): m
  d   パーティションを削除します
  n   新しいパーティションを追加します
  p   パーティション情報を表示します
  w   パーティション情報をディスクに書き込んで終了します
  q   変更点を保存せずに終了します

コマンド: d
パーティション1を削除しました。

コマンド: n
パーティションタイプ
  p   基本パーティション
  e   拡張領域
//規定値選択時はenterでOK
選択(規定値 p): <enter>
パーティション番号(1-4, 規定値1): <enter>
最初のセクタ(2048-31116287, 規定値2048): <enter>
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P}(2048-31116287, 規定値31116287): +1G
新しいパーティション 1 をタイプ Linux、サイズ 1 GiBで作成しました。
パーティション #1 には vfat 署名が書き込まれています。
署名を削除しますか？ [Y]es/[N]o: y

コマンド: n
選択(規定値 p): <enter>
パーティション番号(2-4, 規定値2): <enter>
最初のセクタ(2099200-31116287, 規定値2099200): <enter>
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P}(2099200-31116287, 規定値31116287): <enter>
新しいパーティション 2 をタイプ Linux、サイズ 13.9 GiBで作成しました。

コマンド: p
...
デバイス       起動 開始位置  最後から   セクタ サイズ Id タイプ
/dev/mmcblk0p1         2048  2099199  2097152     1G 83 Linux
/dev/mmcblk0p2      2099200 31116287 29017088  13.9G 83 Linux

コマンド: w
パーティション情報が変更されました。
ioctl()を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。

//確認
$ sudo lsblk -l /dev/mmcblk0
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
...
mmcblk0      179:0    0 14.9G  0 disk
 -mmcblk0p1  179:1    0    1G  0 part
 -mmcblk0p2  179:1    0 13.9G  0 part

//パーティション1のフォーマット
$ sudo mkfs.vfat -v -c -F 32 /dev/mmcblk0p1 -n boot
//パーティション2のフォーマット
$ sudo mkfs.ext4 -v -c /dev/mmcblk0p2 -L rootfs   //-v -cは不良ブロックチェックと詳細表示のオプション
//マウント
$ sudo mount /dev/mmcblk0p1 /mnt
//linuxイメージのコピー
$ cd images/linux
$ sudo cp BOOT.BIN image.ub /mnt
$ sudo dd if=rootfs.ext4 of=/dev/mmcblk0p2 bs=1M status=progress
//キャッシュ上の未処理のデータをディスクに書き込む
$ sudo sync
//アンマウント
$ sudo umount /mnt 
```





<a id="#boot"></a>
# Ultra96v2ボードの起動とssh接続
※ボード上のボタンの名前・位置は付属の説明書参照

1. スイッチ近くの表を参考にBoot mode switchを動かして、SD boot(sw1=off, sw2=on)に変更する。

2. Ultra96v2ボードにSDカードを挿入し、電源コードをつなぐ。
※電源はDC12V(2A/3A/4A)を使用する。端子がACアダプター用DCプラグで一般的な5.5mm×2.1mmではなく、4.0mm×1.7mmなので、変換アダプタ―が必要になることに注意。
3. SW4(PWR_BTN)を数秒長押しして離す。すぐに複数のLEDが光り、数秒後、左下のDONE LEDが青く光る。
4. そのまま10秒以上待っていると真ん中下のD9(Wireless LAN) LEDがオレンジに光る。このとき、PCのwifi一覧を開けば、Ultra96-V2_MAC IDという名前のものが表示されるので接続する。
5. 初期設定ではユーザ: root, パスワード: rootになっており、IPアドレスは192.168.2.1が割り当てられているので、以下でログインする。
6. 
```言語名:端末
$ sudo ssh root@192.168.2.1
root@192.168.2.1's passwork:rootと入力
root@ultra96v2-oob-2018-3:~#
```
※なお、ssh接続するにはpcに設定が必要なので注意。
6. 確認がとれたらpoweroffと入力してみる。電源が切れるはず。
https://www.avnet.com/wps/portal/japan/products/product-highlights/ultra96/




<a id="#ref_official"></a>
# 参考文献(公式)
[XILINXホームページ / サポート / 資料](https://japan.xilinx.com/support.html#documentation)でDevelopment Tools, Software Development, PetaLinux Tools, Reference Guidesを選択し、すべてのバージョンを表示するをクリックすれば[Petalinuxリファレンスガイド一覧](https://japan.xilinx.com/support/documentation-navigation/see-all-versions.html?xlnxproducttypes=Design%20Tools&xlnxdocumentid=UG1144)が表示される。

- [Petalinuxツール資料 リファレンスガイド2019.1 日本語版](https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2019_1/ug1144-petalinux-tools-reference-guide.pdf)
- [Petalinuxツール資料 リファレンスガイド2019.2 日本語最新版](https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2019_2/ug1144-petalinux-tools-reference-guide.pdf)

96Boardsホームページ / Documentation / Consumer Edition / Ultra96 Family / Ultra96-V2 Documentation / Build from Source / PetaLinux
- [Ultra96用のPetaLinuxビルドガイド](https://www.96boards.org/documentation/consumer/ultra96/ultra96-v1/build/peta-linux.md.html)






<a id="#ref_blog"></a>
# 参考文献(ブログ)
- [Ultra96向けのBSPを使ったPetaLinuxのビルド](https://www.tech-diningyo.info/entry/2018/12/30/144617)
- [ZYBO(Zynq)初心者ガイド(8) Linux起動する](https://qiita.com/iwatake2222/items/6e6915f7318689818368)






<a id="#reference"></a>
# 文献紹介
自分とは別のやり方をしているサイトの紹介です。
- [Ultra96の開発環境(Vivado2019.1)](https://qiita.com/basaro_k/items/fa64871ada20eb9ea2e4)
- [UltraZed / Ultra96 / Ultra96-V2起動DebianGNU / Linux（v2019.1版）ブートイメージの提供](https://qiita.com/ikwzm/items/0c6f110aa19e368af03d)