🐈

VisionFive 2 のセットアップ記録

2023/01/03に公開

VisionFive 2 のセットアップ記録

この記事では、StarFive Techという会社がKickstarter上で行っていたプロジェクト VisionFive 2 - open source quad-core RISC-V dev board への支援のリターンとして得られた64bit RISC-V シングルボードコンピュータ 「VisionFive 2」をセットアップした様子について記録を残します。

こんな人は記事を読むといいかも

  • RISC-Vの実機に興味がある
  • VisionFive 2で環境構築している様子を知りたい

こんな人が記事を書いています

  • 情報系の大学生
  • 電子工作をしたことがない、ソフトウェア側の人間

概要

  • VisionFive 2が届いてからDebian Image 69を起動させるまで
    • serial-USB変換ケーブルを用いたSPLとU-bootの更新
  • SSHログインする
  • Debian上でC言語を用いてHello World
    • objdumpを用いてバイナリを確認
  • その他
    • スペック確認
    • 今後やってみたいこと

本題

VisionFive 2が届く

VisionFive 2が届いた様子
RISC-Vの時代...!

私はKickstarterで $89以上のプレッジ: Super Early Bird - 8GB version の内容で支援を行いました。これはEthernet portが少ししょぼい代わりに早くお届けするよ!というものです。

お届け予定は2022/12だったのですが発送連絡がなく、来年になるかな〜と思っていたら2022/12/31にポストに入っていました。

中身は以下のようになっています。Raspberry piみたいですね。

VisionFive 2実機
袋に入っています

VisionFive 2実機2
Ethernet部分はなんかQRやシリアルナンバーっぽかったので隠しました

RISC-V実機はいくつかありますが、私がVisionFive 2を選択したのは以下の理由です

  • GUIが動きそう
    • HDMI端子がある
  • メモリ8GB積んでいるRISC-Vボードでお値段がそんなにしないのがこれしかないと思った
    • 払った金額は日本への送料込みで$101です
  • ラズベリーパイくらいの大きさで手頃

Debian Image-69が動くまで

documentは pdf: VisionFive 2 Single Board Computer Quick Start Guide にあるのでまずこれを読みます。これは、 KickstarterのアップデートのSDK Release からたどり着くことができます。

他にも、 RVspace Documentation Center VisionFive 2 に色々資料がありそうです。

私が最初に遭遇した問題の概要は以下の通りです。

  • Imageを焼き込むmicroSDカードが16GBで容量が足りない
    • Quick Start Guideに「32GB or more」とあるように、32GBは必要です。16GBのmicroSDカードでやろうとして、Debian Image 69が16.8GBくらいで無理でした。
    • 64GBのmicroSDカードを使って解決
  • SPL, U-BootのアップデートなしではDebian Image 69が動かない
    • アップデートしたら解決、HDMI出力されてDebianが動くように

以下で順を追って説明します。

microSDカードにDebianのイメージを焼き込む

Raspberry piとか自作PCにUbuntu入れたことある人なら分かると思うんですが、PCは基本的に以下のようにしてOSが起動します

  1. 電源を入れる
  2. ボードの特殊なメモリに元々焼き込まれているブート用のプログラムが動作する
  3. SSD、USBやmicroSDカードに入っているOS本体が起動する
  4. HDMIで繋いだディスプレイに表示される

今回は3でmicroSDカードを使います。
先ほどのpdf の 3.3.1 Flashing with Linux or Windowsの2.のリンクからDebianのイメージがダウンロードできます。

Debian Image-69

私は Google Cloud Disk, Image-69を選択しました。ガイドの手順通りBalenaEtcherをWindows機に入れてmicroSDカードに焼きます。

...16GBのmicroSDカードなので容量的にできませんでした。

microSDカードの容量が足りない様子
Too small

気を取り直して64GBのmicroSDカードを用意して再チャレンジするとDebianのイメージを焼き込むことができました。

microSDカードを差し込む様子
16GBではなく、32GB以上を使おう!

SPL, U-Bootのupdate

これで問題1つめは解決しました。しかし、電源を入れてもHDMI出力がありません。

microSDカードに GitHub: starfive-tech/VisionFive2のRelease にある sdcard.img といういかにもそれらしいイメージファイルを焼き込んで電源を入れたところ、HDMI出力はありせんが電源ランプが緑に点滅しました。しかしDebianイメージの方では緑の点滅すらありません。

これは何か問題があるなと思って調べたところ、Kickstarterのコミュニティに上がっていたドイツの方の記事: RISC-V-Board: Erste Schritte mit Starfive Visionfive 2 に詳しく書いてありました。

