#はじめに
1500円 ZYNQ 基板(EBAZ4205)で使える、PetaLinux ブートイメージを作成します
EBAZ4205が、RasPi と同じ感覚で使えるようになります。
GUI は無いので CUI のみですが、組み込み用の Linux として作られています。
RAM の上だけで動くように構成すると、SD カードが破損して起動不能になるような RasPi あるあるは起こりません。
必要なブートイメージとハードウェアを作成すると、年単位で安定運用することができます。
前編では、PetaLinux 環境の構築を行いました。
この後編では、PetaLinux の設定とビルドを行い、実際に EBAZ4205 で起動させてみます。
(2021.4.22 追記)
とりあえずですが、プロジェクト作成に使えるハードウェア情報(ebaz4205_wrapper.xsa)を、google driveにおいときました。
ebaz4205_wrapper.xsa
(2021.4.24 追記)
作成したブートイメージもおいときました。
EBAZ4205_Bootimage.zip
#使用環境
- Windows10 Pro (20H2) で動くPC+RAM 16 GB+100 GB 程の空き領域
- Vivado 2020.1 (現在最新の 2020.2 でも、たぶん同手順)
- 前回の記事でインストールした VirtiualBox + Ubuntu 18.04.5 + PetaLinux 2020.1 環境
- 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 の設定まで終わった仮想マシンを保管しておいて、そこからクローンして使うのがよいです。
##2. 新規プロジェクトの作成
Win10 側で、共有フォルダ share (Ubuntu 側では sf_share) に、Vivado でエクスポートしたハードウェア情報 ????.xsa をコピーしておきます。
クローンした仮想マシンを起動します。
表示 - 仮想スクリーン 1 - 1024 x 768 にリサイズ を設定します。
(1024 x 768 以上ならなんでもいい)
画面が小さいと、PetaLinux プロジェクト作成時にエラーになります。
Ubuntu のデスクトップで右クリックして、端末を開く(E) を選択します。
ホームディレクトリ(例では /home/kan573/) でターミナルが起動します。
EBAZ4205 用の linux ブートイメージ作成のためのプロジェクトフォルダ ebaz4205_test1 を、作成します。
$ petalinux-create --type project --template zynq --name ebaz4205_test1
/home/kan573/ebaz4205_test1 が、プロジェクトの作業フォルダとして作成されます。
##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 の基本的な設定を行います。
設定項目がいろいろありますので、覗いてみてください。
変更する可能性があるのは、このあたりです。
よくわからなければ、そのまま 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 は、チェックを外すと、エラーでビルドが通らなくなりました。
触って大丈夫なのは、このあたり。
(2) delay in seconds before automatically booting ---> (起動時のウェイト秒数 = 2秒)
##6. カーネルの設定
PetaLinux のカーネルの設定を行います。
$ petalinux-config -c kernel
ここでは、カーネルで使うモジュールを選択していきます。
設定項目が沢山あり、何がどうつながっていくのがよくわかりません。
https://www.kernelconfig.io/
で調べると、ヒントが得られるかもしれません。
変更する可能性があるのは、このあたりです。
PCI support ---> (チェックを外す)
Device Drivers ---> USB support ---> (チェックを外す)
Real Time Clock ---> (チェックを外す)
##7. ルート fs の設定
ルート fs の設定を行います。
$ petalinux-config -c rootfs
追加した分だけカーネルが大きくなりますので、不要な物はできるだけ入れないようにします。
開発中の 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 分ほど)
##9. BOOT.BIN の生成
$ petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga ./images/linux/system.bit --u-boot --force
##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
Windows 側の共有フォルダに、必要なファイルの準備ができました。
ここから、3 つのファイルを microSD カードのルートディレクトリにコピーします。
microSD は、通常の FAT フォーマットでよいです。
これで、EBAZ4205 で PetaLinux を起動する準備ができました。
#EBAZ4205 での起動テスト
microSD カードを EBAZ4205 の microSD ソケットに挿します。
microSD ブートの設定で、電源オン or リセットボタンをポチー します。
無事起動すると、シリアルコンソールに下記のようなブートログが表示されます。
オートログインを有効にしてあるので、すぐにプロンプトが出ます。
この PetaLinux ですが、カーネルイメージ image.ub を RAM 上に展開して、Initrd で RAM 上のファイルシステムで動いています。
作成したファイルや変更は保存されず、常に初期状態で起動します。
起動後、microSD にはアクセスしないので、電源はいつでもブチ切りしてかまいません。
/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 になっています。