1.はじめに
前回は製品版のHiFive Unmatchedボードについて開封の儀をお届けするとともに、SiFive正規日本代理店ならではの切り口としてこれまでみてきた評価版ボードとの違いについてご紹介しました。
今回は、組込み機器用のLinuxディストリビューションを作るためのフレームワークOpen Embeddedディストリビューションを採用し、SiFiveがメンテナンスをしているFreedom U SDK(FUSDK)のご紹介と、HiFive UnmatchedボードにおけるFUSDKで作成したLinuxのブート方法について解説します。
2.Freedom U SDK(FUSDK)とは
Freedom U SDK(FUSDK)とは、組込み機器用のLinuxディストリビューションを作るためのフレームワークOpen Embeddedディストリビューションを採用し、Yoctoベースでシステムを構築する環境です。SiFiveがメンテナンスをしており、現在およそ月に1回程度の頻度で更新され、GitHub(https://github.com/sifive/freedom-u-sdk)で公開されています。

2.1.対象プラットフォーム
FUSDKは以下のプラットフォームを対象としています。
- HiFive Unmatchedボード
- HiFive Unleashedボード(すでに販売終了)
- QEMU(エミュレータ)
2.2.FUSDKでできること
FUSDKを用いて実現できることを以下に挙げます。
- サードパーティのソフトウェアパッケージを追加してカスタムディスクイメージの構築
- QEMUのVMインスタンスで即実行可能なディスクイメージの構築
- ブートローダ―バイナリ(OpenSBI,U-Boot,U-Boot SPL)のビルド
- デバイスツリーバイナリ(DTB)の構築
- Linuxカーネルイメージのビルド
- ディスクパーティションを容易に変更
FUSDKは、上記に挙げたような操作を行うことで、お好みのLinuxディストリビューションパッケージを作成することができます。また、サンプルのビルド済みイメージも取得可能(※1)となっており、速やかにHiFive Unmatchedボード上でFUSDKのLinuxの動作を試すことができます。今回の説明は、このサンプルのビルド済みイメージを対象として進めます。
なお、FUSDKについてのより詳しい情報は、HiFive Unmatched Software Reference Manual(※2)に記載がありますので、そちらを参照してください。
※1 こちら(https://github.com/sifive/freedom-u-sdk/releases/tag/2021.06.00)から入手可能です。
※2 こちら(https://www.sifive.com/boards/hifive-unmatched)から入手可能です。
3.ブート・フロー
FUSDKによって作られたLinuxがHiFive Unmatchedボードで起動するまでのブート・フローについて説明します。
HiFive Unmatchedボードに搭載されるCPU、FU740には、Zero Stage Boot Loader(ZSBL)と呼ばれるブートローダが内蔵されています。このZSBLは、ディップスイッチの状態(デフォルトはSDカードからブートに設定)を見て、SDカードから次のブートプログラムU-Boot SPLを読み込みます。
U-Boot SPLは比較的小さなサイズであることから、FU740のL2 LIM領域に配置、実行します。
次にU-Boot SPLは、SDカードからOpenSBIを読み込み、DDRメモリ上に配置、実行します。
さらにOpenSBIは、U-BootをSDカードから読み込み、DDRメモリ上に配置、実行します。
最後にU-Bootは、LinuxをSDカードから読み込み、DDRメモリ上に配置、実行します。

4.ブート・ターゲットの種類
前章では、SDカードをブート・ターゲットとしてFUSDKのブート・フローを説明しました。実はFUSDKに含まれるU-Bootは、SDカード以外からLinuxをブートすることが可能(※3)です。
FUSDKのビルド済みイメージ(※4)では、以下に示すブート・ターゲットが選択可能です。
①NVMe
②USB
③SD
④PXE
⑤DHCP
U-Bootは上記の①~⑤の順番でブート・ターゲットを自動的に検索(※5)し、見つかったものをブート・ターゲットとしてLinuxを読み込み、実行します。
※3 U-Boot SPL,OpenSBI,U-Bootは、SDカードのみが対象になります。
※4 本記事執筆時は、Release 2021.03.00~2021.06.00が選択可能です。
※5 U-Boot起動直後にEnterキーを押下し、U-Bootのコマンドにて手動でブート・ターゲットを選択することも可能です。
5.ブート・ターゲットの切替方法
ブート・ターゲットを切り替えるには、以下の手順を行います。
①FUSDKビルド済みイメージをGitHubからダウンロードする
②ダウンロードしたFUSDKビルド済みイメージを該当のターゲット・デバイスに書き込む
③②で書き込んだFUSDKビルド済みイメージをマウントし、/boot/extlinux/extlinux.conf ファイルを開く
④extlinux.confファイルを編集し、Linuxカーネル・コマンドライン・パラメータを該当ターゲット・デバイス配下となるように書き換える
USBブート用にUSBメモリ内にあるextlinux.confを編集した例を示します。

6.応用編)HiFive Unmatchedボード上でFUSDKをアップデートする
前章で説明した手順は、実はすべてHiFive Unmatchedボード上で行うことができます。Linux起動対象のターゲット・デバイスとは異なるデバイスにFUSDKビルド済みイメージを書きこむことによって、HiFive Unmatchedボード上で手軽に最新のFUSDKにアップデートすることができるようになります(※6)。
工場出荷時のSDカードを挿入した状態で、前章で説明した手順で作成したUSBメモリの有無による、起動状態の違いを下図に示します。

※6 本記事執筆時のFUSDKでは、ブートローダのアップデート、SDカード上のLinuxのアップデートを行うにはもう一工夫必要です。
7.おまけ)起動速度比較
USBメモリと同様に、NVMe SSDをブート・ターゲット・デバイスとすることもできます。そこで、SDカード、USBメモリ、NVMe SSDそれぞれの起動速度を比較してみました。

やはりNVMe SSDを使うとかなり高速化されることがわかります。現時点のFUSDKではブート時に必ずSDカードを経由する仕様となっていますが、QSPIを利用するなどすれば、さらなる高速化が期待できます。
8.まとめ
いかがでしたでしょうか。今回は、FUSDKの概要、FUSDKに含まれるU-Bootの機能を用いることでブート・ターゲットを切り替えられること、そして手軽にFUSDKのLinuxをアップデートする方法をお伝えしました。
注意点としまして、SDカードやUSBメモリへFUSDKのビルド済みイメージを書き込む際、誤って別のデバイスを指定してしまうと取り返しのつかないことになる恐れがあります。くれぐれもご注意いただき、自己責任でお願いします。
次回は、HiFive Unmatchedボードに搭載されるUSBシリアルアダプターを介し、SiFiveが提供するFreedom Studio IDEを用いることで、Linuxが起動するまでのブート・フローをさらに詳細に見ていきたいと思います。
なお、本ブログについてのより詳しい内容へのご質問、またご紹介した各種評価ボードを実際に触ってみたいという方は評価ボード貸し出しの対応も行っておりますので、ぜひお気軽にお問合せください。
お問い合わせはこちら
info-lsi@dts-insight.co.jp
■■DTSインサイトの「システムLSI設計ソリューションサービス」■■
DTSインサイトでは、システムLSI/FPGA設計の受託も行っています。
当社のノウハウを活かした、ソフトウェアの移行(マイグレーション)
サービスも提供しておりますので、お気軽にご相談ください。
システムLSI設計ソリューションサービス紹介は こちら