1500円ZYNQ基板でPetaLinuxを動作させる(後編:PetaLinux ビルドと EBAZ4205 での動作)

#はじめに
1500円 ZYNQ 基板(EBAZ4205)で使える、PetaLinux ブートイメージを作成します
EBAZ4205が、RasPi と同じ感覚で使えるようになります。

GUI は無いので CUI のみですが、組み込み用の Linux として作られています。
RAM の上だけで動くように構成すると、SD カードが破損して起動不能になるような RasPi あるあるは起こりません。
必要なブートイメージとハードウェアを作成すると、年単位で安定運用することができます。

[前編](https://qiita.com/kan573/items/3da286f598b696f38cc3)では、PetaLinux 環境の構築を行いました。
この後編では、PetaLinux の設定とビルドを行い、実際に EBAZ4205 で起動させてみます。

(2021.4.22 追記)
とりあえずですが、プロジェクト作成に使えるハードウェア情報(ebaz4205_wrapper.xsa)を、google driveにおいときました。
[ebaz4205_wrapper.xsa](https://drive.google.com/file/d/1e0OfOAcd2wyCLCnepdqKCaoaNiCeQ87G/view?usp=sharing)

(2021.4.24 追記)
作成したブートイメージもおいときました。
[EBAZ4205_Bootimage.zip](https://drive.google.com/file/d/1UpdYpy8huFBOX6CTXAWmN9gU9yupKttM/view?usp=sharing)

#使用環境

1. Windows10 Pro (20H2) で動くPC+RAM 16 GB+100 GB 程の空き領域
2. Vivado 2020.1 (現在最新の 2020.2 でも、たぶん同手順)
3. [前回の記事](https://qiita.com/kan573/items/3da286f598b696f38cc3)でインストールした VirtiualBox + Ubuntu 18.04.5 + PetaLinux 2020.1 環境
4. EBAZ4205 (25MHz 水晶 有り/無しどちらでも可、microSD ソケットつき)


#参考資料
UG1144 - PetaLinux ツール資料リファレンス ガイド (日本語版) (v2019.2)
UG1144 - PetaLinux Tools Documentation: Reference Guide (v2020.1)

#PetaLinux のビルド

##1. 仮想マシンのクローン作成
まず、前回構築した Ubuntu 18.04.5 のクローンを作成します。

何も作業していない、プレーンな環境は残しておいて、実際の作業にはクローンを使います。

こうする理由は、仮想マシン側でファイルを削除しても、仮想ディスクのファイルサイズが小さくならないためです。
作業でファイルを作るたびに仮想ディスクは大きくなり、いずれ上限の 100 GB を超えてしまいます。

仮想ディスクを小さくする方法は一応ありますが、手間がかかります。
大きくなった仮想ディスクは、綺麗さっぱり削除して、プレーンな環境から再スタートする方が楽です。

仮想マシンを最初から作りなおすと、Ubuntu のインストールからやり直しになります。
PetaLinux の設定まで終わった仮想マシンを保管しておいて、そこからクローンして使うのがよいです。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/cd6359ac-ce2d-3dbb-5232-202dee3780b9.png)


##2. 新規プロジェクトの作成
Win10 側で、共有フォルダ share (Ubuntu 側では sf_share) に、Vivado でエクスポートしたハードウェア情報 ????.xsa をコピーしておきます。

クローンした仮想マシンを起動します。

表示 - 仮想スクリーン 1 - 1024 x 768 にリサイズ を設定します。
(1024 x 768 以上ならなんでもいい)
画面が小さいと、PetaLinux プロジェクト作成時にエラーになります。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/607c4e86-d9f4-cb77-64c1-5f1ef15ed1f4.png)

Ubuntu のデスクトップで右クリックして、端末を開く(E) を選択します。
ホームディレクトリ(例では /home/kan573/) でターミナルが起動します。


EBAZ4205 用の linux ブートイメージ作成のためのプロジェクトフォルダ ebaz4205_test1 を、作成します。

>$ petalinux-create --type project --template zynq --name ebaz4205_test1

/home/kan573/ebaz4205_test1 が、プロジェクトの作業フォルダとして作成されます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/1f1cb364-9851-6ea1-259a-e0a612b3dc8f.png)


##3. ブート情報の修正

~/ebaz4205_test1/project-spec/meta-user/recipes-bsp/u-boot/u-boot-zynq-scr/boot.cmd.default

を編集します。
この中で、u-boot で FIT イメージ(image.ub)を読み込むアドレスが決め打ちされています。(12行目)

> imageub_addr=0x10000000

例によって EBAZ4205 に搭載された DDR3 のアドレス範囲(0x0000_0000～0x1000_0000)を超えています。

そのままだと起動できませんので、正しく読み込めるアドレス、

> imageub_addr=0x01000000

あたりに変更しておきます。

これで、DDR3(256 MB)の、前から 16 MB の位置から PetaLinux の FIT イメージ(image.ub)を読み込む記述になります。

image.ub の大きさは、構築するカーネルの構成によりますが、10 MB～64 MB 程度になるようです。
PL で DDR 上にフレームバッファ等を実装する場合は、かち合わないようにアドレスを設定します。

※EBAZ4205 でユーザーが使える DDR3 のアドレス範囲は、0x0010_0000～0x0EFF_FFFF と思います。


##4. PetaLinux オプションの設定

作成したプロジェクトフォルダに移動します。

>$ cd ~/ebaz4205_test1

ハードウェア情報(.xsa)を置いてある共有フォルダーを指定して、PetaLinux の設定に入ります。
(Windows 側では \デスクトップ\share で、Ubuntu 側では /media/sf_share です)

>$ petalinux-config --get-hw-description /media/sf_share

少し待つと、メニュー画面に切り替わります。
ここでは、PetaLinux の基本的な設定を行います。
設定項目がいろいろありますので、覗いてみてください。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/be5244b5-a530-36c5-8bcf-1e9937927869.png)

