Hands-on experience with StarFive VisionFive 2 RISC-V SBC using Debian 12

StarFive sent me one of their VisionFive 2 RISC-V SBC for evaluation and review. I got the model with dual Gigabit Ethernet and 8GB RAM, and I’ll report my experience with the Debian 12 “bookworm” image. But note that won’t exactly be a review since the board is unreviewable at this time. It’s really for early adopters and there are many issues to solve, and in this post, I’ll report what works and what doesn’t, and some of the challenges I encountered just to install the OS…

VisionFive 2 unboxing

The board comes in a package that reads “Embrace change, embrace the future”.

StarFive VisionFive 2 SBC package

The bottom side has some useful links and QR codes, and what you’ll want is the GitHub repository with the source code and instructions to build the image from source (Note: Ubuntu 16.04, 18.04, or 20.04 x86_64 recommended), as well as the RVspace forum section for the board where we’ll find instructions to get started and feedback from other users.

VisionFive 2 community GitHub

The board layout and components look exactly the same as when launched on Kickstarter, except my board is VisionFive 2 V1.3B.

StarFive JH7110 RISC-V SBC
We’ve got the StarFive JH7110 quad-core RISC-V processor in the center, BIWIN BWMZCX32H2A-64G 8GB RAM chip, a VL805 PCIe to USB 3.0 bridge like in the Raspberry Pi 4, two MotorComm YT8531C Gigabit Ethernet transceivers, and an AXP15060 PMIC. All main ports are on one side with a 3.5mm audio jack, four USB 3.0 ports, HDMI 2.0 output, and two Gigabit Ethernet ports.

StarFive VisionFive 2 eMMC flash module M.2 socket

The bottom side comes with a MicroSD card socket which we’ll use to boot the OS, connectors for an eMMC flash module, and an M.2 socket for an NVMe SSD.

Installing Debian 12 on VisionFive 2 SBC

Debian images are available on the StarFive website linking to either Baidu Drive or Google Drive. The latest image is currently Image-69 released at the end of December

The uncompressed image would not fit in my 8GB MicroSD card, so I flashed it to a 32GB MicroSD card which took close to 45 minutes to complete. I think it may be about to die, and I may have to buy yet another batch of cards. All this wasted time getting MicroSD cards that only last a few months is partially why I’ve always disliked boards that only boot with a MicroSD card

StarFive VisionFive 2 review

I then connected a USB keyboard, a USB mouse, an Ethernet cable, and a USB Type-C power adapter. I initially went with a 5V/2A, but that’s not a good idea, since it does not provide enough power and the board will continuously boot loop. A 5V/3A Raspberry Pi power adapter did not cut it either, so I went with a 100W GaN power adapter to make sure I had no power-related problem. Oh, and I added some spacer to elevate the board since this is recommended.

But then I noticed the board would not boot, and found the Image 69 announcement in the forums that explains:

Please update latest SPL 46 and U-Boot 44 binaries by following Guide: 4.3 charpter 77 before running this Debian image. this is very important.

Finding the proper documentation took a while, since it’s spread all over the place in Chinese and/or English, but the best place to go is the Document Publish Status page with documentation in English. It’s possible to log in through SSH, but considering the likelihood of having a boot issue, I’d really recommend connecting a serial debug board which is how I found out about the boot loop issue mentioned above.

VisionFive 2 Serial Console

Before installing Debian 12, we’ll need to update the SPL and U-boot bootloader on the VisionFive 2, and use the sdcard.img minimal Linux image as well. We’ll find those on GitHub, and I used the files part of VisionFive2 Software v2.8.0. The first step was to flash sdcard.img to a MicroSD card. This image fits into an 8GB card.

We can log in with the username “root” and the password “starfive”. Here’s the boot log for inquiring minds.

Let’s make sure we are connected to the network:

All good. We can now download the latest SPL and U-boot binaries from GitHub and transfer them to the board via SCP from your host machine:

Back in the VisionFive 2 terminal, we can check the partitions:

It looks good, so let’s update the SPL binary with flashcp utility:

and then U-boot:

Power off the VisionFive 2 board and replace the MicroSD card with the one with the Debian 12 image. I could boot the image “successfully”.

But the first boot did take over 3 minutes, so you may have to be patient:

Subsequent boots are faster at around 90 seconds.

Another issue is that the TV screen is black although my TV detects the HDMI cable is connected, and there’s some activity about HDMI in the serial console:

