Trying Buildroot for PolarFire SoC Icicle Kit.
以前に、PolarFire SoC Icicle Kit の出荷時デモとして Yocto/OpenEmbedded の Linux を動かしてみました。今回は、代わりに Buildroot を試してみたいと思います。ビルド済イメージはないので、自分でビルドする必要があります。
なぜ Buildroot?
しかし、どうして Yocto/OpenEmbedded でなく Buildroot なのでしょうか?
一つ目の理由として、Yocto/OpenEmbedded による作業は非常にしんどいから、ということがあります。大昔(2009年頃でしょうか)、BeagleBoard というマイコンボードを動かす際に OpenEmbedded が必要だったのですが、非常に込み入った設計になっていて、とてもでないですが、全体を理解するのも、自分の必要な変更を加えるのも、難しいという印象でした。
この辺りの状況については、私が説明するより、Buildroot のプレゼン資料(Buildroot Training(PDF))を読んで頂いたほうが良いかと思います。うまく説明されています。
二つ目の理由としては(上記に関連するのですが)、今後の Linux + RTOS による AMP(Asymmetric multiprocessing)の評価において、Linux の Device Tree(.dts)をいじっていきたいのですが、GitHub: meta-polarfire-soc-yocto-bsp で何を修正すれば、.dtb の含まれる FIT イメージだけを更新できるのか、チンプンカンプンだということがあります。もちろんフルビルドの前に .dts を探して修正すれば良いのでしょうが、meta-polarfire-soc-yocto-bsp の一回のビルドには数時間が必要となりますので、非常に頭の痛い問題です。その点、PolarFire SoC 用の Buildroot では、こちらも Buildroot をサブディレクトリにおいたラッパー的な構成になっているとは言え、Makefile 一つを見れば、どこをどういじって FIT イメージだけを作り直すことができるか一目瞭然です。
早速 Buildroot してみる
…と言いたいところですが、上述の Buildroot プレゼン資料にざっと目を通して、Buildroot の概要を理解することにしました。半日程度読んだだけですが、その分かりやすい資料と Buildroot の哲学に感心しました。必要なパッケージ(Python とか Qt5 とか)を rootfs に追加する方法も、なんとなく分かりました。
さて、GitHub の polarfire-soc-buildroot-sdk を clone してみたのですが、Icicle Kit の出荷時デモの Linux とは SD カード(あるいは eMMC)のパーティション構成が違うようで、戸惑いました。最近、ようやく Icicle Kit の技術掲示板が設置されたので、そこで質問することで、ようやくやり方を理解できたところです。
実はそちらに、私の質問スレッドがありますので、そこを読んで頂ければご理解いただけると思うのですが、以下に簡単に日本語でまとめてみたいと思います。なお今回は、SD カードからブートすることを前提としたいと思います。(eMMC の wear を避けるため。)
パーティション構成の違い
先日簡単に説明しましたが、出荷時デモの Linux(Yocto/OpenEmbedded によるもの)では、eMMC が次のようなパーティション構成となっています。
- vfat: U-Boot が参照する boot.scr.uimg や fitImage(.dts や initramfs など) を置く
- BIOS boot partition: HSS payload を置く
- ext4: rootfs
これが polarfire-soc-buildroot-sdk でも同じだろう、、、と決めてかかっていたのが、私の敗因(?)でした。polarfire-soc-buildroot-sdk では、これとは異なる、以下のようなパーティション構成を採用しています。
- sdX1 (uboot): BIOS boot partition となっていて、HSS payload を置く
- sdX2 (kernel): ext4 パーティションとなっていて、ここに fitImage.fit と uEnv_s-mode.txt を置く
- sdX3 (root): これも ext4 パーティションとなっていて、ここに rootfs を置く
大きな違いは、U-Boot が参照するファイルも ext4 パーティションに置かれている、という点です。私はずっと、U-Boot は ext4 を理解できないと思っていた(先入観)のですが、これが間違いでした。
まずは HSS をビルドする
HSS(Hart Software Service)については、以前に説明しましたが、こちらの GitHub リポジトリにある説明通りにすればビルド可能です。ただし今回は SD カード用にビルドするため、以下のようにコマンドを実行します。
$ cp boards/icicle-kit-es/def_config.sdcard .config
$ make BOARD=icicle-kit-es
生成された Default/hss.elf を eNVM に書き込む方法は、以前の記事(上のリンク)を参照してください。
Buildroot で make する
Buildroot 生成の手順については、こちらの GitHub レポジトリの説明を参考にします。ただし、git submodule update --init --recursive から後が異なります。
まず最初に、SD カードを Linux ホストに接続したら、それが /dev ディレクトリ以下のどこに現れるか(dmesg コマンド等で)確認してください。この名前を間違えると、関係ないディスクを破壊する可能性があるので、十分に注意してください。以下では、SD カードが /dev/sdX として認識されたと仮定します。
以下を実行します。
$ make DEVKIT=icicle-kit-es-sd
$ sudo make DISK=/dev/sdX DEVKIT=icicle-kit-es-sd format-icicle-sd-image
$ sudo dd if=work/rootfs.bin of=/dev/sdX3 bs=4096
これが終わったら、SD カードを Icicle Kit にセットして電源を投入すると、Linux がブートします。ユーザー名とパスワードは、上記 GitHub リポジトリの説明を参考にしてください。
なお、このままでは rootfs がマウントされません。以下のようにしてマウントします。
# mount /dev/mmcblk0p3 /mnt
# chroot /mnt
# mount -a
無事に動作しましたでしょうか?
(略) Starting dropbear sshd: [ 12.227288] random: dropbear: uninitialized urandom read (32 bytes read) OK Welcome to Buildroot buildroot login: root Password: # uname -a Linux buildroot 5.6.16 #1 SMP Wed Nov 11 11:34:08 JST 2020 riscv64 GNU/Linux #
今日はここまで。