はじめに
開発中に記載したものを放置してしまっている状態です.もっといい方法も見つかっていますが,自分が抱えているタスクが落ち着いたら整理します.参照する方は参考程度にお願いします。
プログラマブルSoCを活用したCPU-FPGA協調システムを開発するために,Ultra96-V2を採用しました.文献を参考にしながら,Petalinuxをインストールし,Ultra96-V2を起動するところまででも躓きポイントがいくつかあったので,これから開発を始める人のために残しておきます.
※もっと簡単で良い方法がこのリンク先で紹介されています。こちらはavnetによるgithubから、git cloneして、BSPファイルの生成からSDカード書き込み用イメージの作成まで行う。この方法で行えば、avnet hdlファイルもあるので、Vivadoプロジェクトを編集することもできる。
https://qiita.com/basaro_k/items/fa64871ada20eb9ea2e4
目次
- ultra96v2用bspファイルのダウンロード
- petalinuxのインストール
- petalinuxのセットアップ
- ultra96v2用bspファイルのビルド
- ビルド時の原因不明なエラーの報告
- Ultra96-V2起動用BOOT.BINイメージの作成
- Ultra96v2ボードのブート用SDカードの作成
- Ultra96v2ボードの起動とssh接続
- 参考文献(公式)
- 参考文献(ブログ)
- 文献紹介
開発環境
PetalinuxをインストールするPCのOSはLinuxである必要があります.自分はubuntu18.04LTSです.
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
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 <インストール先ディレクトリ>
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
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ファイルが古い組み合わせでもエラーが発生します。
ビルド時の原因不明なエラーの報告
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の組み合わせに変えるとビルドできました。
しかしながら、リンク先では、2018.3で同様の現象が起きているようなので、この組み合わせなら必ず大丈夫とも言えないです。
もし、この件について原因・解決策を知っている方はコメントで教えていただけると非常に助かります。
Ultra96-V2起動用BOOT.BINイメージの作成
petalinux-buildを行ったディレクトリで以下のコマンドを実行することで、システムを起動するための/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ファイルが適切なのかはわからずにやってます。自分の環境では紹介されているコードの場所にファイルが存在しなかったので、ファイル名やディレクトリ構成が似ているものを選んだだけです。この点についてもわかる方はコメントいただけると非常に助かります。
Ultra96v2ボードのブート用SDカードの作成
16GB以上の新しいmicroSDカードを用意する。アンマウントし、パーティション削除、パーティション作成、フォーマット、Linuxイメージのコピーを行う。
Linuxのシステムイメージは、/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
Ultra96v2ボードの起動とssh接続
※ボード上のボタンの名前・位置は付属の説明書参照
-
スイッチ近くの表を参考にBoot mode switchを動かして、SD boot(sw1=off, sw2=on)に変更する。
-
Ultra96v2ボードにSDカードを挿入し、電源コードをつなぐ。
※電源はDC12V(2A/3A/4A)を使用する。端子がACアダプター用DCプラグで一般的な5.5mm×2.1mmではなく、4.0mm×1.7mmなので、変換アダプタ―が必要になることに注意。 -
SW4(PWR_BTN)を数秒長押しして離す。すぐに複数のLEDが光り、数秒後、左下のDONE LEDが青く光る。
-
そのまま10秒以上待っていると真ん中下のD9(Wireless LAN) LEDがオレンジに光る。このとき、PCのwifi一覧を開けば、Ultra96-V2_MAC IDという名前のものが表示されるので接続する。
-
初期設定ではユーザ: root, パスワード: rootになっており、IPアドレスは192.168.2.1が割り当てられているので、以下でログインする。
$ 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/
参考文献(公式)
XILINXホームページ / サポート / 資料でDevelopment Tools, Software Development, PetaLinux Tools, Reference Guidesを選択し、すべてのバージョンを表示するをクリックすればPetalinuxリファレンスガイド一覧が表示される。
96Boardsホームページ / Documentation / Consumer Edition / Ultra96 Family / Ultra96-V2 Documentation / Build from Source / PetaLinux
参考文献(ブログ)
文献紹介
自分とは別のやり方をしているサイトの紹介です。