要約すると以下のような内容です。

  • 現在出荷されているVisionFive 2はSPL flash, U-Bootが古く、Debian Image-55しか入れられない。Debian Image-69は起動しない
  • SPL flash, U-bootのupdate方法は2種類ある。本体からのupdateと、シリアル通信を通してピンを通じての更新の2つ。
  • Debian Image-55からは本体からのupdateができない
  • 従って、シリアル通信によるSPL flash, U-Bootのupdateが必要。
  • SPL flash, U-Bootのupdateが済んだらDebian Image-69でHDMI出力できる。

つまり、OSが起動するまでで説明した2の「ボードに積んだ特殊なメモリに書き込まれている、OSを起動させるプログラム」をアップデートする必要があります。

というわけでserial-USB変換ケーブルを購入しました。どのserial usb変換ケーブルがいいのかは VisionFive 2 Compatibility Test 2022.9.15 を眺めて debug UARTの項目の CP2102 というチップが載っているものを購入しました。

ケーブルを本体に繋いでいる様子
USB-serial変換ケーブルをVisionFive 2に繋いだ様子

USB-serial変換ケーブルをピンに挿す時は 先ほどから何度も登場しているpdf: QuickStartGuide をよくみて行いました。

VisionFive 2概念図
VisionFive 2概念図

つなげる線は上のようになっています。

  • 電源をUSB-Type Cケーブルでつなぐ
  • ピン - serial-USB変換ケーブル - PC
  • Ethernet(内側の方につなぐ)

また、microSDカードは緑のランプが点滅した sdcard.img を入れたものを挿しました。

ドイツの方の記事に書いてありますが、外側のEthernet portはDHCPサポートがないので、Ethernet portは内側を使います。

QuickStartGuide(pdf)と GitHubのVisionFive2リポジトリのappendix の手順を参考にしてSPL, U-Bootをupdateします。今回はVisionFive2を接続したPCはUbuntu Serverです(Ubuntu 22.04)

シリアル通信の確立

/dev/ttyUSB0 が存在していて、今回はこれが対象でした。(環境により異なります。)
まず何か出てないか調べます。素直に cat してみます。

$ sudo cat /dev/ttyUSB0
!���BHԆ�!�������J�����
                      !�ԥ��1���
                               ���
!��

電源を入れるとなんか出ているので通信はしてそうです。
Linuxにおけるシリアルポートのトラブルシューティング を参考にして、以下のコマンドで接続できました。

# 現在の設定確認
$ sudo stty -F /dev/ttyUSB0 -a

# 変更
$ sudo stty -F /dev/ttyUSB0 115200 cs8 -parenb -cstopb

# 接続
$ sudo screen /dev/ttyUSB0 115200,cs8

# 何も出ないが、`help` など文字を打つと反応が返ってくる

シリアル通信の様子
aaaaって打ったら返事が来た

これはU-bootに接続しています。BIOS的なものだと理解しています。 help version などのコマンドが使えます。

StarFive # version
U-Boot 2021.10 (Oct 31 2022 - 12:11:37 +0800), Build: jenkins-VF2_515_Branch_SDK_Release-10

riscv64-buildroot-linux-gnu-gcc.br_real (Buildroot VF2_515_v2.3.0) 10.3.0
GNU ld (GNU Binutils) 2.36.1

TFTPサーバをたてる

ここでPC側でTFTPサーバを立てます。Ubuntu Serverでは以下のようにしました。Windowsなどでもできるそうです。

# @ Ubuntu Server
$ sudo apt install tftpd-hpa
# 自動で起動している

FTPサーバみたいな動きをするので、port設定をしてから /srv/tftp/ にSPL, U-Boot更新用のファイルを2つおきます。このファイルは GitHubのRelease にあります。

以下のように配置すればOK

# @ Ubuntu Server
/srv/tftp/u-boot-spl.bin.normal.out
/srv/tftp/visionfive2_fw_payload.img

SPL, U-Bootのupdate

以下がコマンドを打っている様子です(IP addressは * でマスクしています)

StarFive # setenv ipaddr 192.168.*.*;setenv serverip 192.168.*.*

# check ethernet ping
StarFive # ping ${serverip}
EQOS_DMA_MODE_SWR stuckFAILED: -110ethernet@16040000 Waiting for PHY auto negotiation to complete.... done
Using ethernet@16040000 device
host 192.168.*.* is alive

