HiFive Unleashedが来た
世界初(?)のLinuxが動作するRISC-V開発ボードであるところのHiFive Unleashedを入手した。お値段$999と、この手のボードとしてはなかなかお高い。とりあえずLinuxをブートしてみる程度には触ってみたので、メモを残しておく。
付属のmicroSDカードでブート
Linuxのブートイメージが書き込まれたmicroSDカードが付属しているのでこれを使ってブートしてみる。詳細は以下のマニュアルの "Chapter 5 Boot and Run" に詳しい。
HiFive Unleashed Getting Started Guide | SiFive
要約すると以下のようになる。
- 付属のmicroSDを本体のmicroSDカードスロットに挿入
- DIPスイッチをすべて1(Default Boot Mode)に設定
- USBケーブルでホストに接続
- 電源ON
- USBコンソールが2つ見える(ttyUSB0, ttyUSB1)ので後の方(ttyUSB1)にbaud rate 115200で接続
- しばらくすると(20〜30秒?)Linuxのブートログが表示される
SDKでブートイメージをビルドしてブート
SiFiveからSDKが公開されており、これを使ってLinuxのブートイメージを作成してブートしてみる。詳細は同じマニュアルの "Chapter 7 Software Development Flow" に詳しい。
HiFive Unleashed Getting Started Guide | SiFive
要約すると以下のようになる。付属のmicroSDカードは取っておくことにして、新しいmicroSDカードを使用した。ホストにはUbuntu 16.04を使用した。
- ホストに必要なパッケージをインストール
- SDKをgit clone
- git clone https://github.com/sifive/freedom-u-sdk.git
- cd freedom-u-sdk
- git submodule update --init --recursive
- ビルド
- unset RISCV
- make
- microSDカードにGPTを作成
- ブートイメージの書き込み(デバイスは適当に読み替えて)
- sudo make DISK=/dev/sdb format-boot-loader
SDK付属のカーネルを自分でビルドしてブート
自分でSDK付属のカーネルをビルドしてブートイメージを作ってみる。要はSDKのトップディレクトリにあるMakefileと同じことを行えばよい。
SDKではinitramfsをrootfsとして使うようになっていたので同じようにしてみた。カーネルのソースツリーにdtsファイルが含まれていないのでこの辺りをどうしているのか少し悩んだが、以下のSiFiveのForumによるとどうやらFSBLにdtbが組み込まれていてこれを使用しているらしい。とりあえず今のところはあまり深く考えないでおく。
以下のような手順となる。
- Working directoryを作成
- mkdir ~/work/linux
- mkdir ~/work/riscv-pk
- 環境変数を設定
- SDK付属の.configをコピー
- Linuxのビルド
- bblのビルド
- bbl.binの作成
- bbl.binを上で作ったmicroSDカードに書き込み
- sudo dd if=bbl.bin of=/dev/sdb1
ブートプロセスを少しだけ
ブートプロセスについては以下のマニュアルの "Chapter 6 Boot Process" に詳しい。
Freedom U540-C000 Manual | SiFive
簡単にまとめると、Zeroth Stage Boot Loader(ZSBL)→First Stage Boot Loader(FSBL)→Berkeley Boot Loader(BBL)→Linuxという順にブートするらしい。ZSBLはROMに書き込まれており、FSBL, BBLをどこからロードするかはDIPスイッチで設定可能。Default Boot Mode(DIPスイッチをすべて1)では、FSBLはQSPI0 flashから、BBLはSDカードからロードする。
FSBLはGUIDが5B193300-FC78-40CD-8002-E86C45580B47のパーティションに、BBLはGUIDが2E54B353-1271-4842-806F-E436D6AF69851のパーティションに格納されている必要がある。SDKのmake DISK=/dev/sdb format-boot-loaderコマンドでは、SDカードにBBL用のこのGUIDを持ったパーティションを作ってくれる。
BBLは組込みシステムでよく使うU-Bootなどに比べると使い勝手がよくなさそうだ。ファイルシステムやネットワーク経由でカーネルをロードすることはできず、カーネルをBBLのpayloadにくっつける(?)必要がある。したがって、新たにビルドしたカーネルでブートするには上の手順5〜7を毎回行う必要があるようだ。SiFiveのForumを見るとcorebootを移植しようと頑張っている人がいたようだが、最近は停滞気味らしい。