HiFive Unleashedが来た

世界初(?)のLinuxが動作するRISC-V開発ボードであるところのHiFive Unleashedを入手した。お値段$999と、この手のボードとしてはなかなかお高い。とりあえずLinuxをブートしてみる程度には触ってみたので、メモを残しておく。

www.instagram.com

付属のmicroSDカードでブート

Linuxのブートイメージが書き込まれたmicroSDカードが付属しているのでこれを使ってブートしてみる。詳細は以下のマニュアルの "Chapter 5 Boot and Run" に詳しい。

HiFive Unleashed Getting Started Guide | SiFive

要約すると以下のようになる。

  1. 付属のmicroSDを本体のmicroSDカードスロットに挿入
  2. DIPスイッチをすべて1(Default Boot Mode)に設定
  3. USBケーブルでホストに接続
  4. 電源ON
  5. USBコンソールが2つ見える(ttyUSB0, ttyUSB1)ので後の方(ttyUSB1)にbaud rate 115200で接続
  6. しばらくすると(20〜30秒?)Linuxのブートログが表示される

SDKでブートイメージをビルドしてブート

SiFiveからSDKが公開されており、これを使ってLinuxのブートイメージを作成してブートしてみる。詳細は同じマニュアルの "Chapter 7 Software Development Flow" に詳しい。

HiFive Unleashed Getting Started Guide | SiFive

要約すると以下のようになる。付属のmicroSDカードは取っておくことにして、新しいmicroSDカードを使用した。ホストにはUbuntu 16.04を使用した。

  1. ホストに必要なパッケージをインストール
    • sudo apt-get install autoconf automake autotools-dev bc bison build-essential curl flex gawk gdisk git gperf libgmp-dev libmpc-dev libmpfr-dev libncurses-dev libssl-dev libtool patchutils python screen texinfo unzip zlib1g-dev
  2. SDKをgit clone
  3. ビルド
    • unset RISCV
    • make
  4. microSDカードにGPTを作成
  5. ブートイメージの書き込み(デバイスは適当に読み替えて)
    • sudo make DISK=/dev/sdb format-boot-loader

SDK付属のカーネルを自分でビルドしてブート

自分でSDK付属のカーネルをビルドしてブートイメージを作ってみる。要はSDKのトップディレクトリにあるMakefileと同じことを行えばよい。

SDKではinitramfsをrootfsとして使うようになっていたので同じようにしてみた。カーネルのソースツリーにdtsファイルが含まれていないのでこの辺りをどうしているのか少し悩んだが、以下のSiFiveのForumによるとどうやらFSBLにdtbが組み込まれていてこれを使用しているらしい。とりあえず今のところはあまり深く考えないでおく。

forums.sifive.com

以下のような手順となる。

  1. Working directoryを作成
    • mkdir ~/work/linux
    • mkdir ~/work/riscv-pk
  2. 環境変数を設定
    • export PATH=$HOME/freedom-u-sdk/toolchain/bin:$PATH
    • export ARCH=riscv
    • export CROSS_COMPILE=riscv64-unknown-linux-gnu-
  3. SDK付属の.configをコピー
  4. Linuxのビルド
    • make O=~/work/linux CONFIG_INITRAMFS_SOURCE="$HOME/freedom-u-sdk/conf/initramfs.txt $HOME/freedom-u-sdk/work/buildroot_initramfs_sysroot" CONFIG_INITRAMFS_ROOT_UID=1000 CONFIG_INITRAMFS_ROOT_GID=1000
  5. bblのビルド
    • cd ~/work/riscv-pk
    • ~/freedom-u-sdk/riscv-pk/configure --host=riscv64-unknown-linux-gnu --with-payload=~/work/linux/vmlinux
    • CFLAGS='-mabi=lp64d -march=rv64imafdc' make
  6. bbl.binの作成
    • riscv64-unknown-linux-gnu-objcopy -S -O binary --change-address -0x80000000 bbl bbl.bin
  7. 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を移植しようと頑張っている人がいたようだが、最近は停滞気味らしい。

カーネルブートローダも含め、まだまだこれからなのかな、という感触だった。