RISC V CPUを搭載したシングルボードコンピュータ。
VisionFive 2でDebianを起動しまして。
ブートローダーをビルド。
最新版に更新する手順を記録させて頂こうと思います。
目次
更新前後のVisionFive 2ブートローダーのバージョン
2023年3月25日現在。本日ビルドしたブートローダーはこのような感じです。
Open SBI VF2_v2.11.5という記述があります。一方、更新前のバージョンは。
OpenSBI v1.2でした。VisionFive 2を購入したのは2023年2月、到着は3月でした。
ブートローダーの更新は、tftpを使用する方法と、flashcpを使用する方法があります。このうちflashcpを使用する方法は、VF2_v2.5.0以降が必要です。
購入した状態のVisionFive 2のOpenSBバージョンはv1.2のため、必ずtftpで更新する必要がある、と考えたほうが良いと思います。
必要な機材
USBシリアル変換アダプタ
VisionFive 2のブートローダーの更新は、シリアルコンソールへの接続が必要になります。
ブートローダーのイメージをVisionFive 2に転送する際、シリアルコンソールでコマンドを実行する必要があります。
下記の3つをご用意下さい。
- USBシリアル変換アダプタ
- ジャンパーワイヤー メスーメス
- USBケーブル Type-A microB
tftpdサーバ
VisionFive 2へ新しいブートローダーを転送するために、Vision Five 2からLAN経由でtftpdへ接続する必要があります。
よって、何か別のサーバPCが必要、ということになります。
私は手元のRaspberry Piにtfptd(tftpデーモン)をインストールしました。
この記事の手順は、Raspberry Pi OS(64ビット版)にてtftpdを起動し、ビルドしたブートローダーを配備する内容になります。Ubuntu等、Debian系のLinuxでしたら、他のPCでも同じ流れになると思います。
tftpdに配備するファイル
ブートローダーの更新ですが。下記の2つのファイルをビルドして、tftpサーバに置く、と考えるとわかりやすいと思います。
- u-boot-spl.bin.normal.out
- visionfive2_fw_payload.img
こちらのファイルが、ビルドしたブートローダーになります。Raspberry Piでtftpdを動かし、VisionFive 2のブートローダーから接続して、ファイルを転送→最新版に更新する流れになります。
Raspberry Piは、tftpdサーバとして、ファイルを置くという用途です。
新しいブートローダーのビルドは、VisionFive 2でビルドしようと思います。クロスコンパイルも可能かもしれませんが、アーキテクチャが全く異なるCPUということで、難易度は最高だと思います。
それでは具体的にこの2つのファイルをビルドしたいと思います。
VisionZero 2用ブートローダービルド手順
公式情報
公式の手順はこちらになります。
しかし手順通りでは、足らない材料がある感じでした。ビルドエラーが発生したり。よって、本記事では、こちらをベースに足らないものを書き足させて頂いた内容になります。
なお、この記事は手順のみ記載してあるため、ファイルの具体的な用途が書かれておりません。u-bootが何か?OpenSBIが何か?等。そのあたりを認識したい場合は、公式マニュアルに目を通してみて下さい。
VisionFive 2でDebian起動
RISC Vのブートローダーをビルドするということで。対象のCPUであるVisionFive 2でブートローダーをビルドしないと、難易度がかなり高いと思います。
VisionFive 2でビルドする場合でも、Debianはriscv64、ブートローダーはriscv(32ビット)扱いのため、クロスコンパイル環境なのかなと思います。
まずは、VisionFive 2でDebianを起動します。
起動後、ルートパーティションを拡張しておきましょう。
ビルド環境作成
rootでログインしたため、sudoコマンドは省略しました。
更新とビルド関連ツールのインストールを行います。
apt update
apt ugrade -y
apt install gcc-riscv64-linux-gnu -y
apt install buid-essential git flex bison make device-tree-compiler -y
ソースの取得にgitコマンド、コンフィグの作成にflex, bison、ビルドにmake、そしてdevice-tree-compilerが無いとイメージ作成時にエラーが出て進まなくなりました。このあたりを入れておきましょう。
riscv64-linux-gnu-gcc -v
gccのバージョンを確認したところ、11.3.0でした。Debianのバージョンは11.3.0なのですね。ふむふむ。
riscv64アーキテクチャのコンパイラを使うのは初めてです。
新しいCPUに、シングルボードコンピュータというお手軽なデバイスで触れられるというのは、なんだか新鮮な感じがします。
u-bootのコンパイル
準備ができたところで、最初にu-bootをコンパイルします。
cd
# ソース取得
git clone https://github.com/starfive-tech/u-boot.git
cd u-boot
git checkout -b JH7110_VisionFive2_devel origin/JH7110_VisionFive2_devel
git pull
# コンフィグ作成
make starfive_visionfive2_defconfig ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu-
# コンパイル
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu-
VisionFiveは無印(1)と2が存在します。最初、誤って無印のマニュアルを見てしまい、コンフィグのオプションを間違ってしましました。正しいマニュアルを見ながら進めましょう。
コンパイルとリンク完了後、3つのファイルが正しく生成されているか確認します。
- u-boot.bin
- arch/riscv/dts/starfive_visionfive2.dtb
- spl/u-boot-spl.bin
こちらのファイル材料にして、次の工程のファイルを作る・・・を何度か繰り返す感じです。
OpenSBIのコンパイル
次にOpenSBIをビルドします。
cd
git clone https://github.com/starfive-tech/opensbi.git
cd opensbi
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- PLATFORM=generic \
FW_PAYLOAD_PATH=../u-boot/u-boot.bin \
FW_FDT_PATH=../u-boot/arch/riscv/dts/starfive_visionfive2.dtb \
FW_TEXT_START=0x40000000
makeのオプションに、先ほどビルドしたu-boot.binとstarfive_visionfive2.dtdファイルを指定する感じです。ビルドが完了すると、firmwareディレクトリにfw_payload.binファイルが作成されます。
ls -al opensbi/build/platform/generic/firmware
SPLファイル作成
ツールをビルドします。ソースを取得してmakeしました。
cd
git clone https://github.com/starfive-tech/Tools
cd Tools
git checkout master
git pull
cd spl_tool/
make
./spl_tool -c -f ../,,/u-boot/spl/u-boot-spl.bin
先ほどビルドしたu-boot-spl.binファイルを、spl_toolで加工する感じでしょうか。
u-boot.splファイルから、「u-boot-spl.bin.normal.out」が生成されました。こちらのファイルがブートローダーとなるファイル2つのうちの1つ、SPLファイルになります。
fw_payloadファイル作成
さて。ビルドも最後です。
cd
cd Tools/uboot_its
cp ../../opensbi/build/platform/generic/firmware/fw_payload.bin ./
../../opensbi/tools/mkimage -f visionfive2-uboot-fit-image.its \
-A riscv -O u-boot -T firmware visionfive2_fw_payload.img
先ほどビルドしたfw_payload.binをカレントディレクトリにコピーして、mkimageコマンドでvisionfive2_fw_payload.imgファイルを生成します。
失敗する場合、device-tree-compilerが正しくインストールされているか確認しましょう。
ファームウェアファイルが正しく生成されましたでしょうか。ブートローダーとなるファイルの2つめ、visionfive2_fw_payload.imgができました。
ブートローダー更新用tftpd作成
別のPCへtftpdインストール
作成した2つのファイルですが。
- u-boot/spl/u-boot-spl.bin.normal.out
- Tools/uboot_its/visionfive2_fw_payload.img
VisionFive 2ではない、別のPCに置く必要があります。
おうちで稼働している、Raspberry PiでTFTPDを動かして、ファームウェアの更新サーバにしたいと思います。
# VisionFIve 2ではないDebian系OSで実行
sudo apt install tftpd-hpa -y
systemctl status tfptd-hpa.service
このような感じで問題なくtftpデーモンが動作しているようです。
tftpdディレクトリへファイルを転送
先ほど作成したブートローダーファイルは、sshプロトコルを使用したrcpコマンドで、VisionFive 2からRaspberry Piへコピーしました。
# VisionFive 2側からrcpにてコピー
rcp ./u-boot/spl/u-boot-spl.bin.normal.out <Raspberry Piユーザ名>@<IPアドレス>:<コピー先ディレクトリ>
rcp ./Tools/uboot_its/visionfive2_fw_payload.img <Raspberry Piユーザ名>@<IPアドレス>:<コピー先ディレクトリ>
Raspberry Piのユーザのホームディレクトリへコピーしました。
続いてtftpdの公開ディレクトリである/srv/tftpディレクトリにコピーしました。
# tftpdサーバにて
sudo cp u-boot-spl.bin.normal.out visionfive2_fw_payload.img /srv/tftp
以上でtftpプロトコルでブートローダーファイルにアクセスできるようになりました。
ビルドせずにダウンロードしたい場合
こちらから、次の2つのファイルをダウンロードできましたか。(ビルドしてから気づいた
- u-boot-spl.bin.normal.out
- visionfive2_fw_payload.img
ブートローダー更新
ブートローダーの公式更新手順は、こちらになります。
VisionFive 2をいちどシャットダウンします。sudo halt
microSDカードを取り外して、ブートローダーのコンソールが使用できるようにします。
シリアル変換アダプタを接続し、他のPCからシリアルコンソールに接続し、電源を入れます。前述の通り、更新前のブートローダーが起動します。
コマンドを入力し、tftpdサーバへアクセス、ブートローダーファイルを書き込みます。
なお、下記のコマンドは、コピペではなく手入力しました。コピペでエラーが出る場合は、手入力してみて下さい。
setenv ipaddr <VisionFive 2側のIPアドレス>;setenv serverip <tftpdサーバのIPアドレス>
sf probe
tftpboot 0xa0000000 ${serverip}:/u-boot-spl.bin.normal.out
sf update 0xa0000000 0x0 $filesize
tftpboot 0xa0000000 ${serverip}:/visionfive2_fw_payload.img
sf update 0xa0000000 0x100000 $filesize
ファイルを1つずつ転送・更新を行う感じでしょうか。
上図のようにエラーが出なければ、更新は完了です。
VisionFive 2の電源を入れ直せば、新しいブートローダーが起動します。
ブートローダーの更新お疲れ様でした!
ブートローダー更新後は、tftpではなくflashcpで更新が可能になるため、次回以降の更新は、tftpdサーバは不要になると思います。(純正Debianを起動した場合
新しいブートローダーでは、Image-55以外のLinuxを起動できるようになりました。
しかし初期設定にシリアルコンソールが必要だったりしますので、VisionFive 2にシリアルコンソールは必須だと思います。引き続き取付けておいたほうが良いと思います。
RISC Vはどのような感じでしょうか?
準備ができたところで、最新のLinuxを起動してみましょう?