[PolarFire SoC] Buildroot を試してみる

(更新

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
#

今日はここまで。

お問い合わせはお気軽に!

お問い合わせを頂いた後、継続して営業活動をしたり、ニュースレター等をお送りしたりすることはございません。
御返答は 24時間以内(営業時間中)とさせて頂いております。必ず返信致しますが、時々アドレス誤りと思われる返信エラーがございます。返答が届かない場合、大変お手数ではございますが別のメールアドレスで督促頂けますと幸いです。