変更する可能性があるのは、このあたりです。
よくわからなければ、そのまま Exit して構いません。

>Subsystem AUTO Hardware Settings ---> Ethernet Settings ---> (DHCP/固定 IP の設定、MAC アドレス)
>Firmware Version Configuration ---> (PetaLinux のホスト名、プロダクト名、バージョン)
>Image Packaging Configuration ---> Copy final images to tftpboot ---> (tftpboot を使わないならチェックを外す)


##5. u-boot の設定

u-boot の設定を行います。

>$ petalinux-config -c u-boot

しばらく待つと、メニューが表示されます。

u-boot 設定は、不用意に触るとビルドが通らなくなるので、できるだけ触らないのが吉のようです。

※EBAZ4205 に搭載されていない USB は、チェックを外すと、エラーでビルドが通らなくなりました。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/db056549-bd20-49d2-d816-6a194633b90d.png)


触って大丈夫なのは、このあたり。

(2) delay in seconds before automatically booting ---> (起動時のウェイト秒数 = 2秒)


##6. カーネルの設定

PetaLinux のカーネルの設定を行います。

>$ petalinux-config -c kernel

メニュー画面が表示されるまで、しばらくかかります。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/0a775017-28f0-5fda-ceb3-71152a8bd164.png)


ここでは、カーネルで使うモジュールを選択していきます。

設定項目が沢山あり、何がどうつながっていくのがよくわかりません。
https://www.kernelconfig.io/
で調べると、ヒントが得られるかもしれません。

変更する可能性があるのは、このあたりです。

>PCI support  ---> (チェックを外す)
>Device Drivers ---> USB support ---> (チェックを外す)
>Real Time Clock ---> (チェックを外す)



##7. ルート fs の設定

ルート fs の設定を行います。

>$ petalinux-config -c rootfs

こちらは、すぐにメニューが表示されます。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/d082cf2e-e6e2-eb8d-519a-bfbd544595a2.png)

追加した分だけカーネルが大きくなりますので、不要な物はできるだけ入れないようにします。
開発中の microSD だといくら大きくしても大丈夫ですが、組み込み用の本番基板では eMMC や QSPI-Flash に入れるので、原価に直結します。
(大きいメモリは高い)

EBAZ4205 では 1Gb の NAND フラッシュに入れることもできるので、あまり気にしなくても大丈夫かもしれません。

変更する可能性があるのは、このあたりです。

>Filesystem Packages ---> admin ---> sudo ---> sudo にチェック
>Filesystem Packages ---> base ---> busybox ---> busybox にチェック
>Filesystem Packages ---> base ---> i2c-tools ---> i2c-tools にチェック
>Filesystem Packages ---> base ---> init-ifupdown ---> init-ifupdown にチェック
>Filesystem Packages ---> console ---> network ---> ethtool ---> ethtool にチェック
>Filesystem Packages ---> console ---> network ---> wget にチェック
>Filesystem Packages ---> misc ---> packagegroup-core-buildessential ---> packagegroup-core-buildessential にチェック、gcc 入る(？)
>Filesystem Packages ---> misc ---> gcc-runtime ---> libstdc++ にチェック、gcc で使う(？)
>Image Features ---> debug-tweaks にチェック (scp を使うのに必要)
>Image Features ---> auto-login にチェック (scp を使うのに必要)
>PetaLinux RootFS Settings  ---> Root password (root のパスワード。標準だとパスワードも root)


##8. ビルド

>$ petalinux-build

とすると、ブートイメージの作成に入ります。
しばらく待つと完了します。
(Core i5-4690, 16GB , SSD の環境で、実測 43 分ほど)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/e329fae2-8100-97b5-794c-a945d9a89348.png)

##9. BOOT.BIN の生成