StarFive # sf probe
SF: Detected gd25lq128 with page size 256 Bytes, erase size 4 KiB, total 16 MiB
StarFive # tftpboot 0xa0000000 ${serverip}:u-boot-spl.bin.normal.out
Using ethernet@16040000 device
TFTP from server 192.168.*.*; our IP address is 192.168.*.*
Filename 'u-boot-spl.bin.normal.out'.
Load address: 0xa0000000
Loading: #########
         5.1 MiB/s
done
Bytes transferred = 127816 (1f348 hex)
StarFive # sf update 0xa0000000 0x0 $filesize
device 0 offset 0x0, size 0x1f348
127816 bytes written, 0 bytes skipped in 0.719s, speed 181279 B/s
StarFive # tftpboot 0xa0000000 ${serverip}:visionfive2_fw_payload.img
Using ethernet@16040000 device
TFTP from server 192.168.*.*; our IP address is 192.168.*.*
Filename 'visionfive2_fw_payload.img'.
Load address: 0xa0000000
Loading: #################################################################
         #################################################################
         #############################################################
         5.9 MiB/s
done
Bytes transferred = 2793045 (2a9e55 hex)
StarFive # sf update 0xa0000000 0x100000 $filesize
device 0 offset 0x100000, size 0x2a9e55
835157 bytes written, 1957888 bytes skipped in 6.364s, speed 449203 B/s
StarFive #

これで電源を落として、microSDをDebian Image-69を入れたものにして再起動するとHDMIに表示がされました。

HDMIに表示された
嬉しい

有線マウス、英字キーボードをUSBで繋いだら普通に使えてログインできました。
これでDebian Image-69が動くようになりました。

SSHログインするまで

モニタがラズパイ用で小さく、家には4Kモニタしかなくて、Changelogを見る限り4K対応はまだのようだったのでSSHログインすることにしました。

小さいモニタ
シルバニアファミリーもびっくりの小さなモニタ

ちなみに、解像度変更はDebianのGUIでのSettingsからは変更できましたが、xrandrを用いてカスタムの解像度に変更するとOSごと落ちました。また、4Kのモニタにつなぐとカーソルが真ん中に出てそのまま固まりました。発展途上なところがあります。

以下の内容を小さなモニタに気合いで打ちます。sshでrootログインを可能にします。

$ ip a
eth1: 192.168.*.*

$ echo "PermitRootLogin=yes" >> /etc/ssh/sshd_config
$ /etc/init.d/ssh restart

sshでログインできました。

sshでログイン
IP addressはマスクしています

Cコンパイラを入れる

gcc がみたところ入っていなかったので入れます。
使えるコマンド一覧は for x in ${PATH//:/ }; do ls -1 $x; done | sort | uniq を使うと見れます。

nodeはある
gccはないがnodeは元から入っている

色々考えていたのですが、なんと apt install gcc でriscv native binaryが入りました。

gccが入る様子
gccがaptで入る!

Hello Worldしてみます。

Hello World
hello RISC-V!

objdump -d してみると、確かにRISC-VのISA感があります。

objdump -d
objdumpした様子

その他

スペック: ちゃんとメモリ8GBのようです。プロセッサは4つ。

root@starfive:~/workspaces# free -h
               total        used        free      shared  buff/cache   available
Mem:           7.7Gi       515Mi       7.0Gi        11Mi       273Mi       7.2Gi
Swap:             0B          0B          0B
root@starfive:~/workspaces# cat /proc/cpuinfo
processor	: 0
hart		: 1
isa		: rv64imafdc
mmu		: sv39
uarch		: sifive,u74-mc

processor	: 1
hart		: 2
isa		: rv64imafdc
mmu		: sv39
uarch		: sifive,u74-mc

processor	: 2
hart		: 3
isa		: rv64imafdc
mmu		: sv39
uarch		: sifive,u74-mc

processor	: 3
hart		: 4
isa		: rv64imafdc
mmu		: sv39
uarch		: sifive,u74-mc

今後やってみたいこと

実現可能性は置いておきます。

  • Cコンパイラが入ったので、自作CコンパイラをRISC-Vボードの上で書くという縛りで書く
    • vi はあるのでコードが書ける
  • node が入っているのでWebサーバを動かす
  • rust が書きたいので rustupcargorustc がVisionFive 2上で動かないか試す
    • メモリは8GBある
  • 4Kモニタ対応
    • せっかくGUIがあるなら使いたい
  • M.2にSSDを挿して使いたい
    • Compatibility testにM.2のテストがなくて悲しい
    • microSDカードは容量が少なく、安定でなく、遅いと思う
  • CIマシンにしたい
    • GitHub self-hosted runnerを動かしたいが、RISC-V対応していないのでそのままでは動かない & C#でできているので困難が予想される

Discussion