TE0720には出荷時設定でPetalinuxがインストールされているが、これは最小構成のものなので linux が動くということは判るがそれ以上のことはできそうにない。 GCCなどの開発ツールも入ったもっとリッチな環境にしたいし、いい機会なのでPetalinuxのビルドをやってみることにした。
基本的なビルド方法については、TrenzのWikiページを参考にした。
PetaLinux KICKstart
https://wiki.trenz-electronic.de/display/PD/PetaLinux+KICKstart#PetaLinuxKICKstart-PetalinuxProjectCreation-ShortHOWTO
Reference Design
http://www.trenz-electronic.de/fileadmin/docs/Trenz_Electronic/TE0720/Reference_Design/2016.4/test_board/te0720-test_board_noprebuilt-vivado_2016.4-build_08_20170529092723.zip
上記 Wiki にしたがってビルドしてできるPetalinuxはTE0720に入っているのと同じ最小構成のものだ。これをカスタマイズしたいが、 petalinux-config -c rootfs で1項目づつ追加する方法は面倒くさすぎてとてもじゃないがやってられない。 他になにか方法はないかと調べてみたところ、Petalinux-v2017.2-final には petalinux-image-full.bb というレシピファイルが存在することが判った。
※. petalinux-image-full.bbはインストレーションファイルのPetaLinux 2017.2 オープン コンポーネント ソース コード(petalinux-v2017.2-open_components.tar.gz)に含まれているのでpetalinux-v2017.2-final-installer.runと共にこれもインストールする必要がある。 (2018.08.19追記)
その内容を見るとgccの開発環境やX、openCV等、全部入りのレシピのようだ。
で、試行錯誤した結果、なんとかビルドすることが出来、望みのリッチな環境にすることができた。
やり方としてはちょっとダサいが、上記 Petalinux KICKstart に準じて最小構成のビルドをした後、oe-init-build-envをsourceし bitbake コマンドで rootfs のみ、即ち、 petalinux-image-full のみをビルドした。 因みに、oe-init-build-env はPetalinux インストールディレクトリ下のpetalinux-v2017.2-final/components/yocto/source/arm/layers/coreディレクトリにある。
以下、その手順
1. TE0720用最小構成のPetalinuxのビルド
TE0720用のvivadoのhdfファイルと、device-tree、fsblが必要なので、上記 Reference Designをダウンロードし、_readme.txt に従って vivado 2016.4 でプロジェクトの生成まで実行し終了する。 petalinux-image-full.bb はpetalinux-v2016.4-finalには存在せず、petalinux-v2017.2-finalに存在するので、hdfファイルもvivado 2017.2で生成する必要がある。そのため、vivado 2016.4で生成したプロジェクトをvivado 2017.2で開き直し、そのバージョンでbitstream生成しhardwareのエクスポートをする必要がある。
次に、test_board/os ディレクトリ下に petalinux のプロジェクトを生成する。実際はプロジェクトを生成するディレクトリはどこでも良いが Reference Desginはtest_board/os 下に作成しているのでそれに準じた。
作成したTE0720ディレクトリ下にvivadoでエクスポートしたhdfファイルをコピーし、petalinux-config を実行する。
Configurationメニューが開くのでコンソール用シリアルポートやrootfs関連を設定する。
・ コンソール用シリアルポートは初期状態ではps7_uart_1になっているが、TE0720はps7_uart_0をコンソール用シリアルポートとしているのでps7_uart_0に変更する。
トップメニューから、Subsystem AUTO Hardware Settings > Serial Settings > Primary stdin/stdout へと進み、ps7_uart_0を選択する。
・ Root filesystemの格納先をINITRAMFSからSDカードに変更する。
トップメニューから、Image Packaging Configuration > Root filesystem type へと進み、SD cardを選択する。
・ デバイスツリー dtb イメージの格納先をSDカードに変更する。
トップメニューから、Subsystem AUTO Hardware Settings > Advanced bootable images storage Settings > dtb image settings > image storage media へと進み、primary sdを選択する。
以上の項目を設定したらSaveしてConfiguration画面をExitする。
次に、fsbl等をTE0720用に変更したいところだが、build コマンドを実行しないと変更対象のfsblファイル群が生成されないので、ここで petalinux-build コマンドを実行する。
ビルド終了後、device-tree ファイルとfsblの変更を行う。
・Reference Designのsystem_top.dtsをsystem-user.dtsiにコピー
test_board/os 下で、
cp ./petalinux/project-spec/meta-user/recipes-dt/device-tree/files/system-top.dts./TE0720/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
し、system_user.dtsiの1,3〜10行目を削除する。
変更前
変更後
・ fsblの変更
Reference Designのfsbl_hooks.c、te_fsbl*.* をTE0720プロジェクトのfsblディレクトリ下にコピーする。
test_board/os/TE0720 下で、
cp ../../sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.c ./components/plnx_workspace/fsbl/src/fsbl_hooks.c
cp ../../sw_lib/sw_apps/zynq_fsbl/src/te_fsbl*.* ./components/plnx_workspace/fsbl/src/
fsbl_hooks.cはFsblHookBeforeHandoff()関数からte_FsblHookBeforeHandoff()をコールするように変更されており、te_FsblHookBeforeHandoff()ではイーサネットのMACアドレスの設定やUSB-PHYのリセット等を行っている。USB-PHYのリセットはTE0720のシステムコントローラを介して行うようになっており、このシステムコントローラのI/FはI2Cで、Reference DesignではPSのIIC_1に接続されている。
上記変更後、再度 petalinux_build コマンドを実行する。
ビルドが完了したら、BOOT.BINを作成しておく。
test_boars/os/TE0720/images/linuxディレクトリに移動し、petalinux-packageコマンドでBOOT.binを生成する。
…と、ここまでが最小構成のPetalinux作成。ふぅ〜
2. petalinux-image-full のビルド
oe-init-build-envをsourceする。
次にbitbakeコマンドでpetalinux-image-fullをビルドする。
ここで必要なのはrootfsのみであるので -c do_image_cpioを付加する。また、これを付けないと、u-bootやfsblもビルドしにいってエラーになるので必ず付ける。
ビルドが始まった様子
ビルドが始まるとインタネット上のリポジトリからソースファイルを並列的に取得している様子で、ネットワーク負荷が重くなり、他のブラウザ等からのネットアクセスが一時的に出来なくり、暫くすると復旧するが、ビルド完了までにはかなり時間がかかる。特に上記のChecking sstate mirror object availabilityはもしかしてプログラムがハングアップしてんのか?って位に進捗が判りづらい。
ビルド中
ビルド成功
この方法の場合、イメージファイルはimage/linux/下ではなく、build/tmp/work/plnx_arm-xilinx-linux-gnueabi/petalinux-image-full/1.0-r0/deploy-petalinux-image-full-image-complete下に生成される。
これで全部入りのrootfsが出来た。 やったー
\(^_^)/
SDカードに焼いて動くかどうかを見てみる。
SDカードにFAT32とext4形式の2つのパーティションを作成する。
FAT32にはimage/linuxディレクトリ下のBOOT.bin、image.ub、system.dtbをコピーする。
ext4パーティションにはrootfsをコピーするが、imageファイルがcpio形式なのでext4ディレクトリ上で以下のように展開する。
cpioファイルへのパスが長過ぎるのでシンボリックリンクを貼ってからcpioにそのファイル名を与えた。展開後は削除する。
展開できた。
syncコマンドを実行後SDカードをアンマウントし、TE0720に装着して起動すると無事Linuxが起動し、ログインプロンプトが表示された。
が、ここで問題発生。rootのパスワードが不明。どうやら root ではないようだ。
そこで、SDカードを開発PCにマウントしなおして、etc/passwdとetc/shadowをsudo vi で開いてrootのパスワードの部分を消去した。
passwdファイルのroot:x:0:0:・・・のx(shadowフアイルは*)を削除
これで、パスワード無しでログインできる。
ログイン後はパスワードを設定しておく。
/bin, /sbin, /usr/bin 等の各ディレクトリ下を見てみた。
/bin
/sbin
/usr/bin
/usr/sbin
/usr/libexec
/usr/include
gcc, pythonのバージョン
X WindowのウィンドウマネージャはMatchboxが入っている。
これだけ入っていれば色々遊べるだろう。