VisionFive 2のブートローダーを更新するには

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つをご用意下さい。

  1. USBシリアル変換アダプタ
  2. ジャンパーワイヤー メスーメス
  3. 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サーバに置く、と考えるとわかりやすいと思います。

  1. u-boot-spl.bin.normal.out
  2. 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を起動します。

RISC-V CPUのシングルボードコンピュータVisionFive 2でDebianを起動してみました
シングルボードコンピュータといえば、ARMアーキテクチャのCPUが主流かと思いますが。※2023年3月現在 2022年末頃から、RIS...

起動後、ルートパーティションを拡張しておきましょう。


ビルド環境作成

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つのファイルが正しく生成されているか確認します。

  1. u-boot.bin
  2. arch/riscv/dts/starfive_visionfive2.dtb
  3. 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がビルドした実行バイナリになります。

./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つのファイルですが。

  1. u-boot/spl/u-boot-spl.bin.normal.out
  2. 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つのファイルをダウンロードできましたか。(ビルドしてから気づいた

  1. u-boot-spl.bin.normal.out
  2. 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を起動してみましょう?

スポンサーリンク

フォローする

スポンサーリンク