I moved to another location and tried with another display and it did not work at all. But that’s because my MicroSD card apparently failed:

I had to take a MicroSD card from my security camera to carry on and purchased five Class A1 MicroSD cards online for future reviews…

I could boot normally, but I had the same problem black HDMI screen issue. I think I know why:

There’s a segmentation fault… Other people had a similar issue with either a black screen with a mouse pointer or a black screen without a mouse pointer. We’re told that’s because 4K displays are not supported yet, and this can be worked around by forcing 1920×1080 in lightdm configuration (/etc/lightdm/lightdm.conf) adding the following line under [Seat:*]:

My displays are already 1920×1080 or 1280×800, and I did not work for me. So I posted an entry in the forum and you can follow the progress from there.

Anyway, in this part of the VisionFive 2 review, I’ll only test headless Linux, and I will probably write a second part once a new Debian image is released and I can access the graphical user interface.

VisionFive 2 system info

We can check out the system information with a few commands:

It seems everything is detected properly with the JH7110 quad-core CPU, 8GB RAM, 32GB SD card, and drivers for display, audio, and Ethernet.

VisionFive 2 features testing

We can’t test HDMI or other video or graphics-related features with this image since it’s not working with any of my monitors, but we can still check headless features.


GPIOs are showing up in sysfs :

Let’s try to toggle GPIO 44 (pin 40 on the GPIO header):

I could measure 3.27V with a multimeter with leads placed on pins 40 and 39. Let’s change the value to zero

My multimeter reports 0.00V. GPIO is a pass. You’ll find how to use I2C, SPI, PWM, and UART interfaces in the documentation.


Let’s carry on by testing the two Gigabit Ethernet ports with iperf3 installed with apt.

LAN1 (edge of board):

  • Upload:

  • Download:

  • Full-duplex (bidrectional):

Results are perfect in either direction, but lower than the max with full-duplex. Those are however similar results as on some Arm platforms such as Khadas VIM4 SBC.

LAN2 (Next to HDMI port):

  • Download:

  • Upload:


It’s pretty much the same as the other Ethernet port, and that’s a pass as well…

M.2 NVMe storage

I installed a 256GB Apacer M.2 2280 PCIe Gen3 x4 SSD (AS2280P4) in the M.2 socket on the bottom of the board, and it’s detected properly:

iozone3 is not available through apt, so I had to download it and build it from source:

There’s no RISC-V option in the Makefile, so I first tried to use “make linux”, but the build failed while linking. “make linux-arm” did complete, so we’ll use that…

The SSD is supposed to support up to 1,800 MB/s read speeds and 1,100 MB/s write speeds. So at 169MB/s and 158MB/s that does not cut it at all. I previously tested it at 1100 MB/s with ORICO Thunderbolt/USB enclosure connected to an Intel mini PC. Repeating the test on the VisionFive 2 yields the same low speeds.

Here’s the output for lscpi for reference:

It does not show the link speed, but if we check a more verbose output it shows:

That one would be a failure for now, since the performance is way too low.


Let shut down the board, remove the M.2 NVMe SSD, and put it into the ORICO enclosure mentioned above. Now let’s connect the USB SSD enclosure and boot the board again and

This is what the output of lsusb looks like with the USB enclosure, keyboard, and mouse:

Let’s now run iozone:

The numbers are strangely close to the ones when connected to the M.2 socket. 173MB/s writes and 152MB/s reads… That should be closer to 300 to 400MB/s on a USB 3.0 port at 5 Gbps. It’s also possible iozone3 requires some optimizations for RISC-V but I view this as unlikely.

Audio jack

While we can’t test HDMI audio right now, we can still try the 3.5mm audio jack by connecting a pair of speakers powered by one of the USB ports from the board. USB is only for power, and the audio comes from the 3.5mm jack.

VisionFive 2 speakers

I used the preinstalled ffplay to play some license-free MP3:

It works fine, but the audio was saturated at full volume. There was no such issue after lowering the speakers’ volume.

Let’s add some comments about the MicroSD card. The cards have used have poor random I/O performance, but I could use those with Raspberry Pi and other SBCs without much difficulty. But with the Debian 12 image used in VisionFive 2, just typing commands in the terminal can be really, even a simple “ls” in the root directory can take 10 seconds to complete.

I also have to wait around 5 to 10 minutes before I can go through the login prompt “starfive login: root” and start typing commands. Having a higher-performance MicroSD card or using an eMMC module would certainly help, but I’m pretty sure the Debian image also needs to be optimized in that regard.