>$ petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga ./images/linux/system.bit --u-boot --force

で、BOOT.BIN を生成します。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/81cbfe01-4c04-2af8-e563-1b5313726890.png)


##10. ブートイメージを microSD にコピー

作成された microSD 起動用のブートイメージを、共有フォルダにコピーします。
BOOT.BIN / image.ub / boot.scr の、3つのファイルが必要です。

BOOT.BIN は、一つ上で生成しました。
image.ub は、petalinux-build コマンドで作成されました。
boot.scr は、petalinux-build コマンドで作成されたものは使えないので、新たに作ります。

>$ cp ~/ebaz4205_test1/images/linux/BOOT.BIN /media/sf_share
>$ cp ~/ebaz4205_test1/images/linux/image.ub /media/sf_share
>$ mkimage -c none -A arm -T script -d ~/ebaz4205_test1/project-spec/meta-user/recipes-bsp/u-boot/u-boot-zynq-scr/boot.cmd.default /media/sf_share/boot.scr

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/fb3d0799-9ac1-e6d2-1f5f-d6d313e45e37.png)


Windows 側の共有フォルダに、必要なファイルの準備ができました。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/ea7d63ed-b324-620f-9da0-71f3f4db9e48.png)


ここから、3 つのファイルを microSD カードのルートディレクトリにコピーします。
microSD は、通常の FAT フォーマットでよいです。

これで、EBAZ4205 で PetaLinux を起動する準備ができました。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/d8ca85e8-b33a-e85f-be48-0ddcd3a8acdf.png)

#EBAZ4205 での起動テスト

microSD カードを EBAZ4205 の microSD ソケットに挿します。
microSD ブートの設定で、電源オン or リセットボタンをポチー します。

無事起動すると、シリアルコンソールに下記のようなブートログが表示されます。

オートログインを有効にしてあるので、すぐにプロンプトが出ます。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/321af588-9cd2-e7cc-5984-be8cf2fc3715.png)


この PetaLinux ですが、カーネルイメージ image.ub を RAM 上に展開して、Initrd で RAM 上のファイルシステムで動いています。
作成したファイルや変更は保存されず、常に初期状態で起動します。

**起動後、microSD にはアクセスしないので、電源はいつでもブチ切りしてかまいません。**

ドライブの認識状態は下記の通りです。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/2778b68f-5a13-2d96-c4d4-cb9b25077a81.png)

/media/sd-mmcblk0p1 が microSD カードです。
ファイルを保存したいときは、こちらにコピーしておくと、消えずに残せます。

ルート fs の設定で、gcc と wget は使えるようにしたので、ある程度 RasPi 的な使い方もできます。

※apt-get は、どのモジュールに含まれているか不明なので、入れられていません。ご存じの方がおられたら教えてください。

25 MHz 水晶無しの EBAZ4205 基板でも、LAN は普通に DHCP で使えます。
このハードウェア構築方法は、次回の投稿にて。


#Vivado でハードウェアを変更するとき
Vivado で PS の設定を変えたり、PL に新しい回路を作りこんだりしてから、PetaLinux を再度ビルドするときは下記のようにします。

エクスポートしたハードウェア情報(.xsa)を share フォルダにコピーしておきます。

プロジェクトのフォルダ(~/ebaz4205_test1)に入って、ハードウェア情報を取り込みます。

>$ petalinux-config --get-hw-description /media/sf_share --silentconfig

--silentconfig をつけると、メニュー画面を何も変更せずに、設定だけ出力します。

そのまま、ブートイメージを作成します。

>$ petalinux-build

BOOT.BIN を生成します。

>$ petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga ./images/linux/system.bit --u-boot --force

共有フォルダにコピーします。

>$ cp ~/ebaz4205_test1/images/linux/BOOT.BIN /media/sf_share
>$ cp ~/ebaz4205_test1/images/linux/image.ub /media/sf_share

boot.scr は、読み込みアドレスを変更しないのであれば、そのまま使えます。

microSD にコピーしたら、EBAZ4205 に挿し込んでリセットボタンをポチーすれば、ハードウェアが更新された PetaLinux が起動します。

#プロジェクトを作り直したいとき

>$ rm -Rf ebaz4205_test1

で、プロジェクトフォルダごと削除して、新しくプロジェクトを作成します。

>$ petalinux-create --type project --template zynq --name ebaz4205_test2


ただし、フォルダを削除しても仮想ディスクは小さくなりません。

仮想ディスクが大きくなりすぎたら、その仮想マシンは削除して、新しくクローンを作成してやり直しましょう。


#まとめ
EBAZ4205 で動作する PetaLinux の構築方法がわかりました。

今回構築した構成だと、55 MB 程度のイメージサイズになりました。
512 Mbit の QSPI-Flash に収まり、かなり組み込みっぽい Linux になっています。