SBC Bench benchmarks

I’m usually running sbc-bench.sh script to evaluate the performance of single board computers and mini PCs. RISC-V is a pretty new platform, so I did not much hope it would work smoothly, but I tried anyway.

The information view works well. There’s a lot of activity and I/Os here because a package is being installed in another terminal window.

But even during idle SBC bench will not start because of a high CPU load:

There are also two other warnings. The first one is that the script has not been tested on the yet-to-be-released Debian 12 “Bookworm”. The second is because dmesg output is truncated and not starting from 00:00. I’m not going to reboot, as it takes around 8 minutes for a complete boot cycle to the point after I log in and access the command prompt. Let’s disable CPU load average checking, and restart the script to see how far it can go:

The 7-zip package is not part of the Debian RISCV64 repository and it would have to be built from source to run on the VisionFive 2 board. So at this point in time, it’s not possible to run SBC Bench without skipping a few tests. Let’s revisit it in a few months.


StarFive VisionFive 2 should be viewed as a RISC-V development board at this stage, and it’s not suitable for integration into projects/products until further progress is made on the software side. Since since Linux RISC-V is still pretty new, especially from a video/graphics point of view, it should be expected. There are already features that work fine such as Gigabit Ethernet, GPIOs, the audio jack, and USB, but others like HDMI and storage performance still need a lot of work. System stability needs to be improved too since my SSH connection dropped a few times and I was unable to reconnect, nor did the serial console work, requiring a hard reboot. But I can see a decent amount of activity in the forums and the company is working on mainlining the Linux kernel.

I’d like to thank StarFive for sending the board. Developers who want to help with software and/or testing can purchase the VisionFive 2 SBC reviewed here for $70.40 plus shipping (and potentially taxes). The board is also offered on Amazon for $112 with WiFi.

Share this:

Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress

ROCK Pi 4C Plus
Notify of
The comment form collects your name, email and content to allow us keep track of the comments placed on the website. Please read and accept our website Terms and Privacy Policy to post a comment.
1 year ago

Good article. 🙂
I would welcome more of these.

1 year ago

Did you try the Image-55 (instead of Image-69)? Maybe it’s easier to install?

1 year ago

I tried the 55 image. Nothing works: Tried to compile my own C++ software that compiles fine on (Raspberry/Jetson) it can’t find the deps. Tried to download the risc-V JDK to test my other MMO client, the download locks the core so the kernel warns a core is stuck. This is a dud. And I could say “so far” but I have enough experience with these things that unless Imagination releases EVERYTHING so we can make our own OS legally on this thing it probably won’t reach stable/usable state and since the CPU is NOT more performant than Raspberry 4… Read more »

1 year ago

How does the output from cat /sys/module/pcie_aspm/parameters/policy look like right now?

And wrt sbc-bench: there’s a new -r (review) switch with v0.9.18 that tries to collect performance relevant settings and then tunes them to max performance to rule out the usual ‘issues’ when dealing with a new board like all those settings being set to whatever since so far nobody took care of them.

1 year ago

Ah, just realized that you’ve put ‘lspci -vv’ output also online. For each PCIe device it reads ‘ASPM Disabled’ so at least power management is not the culprit of slow NVMe speeds. And it also explains partially the high idle consumption (see RPi 4B in the beginning and after VL805 firmware update).

And since everything USB3 here is PCie attached as long as the PCIe bottleneck hasn’t been found/fixed, USB3 performance will always be low(er).

1 year ago

> The 7-zip package is not part of the Debian RISCV64 repository

That’s a bit surprising since I have several JH7110 sbc-bench results collected and all of them contain 7-ZIP MIPS while none of the submitters reported any trouble installing stuff. The numbers at 1.5 GHz look all the same like the ‘StarFive VisionFive V2’ entry in results collection.

1 year ago

> The [USB3] numbers are strangely close to the ones when connected to the M.2 socket.

AFAIK JH7110 features two PCIe lanes of which one is pinmuxed with ‘native USB3’. But this board seems to use a PCIe attached VIA VL805 USB3 host controller (same thing as on RPi 4B) and according to dmesg your USB peripherals are behind this controller.

As such in case crappy settings are defined (‘pcie_aspm = [super]powersave’ for example) USB storage inherits them to just add another layer of overhead and performance loss to it.