StarFive has sent me a sample of the VisionFive 2 Lite RISC-V SBC for review. It’s a low-cost credit card-sized board based on the StarFive JH7110S quad-core RISC-V SBC and designed to get started with Linux RISC-V on the cheap.
When I first tested the earlier VisionFive 2 SBC with a StarFive JH7110 RISC-V SoC in February 2023, I didn’t call it a review, but rather a hands-on experience, since, at the time, many features still didn’t work properly. Almost three years have passed since then, so reviewing the VisionFive 2 Lite SBC with Ubuntu 24.04 will allow us to see how much progress has been made on the software side. If you are in a rush, you can jump to the what works, what doesn’t section.
VisionFive 2 Lite unboxing
I received the board in a plastic box with a cover reading “VisionFive 2 Lite Your Gateway to RISC-V”.
The bottom side has important information with links to the documentation, GitHub account, and the RVspace website for more details and a support forum.
We’ll just find the board itself and an IPEX antenna in the plastic case that the VisionFive 2 Lite is shipped.
On the top side of the board, we have the StarFive JH7110S SoC, a 4GB BIWIN BWMZAX32H2A-32Gb-X memory chip, an LB-LINK BL-M8800DS2-40 dual-band WiFi 6 and Bluetooth 5.2 module (based on AIC8800), the MIPI DSI and CSI connectors, a PoE header, and a 40-pin Raspberry Pi-compatible GPIO header.
On the bottom side, we’ll find an M.2 PCIe Gen2 x1 socket for storage or AI expansion, a microSD card slot to boot the OS, and an AXP15060 PMIC.
We can get a clear view of the port at an angle. Front left to right: a USB-C port for power, an HDMI port, a Gigabit Ethernet port, a Reset button, and four USB ports (3x USB 2.0, 1x USB 3.0).

I found the antenna harder to install than expected, but eventually managed. I had to use the tip of a pencil rather than its eraser to insert the antenna into the IPEX connector on the board.
Ubuntu 24.04 installation on the VisionFive 2 Lite
We’ll need some accessories to get started, namely a microSD card, a power supply, a wireless keyboard/mouse combo, an HDMI monitor, and an optional, but recommended Ethernet cable.
You’ll find the latest version of Ubuntu 24.04 for VisionFive 2 boards on GitHub. I downloaded ubuntu-24.04.3-preinstalled-desktop-riscv64+vf2-lite.img.bz2, released on October 16, 2025 (the latest at the time of the review), and flashed the bz2 file with the latest version of the USBImager program to a 64GB Raspberry Pi-brand Class A2 microSD card connected to an Ubuntu laptop.
Once done, we can insert the microSD card into the board, connect all peripherals, and boot it up. After a while, I was able to log in to the system using the default username (user) and password (starfive). That’s a massive progress compared to about 3 years ago, when I didn’t even get video output, albeit with a different display…
If interested, you’ll find the full kernel log for the first boot. It took around one minute, and more specifically, around 50 seconds, until the Ethernet link was up, based on the kernel log.
Don’t run apt dist-upgrade to upgrade
At this point, I thought it would be a good idea to upgrade all packages since the image was released in October:
|
1 2 |
sudo apt update sudo apt dist-upgrade |
This updated 207 packages. Everything still worked fine, and I could run a few tests normally. That is, until I rebooted. The system became barely responsive, and I noticed 100% usage on one core from the gnome-shell process.
Before the reboot, I could run glmark2-es2-wayland with Imagination GPU drivers:
|
1 2 3 4 5 6 7 8 9 10 11 |
user@starfive:~$ glmark2-es2-wayland ======================================================= glmark2 2021.12 ======================================================= OpenGL Information GL_VENDOR: Imagination Technologies GL_RENDERER: PowerVR B-Series BXE-4-32 GL_VERSION: OpenGL ES 3.2 build 1.19@6345021 Surface Config: buf=32 r=8 g=8 b=8 a=8 depth=24 stencil=8 Surface Size: 800x600 windowed ======================================================= |
But after, I would only run using software rendering:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
user@starfive:~$ glmark2-es2-wayland libEGL warning: egl: failed to create dri2 screen warning: queue 0x2ac6578e30 destroyed while proxies still attached: wl_display@1 still attached ======================================================= glmark2 2021.12 ======================================================= OpenGL Information GL_VENDOR: Mesa/X.org GL_RENDERER: softpipe GL_VERSION: OpenGL ES 3.1 Mesa 22.3.6 (git-63aa0a4aa3) Surface Config: buf=32 r=8 g=8 b=8 a=8 depth=32 stencil=0 Surface Size: 800x600 windowed ======================================================= |
I noticed a few errors in the kernel log about the GPU failing to load the firmware:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
user@starfive:~$ dmesg | grep -i DRM [ 4.787094] [drm:pvr_drm_load] *ERROR* device 0000000062e502f8 initialisation failed (err=-19) [ 6.724804] starfive_jadard 2-0019: [drm:panel_probe] *ERROR* failed to get our reset GPIO [ 7.114372] innohdmi-starfive 29590000.hdmi: [drm:inno_hdmi_bind] registered Inno HDMI I2C bus driver success [ 7.167162] [drm] Initialized starfive 1.0.0 for display-subsystem on minor 0 [ 7.344693] starfive display-subsystem: [drm] fb0: starfivedrmfb frame buffer device [ 15.381463] systemd[1]: Starting modprobe@drm.service - Load Kernel Module drm... user@starfive:~$ dmesg | grep -i gpu [ 4.712229] pvrsrvkm 18000000.gpu: Direct firmware load for rgx.fw.36.50.54.182 failed with error -2 [ 4.722474] pvrsrvkm 18000000.gpu: Direct firmware load for rgx.fw.36.50p.54.182 failed with error -2 [ 4.732765] pvrsrvkm 18000000.gpu: Direct firmware load for rgx.fw failed with error -2 user@starfive:~$ dmesg | grep -i pvr [ 4.687871] PVR_K: 1: Read BVNC 36.50.54.182 from HW device registers [ 4.695182] PVR_K: 1: RGX Device registered BVNC 36.50.54.182 with 1 core in the system [ 4.712229] pvrsrvkm 18000000.gpu: Direct firmware load for rgx.fw.36.50.54.182 failed with error -2 [ 4.722474] pvrsrvkm 18000000.gpu: Direct firmware load for rgx.fw.36.50p.54.182 failed with error -2 [ 4.732765] pvrsrvkm 18000000.gpu: Direct firmware load for rgx.fw failed with error -2 [ 4.741652] PVR_K:(Fatal): 1: All RGX Firmware image loads failed for 'rgx.fw.36.50.54.182' (PVRSRV_ERROR_NOT_FOUND) [1729] [ 4.754348] PVR_K:(Error): 1: RGXInit: InitFirmware failed (278) [1542] [ 4.762025] PVR_K:(Error): 1: RGXInit() failed (PVRSRV_ERROR_NOT_FOUND) in PVRSRVCommonDeviceInitialise() [2177] [ 4.773648] PVR_K:(Error): 1: PVRSRVDeviceFinalise() failed (PVRSRV_ERROR_NOT_INITIALISED) in PVRSRVCommonDeviceInitialise() [2191] [ 4.787094] [drm:pvr_drm_load] *ERROR* device 0000000062e502f8 initialisation failed (err=-19) |
I tried to revert the changes, but then I noticed apt failing to update the boot partition since it ran out of space:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
W: mkconf: MD subsystem is not loaded, thus I cannot scan for arrays. W: mdadm: failed to auto-generate temporary mdadm.conf file. zstd: error 70 : Write error : cannot write block : No space left on device E: mkinitramfs failure cpio 141 E: mkinitramfs failure zstd -q -1 -T0 70 update-initramfs: failed for /boot/initrd.img-6.12.5-starfive with 1. dpkg: error processing package initramfs-tools (--configure): installed initramfs-tools package post-installation script subprocess returned error exit status 1 Errors were encountered while processing: initramfs-tools needrestart is being skipped since dpkg has failed E: Sub-process /usr/bin/dpkg returned an error code (1) |
So I gave up and flashed the image another time. I could still install programs safely with apt, but planned to avoid system updates until PowerVR support is upstreamed (work-in-progress).
That’s until I got an answer from StarFive, which explained updates are possible with the following commands:
|
1 2 3 |
sudo apt update -y sudo apt upgrade -y --allow-downgrades sudo dpkg-reconfigure linux-image-6.12.5-starfive |
I eventually tried that, and it didn’t mess up my system this time around.
Ubuntu 24.04 System Information
Let’s check the system information. The name of the processor is blank, and the disk capacity is marked as unknown, but at least we’re shown 3.8 GiB of memory.
Going to System Details, we can also see the PowerVR B-Series BXE-4-32 GPU, and that the board is running Ubuntu 24.04.3 LTS 64-bit with Wayland and a relatively recent Linux 6.12 kernel (patched by StarFive).
Let’s run inxi to get a few more details:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
user@starfive:~$ sudo inxi -Fc0 System: Host: starfive Kernel: 6.12.5-starfive arch: riscv64 bits: 64 Console: pty pts/2 Distro: Ubuntu 24.04.3 LTS (Noble Numbat) Machine: Type: RISCV System: StarFive VisionFive 2 Lite details: N/A serial: VF7110SL-2539-D004E000-39000235 CPU: Info: quad core model: N/A variant-1: u74-mc variant-2: s7 bits: 64 type: MCP cache: L2: 2 MiB Speed (MHz): avg: 1250 min/max: 312/1250 cores: 1: 1250 2: 1250 3: 1250 4: 1250 Graphics: Device-1: img-gpu driver: pvrsrvkm v: kernel Device-2: jh7110-hdmi driver: innohdmi_starfive v: N/A Device-3: jh7110-display driver: starfive v: N/A Display: server: X.org v: 1.21.1.11 with: Xwayland v: 23.2.6 driver: N/A tty: 211x50 resolution: 1920x1080 API: EGL v: 1.4,1.5 drivers: pvr,swrast platforms: gbm,surfaceless,device API: OpenGL v: 3.3 note: console (EGL sourced) renderer: softpipe Audio: Device-1: jh7110-hdmi driver: innohdmi_starfive Device-2: simple-audio-card driver: asoc_simple_card Device-3: jh7110-pwmdac driver: N/A API: ALSA v: k6.12.5-starfive status: kernel-api Network: Device-1: jh7110-dwmac driver: starfive_dwmac IF: eth0 state: up speed: 1000 Mbps duplex: full mac: 6c:cf:39:00:88:94 Device-2: dwmac-5.20 driver: N/A IF: eth0 state: up speed: 1000 Mbps duplex: full mac: 6c:cf:39:00:88:94 IF-ID-1: docker0 state: down mac: 02:42:07:3e:32:e9 IF-ID-2: dummy0 state: down mac: de:bf:e4:76:16:1b IF-ID-3: ip_vti0 state: down mac: 00:00:00:00 IF-ID-4: sit0 state: down mac: 00:00:00:00 IF-ID-5: wlan0 state: dormant mac: a8:b5:8e:77:da:d7 Bluetooth: Device-1: jh7110-uart driver: dw_apb_uart Report: hciconfig ID: hci0 state: up address: A8:B5:8E:77:DA:D8 bt-v: 5.4 Drives: Local Storage: total: 58.94 GiB used: 4.78 GiB (8.1%) ID-1: /dev/mmcblk0 model: USD00 size: 58.94 GiB type: Removable Partition: ID-1: / size: 52.01 GiB used: 4.74 GiB (9.1%) fs: ext4 dev: /dev/mmcblk0p4 ID-2: /boot size: 98.4 MiB used: 40.8 MiB (41.5%) fs: vfat dev: /dev/mmcblk0p3 Swap: Alert: No swap data was found. Sensors: System Temperatures: cpu: 67.5 C mobo: N/A Fan Speeds (rpm): N/A Info: Memory: total: 4 GiB available: 3.77 GiB used: 1.7 GiB (44.9%) Processes: 253 Uptime: 2h 51m Init: systemd target: graphical (5) Shell: Sudo inxi: 3.3.34 |
The processor features four SiFive U74-MC cores clocked at up to 1.25 GHz, display and audio drivers, Gigabit Ethernet (not sure why two), WiFi, and Bluetooth, as well as a 58.94 GB drive, and 4 GiB of memory. The CPU temperature is 67.5°C. Note that I won’t use a cooling solution like a heatsink or a fan, since it’s not really needed.
VisionFive 2 Lite Benchmarks
sbc-bench.sh would not run properly on the VisionFive 2 in 2023 due to missing packages and other issues. Let’s try it with the VisionFive 2 Lite:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
user@starfive:~$ sudo ./sbc-bench.sh -r Starting to examine hardware/software for review purposes... Average load and/or CPU utilization too high (too much background activity). Waiting... Too busy for benchmarking: 08:11:32 up 43 min, 3 users, load average: 0.40, 1.31, 1.40, cpu: 0% Too busy for benchmarking: 08:11:37 up 43 min, 3 users, load average: 0.37, 1.29, 1.39, cpu: 1% sbc-bench v0.9.72 Installing needed tools: distro packages already installed, tinymembench, ramlat, mhz, cpufetch (can't build cpuminer) Done. Checking cpufreq OPP. Done. Executing tinymembench. Done. Executing RAM latency tester. Done. Executing OpenSSL benchmark. Done. Executing 7-zip benchmark. Done. Throttling test: heating up the device, 5 more minutes to wait. Done. Checking cpufreq OPP again. Done (17 minutes elapsed). Results validation: * Measured clockspeed not lower than advertised max CPU clockspeed * Background activity (%system) OK * Too much other background activity: 1% avg, 10% max -> https://tinyurl.com/mr2wy5uv * No throttling # StarFive VisionFive 2 Lite Tested with sbc-bench v0.9.72 on Sat, 20 Dec 2025 08:30:50 +0000. ### General information: Information courtesy of cpufetch: SoC: StarFive VisionFive 2 Technology: 28nm Microarchitecture: U74 Cores: 4 cores Max Frequency: 1.250 GHz Extensions: rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd_zba_zbb - (I) Integer Instruction Set - (M) Integer Multiplication and Division - (A) Atomic Instructions - (F) Single-Precision Floating-Point - (D) Double-Precision Floating-Point - (C) Compressed Instructions - (Zbb) Basic bit-manipulation - (Zba) Address Generation - (Zicntr) Base Counters and Timers - (Zicsr) Control and Status Register - (Zifencei) Instruction-Fetch Fence - (Zihpm) Hardware Performance Counters - (Zca) Compressed Integer Instructions - (Zcd) Compressed Double-Precision FP Instructions StarFive JH7110, Kernel: riscv64, Userland: riscv64 CPU sysfs topology (clusters, cpufreq members, clockspeeds) cpufreq min max CPU cluster policy speed speed core type 0 0 0 312 1250 sifive,u74-mc 1 0 0 312 1250 sifive,u74-mc 2 0 0 312 1250 sifive,u74-mc 3 0 0 312 1250 sifive,u74-mc 3864 KB available RAM ### Governors/policies (performance vs. idle consumption): Original governor settings: cpufreq-policy0: performance / 1250 MHz (conservative ondemand userspace powersave performance schedutil / 312 417 625 1250) Tuned governor settings: cpufreq-policy0: performance / 1250 MHz ### Clockspeeds (idle vs. heated up): Before at 66.8°C: cpu0 (sifive,u74-mc): OPP: 1250, Measured: 1247 After at 78.3°C: cpu0 (sifive,u74-mc): OPP: 1250, Measured: 1247 ### Performance baseline * memcpy: 773.7 MB/s, memchr: 1157.8 MB/s, memset: 852.4 MB/s * 16M latency: 181.1 304.3 178.8 306.9 179.1 299.6 547.0 1042 * 128M latency: 187.3 310.5 187.1 310.9 189.5 309.2 568.5 1054 * 7-zip MIPS (3 consecutive runs): 3296, 3294, 3284 (3290 avg), single-threaded: 946 * `aes-256-cbc 15346.42k 18519.72k 19547.99k 19839.66k 19917.48k 19928.41k` * `aes-256-cbc 15424.21k 18579.35k 19606.19k 19881.98k 19969.37k 19961.17k` ### Storage devices: * 58.9GB "Longsys USD00" HS SDXC card as /dev/mmcblk0: date 08/2024, manfid/oemid: 0x0000ad/0x4c53, hw/fw rev: 0x2/0x1 * Gigadevice GD25LQ128D SPI NOR flash (3 partitions: spl: 960KB, uboot-env: 64KB, uboot: 15360KB), drivers in use: spi-nor/cadence-qspi/simple-pm-bus ### Software versions: * Ubuntu 24.04.3 LTS (noble) * Compiler: /usr/bin/gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0 / riscv64-linux-gnu * OpenSSL 3.0.13, built on 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024) ### Kernel info: * `/proc/cmdline: root=/dev/mmcblk0p4 rw console=tty0 console=ttyS0,115200 earlycon rootwait stmmaceth=chain_mode:1 selinux=0` * Kernel 6.12.5-starfive / CONFIG_HZ=100 All known settings adjusted for performance. Device now ready for benchmarking. Once finished stop with [ctrl]-[c] to get info about throttling, frequency cap and too high background activity all potentially invalidating benchmark scores. All changes with storage and PCIe devices as well as suspicious dmesg contents will be reported too. Time CPU load %cpu %sys %usr %nice %io %irq Temp 08:30:55: 1250MHz 3.39 39% 3% 33% 0% 1% 0% 75.3°C 08:31:55: 1250MHz 1.31 0% 0% 0% 0% 0% 0% 72.0°C 08:32:56: 1250MHz 0.48 0% 0% 0% 0% 0% 0% 70.7°C 08:33:56: 1250MHz 0.17 0% 0% 0% 0% 0% 0% 69.8°C 08:34:56: 1250MHz 0.06 0% 0% 0% 0% 0% 0% 69.2°C 08:35:56: 1250MHz 0.13 0% 0% 0% 0% 0% 0% 68.9°C 08:36:56: 1250MHz 0.05 0% 0% 0% 0% 0% 0% 68.6°C 08:37:56: 1250MHz 0.02 0% 0% 0% 0% 0% 0% 68.3°C 08:38:56: 1250MHz 0.12 0% 0% 0% 0% 0% 0% 68.1°C 08:39:57: 1250MHz 0.04 0% 0% 0% 0% 0% 0% 67.9°C 08:40:57: 1250MHz 0.12 0% 0% 0% 0% 0% 0% 67.8°C 08:41:57: 1250MHz 0.04 0% 0% 0% 0% 0% 0% 67.6°C 08:42:57: 1250MHz 0.05 0% 0% 0% 0% 0% 0% 67.6°C 08:43:57: 1250MHz 0.02 0% 0% 0% 0% 0% 0% 67.5°C ^C Cleaning up. Done. Checking cpufreq OPP again. Done. Clockspeeds now at 68.0°C: cpu0 (sifive,u74-mc): OPP: 1250, Measured: 1247 ATTENTION: some noise in kernel ring buffer since start of monitoring: [ 3997.900925] loop0: detected capacity change from 0 to 8 [ 4297.875382] loop0: detected capacity change from 0 to 8 Results validation: * Measured clockspeed not lower than advertised max CPU clockspeed * Background activity (%system) OK * No throttling |
I’ve uploaded the full log for people wanting more details. The maximum CPU temperature was 78.2°C during stress-ng, and the VisionFive 2 Lite did not throttle during the test despite lacking a heatsink for cooling.
Performance-wise, it’s much slower than a Raspberry Pi 4 or 5, and most recent Arm single board computers, but this was expected. For reference, a 7-zip score of 3,290 MIPS corresponds roughly to the performance of a Raspberry Pi 3B+.
Let’s test GPU acceleration with glmark2-es2-wayland.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
user@starfive:~$ glmark2-es2-wayland ======================================================= glmark2 2021.12 ======================================================= OpenGL Information GL_VENDOR: Imagination Technologies GL_RENDERER: PowerVR B-Series BXE-4-32 GL_VERSION: OpenGL ES 3.2 build 1.19@6345021 Surface Config: buf=32 r=8 g=8 b=8 a=8 depth=24 stencil=8 Surface Size: 800x600 windowed ======================================================= [build] use-vbo=false: FPS: 138 FrameTime: 7.246 ms [build] use-vbo=true: FPS: 417 FrameTime: 2.398 ms [texture] texture-filter=nearest: FPS: 608 FrameTime: 1.645 ms [texture] texture-filter=linear: FPS: 528 FrameTime: 1.894 ms [texture] texture-filter=mipmap: FPS: 428 FrameTime: 2.336 ms [shading] shading=gouraud: FPS: 358 FrameTime: 2.793 ms [shading] shading=blinn-phong-inf: FPS: 341 FrameTime: 2.933 ms [shading] shading=phong: FPS: 299 FrameTime: 3.344 ms [shading] shading=cel: FPS: 272 FrameTime: 3.676 ms [bump] bump-render=high-poly: FPS: 232 FrameTime: 4.310 ms [bump] bump-render=normals: FPS: 495 FrameTime: 2.020 ms [bump] bump-render=height: FPS: 500 FrameTime: 2.000 ms [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 246 FrameTime: 4.065 ms [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 81 FrameTime: 12.346 ms [pulsar] light=false:quads=5:texture=false: FPS: 693 FrameTime: 1.443 ms [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 102 FrameTime: 9.804 ms [desktop] effect=shadow:windows=4: FPS: 285 FrameTime: 3.509 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 50 FrameTime: 20.000 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 86 FrameTime: 11.628 ms [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 122 FrameTime: 8.197 ms [ideas] speed=duration: FPS: 229 FrameTime: 4.367 ms [jellyfish] <default>: FPS: 188 FrameTime: 5.319 ms [terrain] <default>: FPS: 15 FrameTime: 66.667 ms [shadow] <default>: FPS: 222 FrameTime: 4.505 ms [refract] <default>: FPS: 36 FrameTime: 27.778 ms [conditionals] fragment-steps=0:vertex-steps=0: FPS: 558 FrameTime: 1.792 ms [conditionals] fragment-steps=5:vertex-steps=0: FPS: 272 FrameTime: 3.676 ms [conditionals] fragment-steps=0:vertex-steps=5: FPS: 546 FrameTime: 1.832 ms [function] fragment-complexity=low:fragment-steps=5: FPS: 343 FrameTime: 2.915 ms [function] fragment-complexity=medium:fragment-steps=5: FPS: 140 FrameTime: 7.143 ms [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 611 FrameTime: 1.637 ms [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 624 FrameTime: 1.603 ms [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 568 FrameTime: 1.761 ms ======================================================= glmark2 Score: 322 ======================================================= warning: queue 0x2ad4a16650 destroyed while proxies still attached: wl_display@1 still attached |
So the good news is that GPU acceleration is enabled, even though a score of 322 is rather low. For reference, a Raspberry Pi 5 gets 2036 points in the same benchmark, and an ODROID-M1S SBC based on a Rockchip RK3566 SoC achieved 496 points. Note that the performance can vary a lot depending on the GPU driver used.
We’ll now use Speedometer 2.0 to check the performance in Firefox…
3.56 runs per minute is rather low, and the ODROID-M1S and Raspberry Pi 4 can render the same benchmark at 11 runs per minute.
Finally, I tested the GPU support inside Firefox using the WebGL Aquarium demo.

10 FPS rendering with 500 fish is not super fast, but I could confirm that the “WebRender” used the “Imagination Technologies – PowerVR B-Series BXE-4-32” WebGL Driver to render the scene. So 3D graphics acceleration is also working in Firefox. The performance is not amazing, but I remember it took a long while before this became supported on Arm hardware, so it’s nice to see it working on RISC-V too.
Storage and USB performance
Let’s start the storage performance test, by running iozone3 on the MicroSD card with the OS:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
user@starfive:~$ iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 Iozone: Performance Test of File I/O Version $Revision: 3.506 $ Compiled for 64 bit mode. Build: linux random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 3999 4862 10069 10078 10054 6050 102400 16 7799 8476 15584 15482 14463 13286 102400 512 19881 20206 22451 22510 22487 21628 102400 1024 21352 21408 22724 22795 22797 22381 102400 16384 21719 21781 23039 23070 23096 21696 |
That’s about 23 MB/s reads and 21MB/s writes, with good random I/Os thanks to the Class A2 rating. However, we should note that the 64GB Raspberry Pi micro SD card is almost four times slower than when connected to a more powerful Raspberry Pi 5 SBC. Here are the Pi 5 results for reference:
|
1 2 3 4 5 6 7 8 |
pi@raspberrypi:~ $ iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 11110 11181 26694 26663 26655 15862 102400 16 19897 20268 48230 49161 49074 41893 102400 512 58357 59906 87240 87158 86930 73375 102400 1024 69445 72518 90424 90334 90458 79276 102400 16384 72909 74490 91769 91510 91656 74538 |
I then connected a 128GB MAKERDISK NVMe SSD to the board’s M.2 PCIe socket.
Once we are up again, we can test the drive:
|
1 2 3 4 5 6 7 8 9 10 |
user@starfive:/media/nvme0n1p2$ sudo iozone -e -I -a -s 1000M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 1024000 4 28892 74286 72664 73054 28656 52898 1024000 16 105102 132987 118840 120213 78550 113193 1024000 512 277922 279135 146638 147432 146339 149333 1024000 1024 143225 150840 148497 147818 147194 150713 1024000 16384 109002 109199 103330 103374 103376 109167 iozone test complete. |
It’s rather slow, and I can reproduce the results when running the test a second time. The best performance is achieved when using a 1024k record length, where the read speed is about 147 MB/s, and the write speed is around 143 MB/s. That’s quite unusual since 16M usually performs best. For some reason, the results vary a lot if I change the test file size from 1GB to 100MB:
|
1 2 3 4 5 6 7 8 9 10 |
user@starfive:/media/nvme0n1p2$ sudo iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 13536 46454 50012 74952 37583 74094 102400 16 85941 115844 120829 121238 79590 115552 102400 512 254337 299081 284235 284877 280688 296263 102400 1024 291424 301067 295593 297670 288366 299124 102400 16384 183538 187377 172318 172556 169241 108812 iozone test complete. |
Again, I can reproduce this result when running the test a second time. I suppose some caching is involved here, even though we used the direct I/Os option on the command line. The reported performance is now 295 MB/s for reads, and 291MB/s for writes. That’s still not optional for a PCIe Gen2 x1 socket, since it should be able to achieve above 400 MB/s transfer rates. For reference, I got 434 MB/s read speed and 395 MB/s write speed with this exact SSD when connected to a Raspberry Pi 5 in PCIe Gen2 mode.
I also tested the USB 3.0 (5 Gbps) port with an ORICO enclosure using an NVMe drive, and the USB 2.0 ports with a USB 3.0 hard drive, both using EXT-4 partitions. lsusb and iozone were used to confirm the advertised speed and actual throughput.
Here’s the output for the USB 3.0 port for reference:
|
1 2 3 4 5 6 7 8 9 10 11 |
user@starfive:/media/user/TB3-EXT4$ lsusb -t | grep uas |__ Port 001: Dev 002, If 0, Class=Mass Storage, Driver=uas, 5000M user@starfive:/media/user/TB3-EXT4$ sudo iozone -e -I -a -s 1000M -r 16384k -i 0 -i 1 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 1024000 16384 149120 136217 103076 103053 user@starfive:/media/user/TB3-EXT4$ sudo iozone -e -I -a -s 1000M -r 16384k -i 0 -i 1 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 1024000 16384 141237 144372 103091 103135 |
And the USB 2.0 port just above it:
|
1 2 3 4 5 6 |
user@starfive:/media/user/USB3-2TB$ lsusb -t | grep storage |__ Port 003: Dev 004, If 0, Class=Mass Storage, Driver=usb-storage, 480M user@starfive:/media/user/USB3-2TB$ sudo iozone -e -I -a -s 100M -r 16384k -i 0 -i 1 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 16384 39527 39141 39377 39363 |
Summary for all four USB ports:
- USB 3.0 port – 5 Gbps – Read speed: 103 MB/s; write speed: 149 MB/s (first try) / 141 MB/s (second try)
- USB 2.0 (above USB 3.0) – 480 Mbps – Read speed: 39 MB/s; write speed: 39MB/s
- USB 2.0 (top right) – 480 Mbps – Read speed: 38 MB/s; write speed: 36MB/s
- USB 2.0 (bottom right) – 480 Mbps – Read speed: 39 MB/s; write speed: 39MB/s
The USB 3.0 port does not perform quite as well as expected, since a 5 Gbps USB 3.0 port should deliver a throughput of around 400 MB/s with this drive. That’s why I repeated the test twice. The USB 2.0 ports work about as expected, although UAS is not enabled.
Gigabit Ethernet, WiFi, and Bluetooth
Time to test Ethernet and WiFi using iperf3. I’ll start with the Gigabit Ethernet port:
- Download
1234567891011121314iperf3 -c 192.168.1.10 -t 60 -i 10Connecting to host 192.168.1.10, port 5201[ 5] local 192.168.1.6 port 52636 connected to 192.168.1.10 port 5201[ ID] Interval Transfer Bitrate Retr Cwnd[ 5] 0.00-10.01 sec 1.04 GBytes 893 Mbits/sec 27 744 KBytes[ 5] 10.01-20.01 sec 1.10 GBytes 941 Mbits/sec 3 542 KBytes[ 5] 20.01-30.01 sec 1.10 GBytes 941 Mbits/sec 0 816 KBytes[ 5] 30.01-40.01 sec 1.10 GBytes 941 Mbits/sec 0 1.10 MBytes[ 5] 40.01-50.01 sec 1.10 GBytes 941 Mbits/sec 0 1.67 MBytes[ 5] 50.01-60.01 sec 1.10 GBytes 941 Mbits/sec 193 1005 KBytes- - - - - - - - - - - - - - - - - - - - - - - - -[ ID] Interval Transfer Bitrate Retr[ 5] 0.00-60.01 sec 6.52 GBytes 933 Mbits/sec 223 sender[ 5] 0.00-60.01 sec 6.52 GBytes 933 Mbits/sec receiver - Upload
123456789101112131415jaufranc@CNX-LAPTOP-5:~/edev/twentyseventeen-child$ iperf3 -c 192.168.1.10 -t 60 -i 10 -RConnecting to host 192.168.1.10, port 5201Reverse mode, remote host 192.168.1.10 is sending[ 5] local 192.168.1.6 port 33996 connected to 192.168.1.10 port 5201[ ID] Interval Transfer Bitrate[ 5] 0.00-10.01 sec 1.10 GBytes 941 Mbits/sec[ 5] 10.01-20.01 sec 1.10 GBytes 942 Mbits/sec[ 5] 20.01-30.01 sec 1.10 GBytes 941 Mbits/sec[ 5] 30.01-40.01 sec 1.10 GBytes 941 Mbits/sec[ 5] 40.01-50.01 sec 1.10 GBytes 941 Mbits/sec[ 5] 50.01-60.01 sec 1.10 GBytes 942 Mbits/sec- - - - - - - - - - - - - - - - - - - - - - - - -[ ID] Interval Transfer Bitrate Retr[ 5] 0.00-60.01 sec 6.58 GBytes 942 Mbits/sec 0 sender[ 5] 0.00-60.01 sec 6.58 GBytes 941 Mbits/sec receiver - Full-duplex (aka bi-directional)
1234567891011121314151617181920212223aufranc@CNX-LAPTOP-5:~/edev/twentyseventeen-child$ iperf3 -c 192.168.1.10 -t 60 -i 10 --bidirConnecting to host 192.168.1.10, port 5201[ 5] local 192.168.1.6 port 53804 connected to 192.168.1.10 port 5201[ 7] local 192.168.1.6 port 53806 connected to 192.168.1.10 port 5201[ ID][Role] Interval Transfer Bitrate Retr Cwnd[ 5][TX-C] 0.00-10.01 sec 1.06 GBytes 911 Mbits/sec 52 269 KBytes[ 7][RX-C] 0.00-10.01 sec 1.02 GBytes 876 Mbits/sec[ 5][TX-C] 10.01-20.01 sec 1.04 GBytes 893 Mbits/sec 45 260 KBytes[ 7][RX-C] 10.01-20.01 sec 1.04 GBytes 894 Mbits/sec[ 5][TX-C] 20.01-30.01 sec 1.05 GBytes 904 Mbits/sec 33 573 KBytes[ 7][RX-C] 20.01-30.01 sec 1.02 GBytes 878 Mbits/sec[ 5][TX-C] 30.01-40.01 sec 1.07 GBytes 921 Mbits/sec 18 447 KBytes[ 7][RX-C] 30.01-40.01 sec 1.01 GBytes 867 Mbits/sec[ 5][TX-C] 40.01-50.01 sec 1.07 GBytes 917 Mbits/sec 58 229 KBytes[ 7][RX-C] 40.01-50.01 sec 1.01 GBytes 866 Mbits/sec[ 5][TX-C] 50.01-60.01 sec 1.01 GBytes 867 Mbits/sec 34 397 KBytes[ 7][RX-C] 50.01-60.01 sec 1.02 GBytes 877 Mbits/sec- - - - - - - - - - - - - - - - - - - - - - - - -[ ID][Role] Interval Transfer Bitrate Retr[ 5][TX-C] 0.00-60.01 sec 6.30 GBytes 902 Mbits/sec 240 sender[ 5][TX-C] 0.00-60.01 sec 6.30 GBytes 902 Mbits/sec receiver[ 7][RX-C] 0.00-60.01 sec 6.13 GBytes 877 Mbits/sec 54 sender[ 7][RX-C] 0.00-60.01 sec 6.12 GBytes 876 Mbits/sec receiver
That’s about OK for normal use, although the first ten seconds are usually slower. I tested three times in both directions. I had low expectations for full-duplex, but it’s actually not that bad, and the VisionFive 2 Lite handles it pretty well for a low-end RISC-V platform.
I then connected the board to a Xiaomi Mi AX6000 WiFi 6 router using the 5 GHz SSID, and ran iperf3 again:
- Download
1234567891011121314151617user@starfive:~$ iperf3 -t 60 -c 192.168.31.12 -i 10 -RConnecting to host 192.168.31.12, port 5201Reverse mode, remote host 192.168.31.12 is sending[ 5] local 192.168.31.224 port 50220 connected to 192.168.31.12 port 5201[ ID] Interval Transfer Bitrate[ 5] 0.00-10.00 sec 11.8 MBytes 9.86 Mbits/sec[ 5] 10.00-20.00 sec 13.6 MBytes 11.4 Mbits/sec[ 5] 20.00-30.01 sec 13.6 MBytes 11.4 Mbits/sec[ 5] 30.01-40.01 sec 12.9 MBytes 10.8 Mbits/sec[ 5] 40.01-50.01 sec 13.6 MBytes 11.4 Mbits/sec[ 5] 50.01-60.01 sec 13.8 MBytes 11.5 Mbits/sec- - - - - - - - - - - - - - - - - - - - - - - - -[ ID] Interval Transfer Bitrate Retr[ 5] 0.00-60.07 sec 82.6 MBytes 11.5 Mbits/sec 25 sender[ 5] 0.00-60.01 sec 79.2 MBytes 11.1 Mbits/sec receiveriperf Done. - Upload
12345678910111213141516user@starfive:~$ iperf3 -t 60 -c 192.168.31.12 -i 10Connecting to host 192.168.31.12, port 5201[ 5] local 192.168.31.224 port 49620 connected to 192.168.31.12 port 5201[ ID] Interval Transfer Bitrate Retr Cwnd[ 5] 0.00-10.01 sec 20.8 MBytes 17.4 Mbits/sec 0 396 KBytes[ 5] 10.01-20.01 sec 19.5 MBytes 16.4 Mbits/sec 0 396 KBytes[ 5] 20.01-30.01 sec 19.5 MBytes 16.4 Mbits/sec 0 396 KBytes[ 5] 30.01-40.01 sec 19.5 MBytes 16.4 Mbits/sec 0 396 KBytes[ 5] 40.01-50.01 sec 19.4 MBytes 16.3 Mbits/sec 0 396 KBytes[ 5] 50.01-60.01 sec 19.0 MBytes 15.9 Mbits/sec 0 396 KBytes- - - - - - - - - - - - - - - - - - - - - - - - -[ ID] Interval Transfer Bitrate Retr[ 5] 0.00-60.01 sec 118 MBytes 16.4 Mbits/sec 0 sender[ 5] 0.00-60.09 sec 116 MBytes 16.2 Mbits/sec receiveriperf Done.
The download and upload speeds are rather poor. So I also checked the link speed:
|
1 2 3 4 5 6 7 8 9 10 11 |
user@starfive:~$ iwconfig wlan0 wlan0 no wireless extensions. user@starfive:~$ nmcli dev wifi IN-USE BSSID SSID MODE CHAN RATE SIG> 42:CD:57:F5:AF:92 -- Infra 1 270 Mbit/s 100> 3C:CD:57:F5:AF:92 CNX_Software_Xiaomi Infra 1 270 Mbit/s 100> 00:23:63:AB:12:F6 RC028667 Infra 11 130 Mbit/s 100> * 3C:CD:57:F5:AF:91 CNX_Software_Xiaomi_5G Infra 36 540 Mbit/s 100> F4:3C:3B:97:63:83 CONSUMERB27915 Infra 6 65 Mbit/s 82 > A6:D7:3C:37:41:CB DIRECT-3C-EPSON-37C1CB Infra 1 65 Mbit/s 79 > |
540 Mbps listed for CNX_Software_Xiaomi_5G. Let’s try to connect to the 2.4 GHz access point (270 Mbps) in case this improves things:
- Download
1234567891011121314151617user@starfive:~$ iperf3 -t 60 -c 192.168.31.12 -i 10 -RConnecting to host 192.168.31.12, port 5201Reverse mode, remote host 192.168.31.12 is sending[ 5] local 192.168.31.224 port 37528 connected to 192.168.31.12 port 5201[ ID] Interval Transfer Bitrate[ 5] 0.00-10.00 sec 13.5 MBytes 11.3 Mbits/sec[ 5] 10.00-20.00 sec 13.5 MBytes 11.3 Mbits/sec[ 5] 20.00-30.01 sec 13.5 MBytes 11.3 Mbits/sec[ 5] 30.01-40.01 sec 13.6 MBytes 11.4 Mbits/sec[ 5] 40.01-50.01 sec 13.4 MBytes 11.2 Mbits/sec[ 5] 50.01-60.01 sec 13.6 MBytes 11.4 Mbits/sec- - - - - - - - - - - - - - - - - - - - - - - - -[ ID] Interval Transfer Bitrate Retr[ 5] 0.00-60.06 sec 84.0 MBytes 11.7 Mbits/sec 6 sender[ 5] 0.00-60.01 sec 81.1 MBytes 11.3 Mbits/sec receiveriperf Done. - Upload
1234567891011121314user@starfive:~$ iperf3 -t 60 -c 192.168.31.12 -i 10Connecting to host 192.168.31.12, port 5201[ 5] local 192.168.31.224 port 46268 connected to 192.168.31.12 port 5201[ ID] Interval Transfer Bitrate Retr Cwnd[ 5] 0.00-10.01 sec 20.0 MBytes 16.8 Mbits/sec 0 263 KBytes[ 5] 10.01-20.01 sec 19.0 MBytes 15.9 Mbits/sec 0 263 KBytes[ 5] 20.01-30.01 sec 19.5 MBytes 16.4 Mbits/sec 0 413 KBytes[ 5] 30.01-40.01 sec 19.1 MBytes 16.0 Mbits/sec 0 413 KBytes[ 5] 40.01-50.01 sec 19.1 MBytes 16.0 Mbits/sec 0 413 KBytes[ 5] 50.01-60.01 sec 19.1 MBytes 16.0 Mbits/sec 0 413 KBytes- - - - - - - - - - - - - - - - - - - - - - - - -[ ID] Interval Transfer Bitrate Retr[ 5] 0.00-60.01 sec 116 MBytes 16.2 Mbits/sec 0 sender[ 5] 0.00-60.09 sec 114 MBytes 15.9 Mbits/sec receiver
The results are virtually the same. For reference, on this testbed, many (high-end) WiFi 6 platforms can deliver 1Gbps+ throughputs. I suppose the SDIO interface (and drivers) might be the bottleneck here.
The WiFi 6 module also supports Bluetooth 5.4. I tested it with an Android smartphone (OPPO A98 5G). I could connect rather easily and managed to transfer a 14.7 MB photo over Bluetooth.
It took me three attempts, as I was a bit too slow accepting the request, but the third time it went through.
While it works, it is really slow to transfer files from my Android smartphone to the SBC. It took 22 minutes to transfer a 14.7MB photo, equivalent to roughly 89.1 kbps bitrate.
I also tried to use the VisionFive 2 Lite as an audio sink, playing music from my smartphone to the HDMI TV connected to the board, but since the bitrate is so low, it didn’t work well with continuous cuts and unrecognizable audio.
YouTube and 1080p60 video playback
Next up are some video tests, starting with YouTube video playback in Firefox. I usually sign in to Firefox to synchronize my account, but it seemed stuck, and I realized that add-ons were not supported. So I had to log out. I’m asked to download the “new Firefox” to get the extension. The current version installed on the board is Firefox Browser 126.0.1 64-bit, while on my Ubuntu 24.04 laptop, it is 146.0.1. There are no official Firefox RISC-V binary releases, so it might need to be compiled from source.
It didn’t stop me from trying YouTube. The system struggled to load the main page of YouTube, so I searched for “4K video youtube”, and loaded a video from there. The first resolution that somewhat worked was 480p, but that just means the image was not just a still picture. The video was unwatchable with 784 frames dropped out of 2269.
360p was a small improvement, but still unwatchable: 917 frames dropped out of 4566.
240p was almost watchable (if we ignore the low resolution) with 116 frames dropped out of 4279. Audio worked fine, too.
So, YouTube video playback in Firefox is not really usable. Let’s see if we have more luck with local files and maybe use the VPU from the JH7110S RISC-V SoC. I started with big_buck_bunny_1080p_surround.avi using ffplay.
The video played somewhat fine, but the CPU usage was really high, implying software video decoding. At this point, I realized the video is using the MPEG-4 codec, and the VPU offers up to 4Kp60 H.264 and H.265 video decoding, so that’s why software decode is used. So I switched to a 4Kp30 video with H.264 codec instead.
We can see lower CPU usage, and the OMX AVC (H.264) decoder is used, implying hardware video decoding. That’s good news, but playing a 4K video on a 1080p display only shows a quarter of the video since hardware scaling is not implemented automatically.
Switching to a 10-bit H.265 video yields the same results: relatively low CPU usage, OMX HEVC (H.265) decoder, and a quarter of the video shown on the display.
I eventually found out I could just move the window and click the full-screen icon to see the complete video. Scaling does not seem to impact the performance in any significant way.
Raspberry Pi camera and display
The MIPI ports layout looks similar to the one used on the Raspberry Pi’s MIPI DSI and CSI connectors, so I connected a 7-inch Raspberry Pi Touch Display 2 and a Raspberry Pi AI camera.
However, I quickly realized these were not supported, and the hardware compatibility list only mentions Waveshare and Radxa displays and Sony iMX219 camera sensors. So I skipped MIPI testing due to a lack of compatible hardware.
AI workloads – Object Detection
While the JH7110S does not come with a proper NPU, the company still provides samples. I had a quick try at the object detection demos using the USB Full HD camera from AAEON’s NV8600-Nano developer kit.
We can install the demos as follows:
|
1 2 3 |
user@starfive:~$ wget https://github.com/starfive-tech/Debian/releases/download/v0.15.0-engineering-release-wayland/install_full.sh user@starfive:~$ chmod +x install_full.sh user@starfive:~$ sudo ./install_full.sh |
After the first time, the last command failed with the following errors:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Ign:3 https://debianrepo-t.starfivetech.com/ubuntu starfive-ubuntu/noble riscv64 libre2-9 riscv64 20220601+dfsg-1 Ign:4 https://debianrepo-t.starfivetech.com/ubuntu starfive-ubuntu/noble riscv64 v8 riscv64 10.2.154.13 Ign:2 https://debianrepo-t.starfivetech.com/ubuntu starfive-ubuntu/noble riscv64 chromium riscv64 103.0.5060.114 Ign:3 https://debianrepo-t.starfivetech.com/ubuntu starfive-ubuntu/noble riscv64 libre2-9 riscv64 20220601+dfsg-1 Ign:4 https://debianrepo-t.starfivetech.com/ubuntu starfive-ubuntu/noble riscv64 v8 riscv64 10.2.154.13 Err:2 https://debianrepo-t.starfivetech.com/ubuntu starfive-ubuntu/noble riscv64 chromium riscv64 103.0.5060.114 Could not connect to debianrepo-t.starfivetech.com:443 (121.46.248.1), connection timed out Err:3 https://debianrepo-t.starfivetech.com/ubuntu starfive-ubuntu/noble riscv64 libre2-9 riscv64 20220601+dfsg-1 Unable to connect to debianrepo-t.starfivetech.com:https: Err:4 https://debianrepo-t.starfivetech.com/ubuntu starfive-ubuntu/noble riscv64 v8 riscv64 10.2.154.13 Unable to connect to debianrepo-t.starfivetech.com:https: Fetched 71.3 kB in 38s (1887 B/s) E: Failed to fetch https://debianrepo-t.starfivetech.com/ubuntu/pool/noble/c/chromium/chromium_103.0.5060.114_riscv64.deb Could not connect to debianrepo-t.starfivetech.com:443 (121.46.248.1), connection timed out E: Failed to fetch https://debianrepo-t.starfivetech.com/ubuntu/pool/noble/r/re2/libre2-9_20220601%2bdfsg-1_riscv64.deb Unable to connect to debianrepo-t.starfivetech.com:https: E: Failed to fetch https://debianrepo-t.starfivetech.com/ubuntu/pool/noble/v/v8/v8_10.2.154.13_riscv64.deb Unable to connect to debianrepo-t.starfivetech.com:https: E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing? Install Success |
It was just a temporary server issue. I had to wait until the next morning, and I could complete the installation.
I ran the YOLO-V3 sample with the following command:
|
1 2 3 4 |
example_dnn_object_detection --config=/usr/share/opencv4/yolo-v3/yolov3-tiny.cfg \ --model=/usr/share/opencv4/yolo-v3/yolov3-tiny.weights \ --classes=/usr/share/opencv4/yolo-v3/classes.txt \ --width=416 --height=416 --scale=0.00392 --rgb --target=1 --device=4 |
It did work, but without AI accelerators, the inference time is rather long at over 1,100ms. Note that the company provides an AI kit with a Hailo-8L M.2 AI acceleration module, so you can use AI with better performance. It’s out of the scope of this review, so I haven’t looked into it.
GPIO
The VisionFive 2 and VisionFive 2 Lite boards feature a 40-pin GPIO header with a pinout similar to what you’d find on a Raspberry Pi SBC.

The command offers a range of Python examples to control the GPIO, but somehow I could not install the tools successfully:
|
1 2 3 4 5 6 7 8 |
user@starfive:~$ source myvenv/bin/activate (myvenv) user@starfive:~$ python3 Install_VisionFive_gpio.py (myvenv) user@starfive:~$ python3 -m pip show VisionFive.gpio WARNING: Package(s) not found: VisionFive.gpio (myvenv) user@starfive:~$ |
So instead, I used sysfs and libgpio to quickly check the GPIOs:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
user@starfive:~$ ls -l /dev/gpiochip* crw------- 1 root root 254, 0 Nov 25 18:16 /dev/gpiochip0 crw------- 1 root root 254, 1 Nov 25 18:16 /dev/gpiochip1 user@starfive:~$ sudo gpioinfo 0 gpiochip0 - 64 lines: line 0: unnamed unused input active-high line 1: unnamed unused input active-high line 2: unnamed unused input active-high line 3: unnamed unused input active-high line 4: unnamed unused input active-high line 5: unnamed unused output active-high line 6: unnamed unused input active-high line 7: unnamed unused input active-high line 8: unnamed unused input active-high line 9: unnamed unused input active-high line 10: unnamed unused output active-high line 11: unnamed unused input active-high line 12: unnamed unused input active-high line 13: unnamed unused input active-high line 14: unnamed unused input active-high line 15: unnamed "hpd" input active-high [used] line 16: unnamed unused output active-high line 17: unnamed unused output active-high line 18: unnamed unused output active-high line 19: unnamed unused input active-high line 20: unnamed unused input active-high line 21: unnamed unused output active-high line 22: unnamed unused output active-high line 23: unnamed unused output active-high line 24: unnamed unused output active-high line 25: unnamed unused output active-high line 26: unnamed unused output active-high line 27: unnamed "enable" output active-high [used] line 28: unnamed "perst" output active-low [used] line 29: unnamed unused output active-high line 30: unnamed unused output active-high line 31: unnamed unused output active-high line 32: unnamed unused output active-high line 33: unnamed "WL_REG_ON" output active-high [used] line 34: unnamed unused output active-high line 35: unnamed "gpio-restart" output active-high [used] line 36: unnamed unused input active-high line 37: unnamed unused input active-high line 38: unnamed unused input active-high line 39: unnamed unused input active-high line 40: unnamed unused input active-high line 41: unnamed "cd" input active-high [used] line 42: unnamed unused output active-high line 43: unnamed unused input active-high line 44: unnamed unused input active-high line 45: unnamed unused output active-high line 46: unnamed unused output active-high line 47: unnamed unused input active-high line 48: unnamed unused input active-high line 49: unnamed unused input active-high line 50: unnamed unused input active-high line 51: unnamed unused input active-high line 52: unnamed unused input active-high line 53: unnamed unused input active-high line 54: unnamed unused input active-high line 55: unnamed unused input active-high line 56: unnamed unused input active-high line 57: unnamed unused input active-high line 58: unnamed unused input active-high line 59: unnamed unused input active-high line 60: unnamed unused input active-high line 61: unnamed unused input active-high line 62: unnamed unused output active-high line 63: unnamed unused input active-high user@starfive:~$ sudo gpioinfo 1 gpiochip1 - 4 lines: line 0: unnamed unused input active-high line 1: unnamed unused input active-high line 2: unnamed unused input active-high line 3: unnamed "ack" output active-high [used] user@starfive:~$ |
Everything looks good here.
Summary of what works, what doesn’t
So now that testing is almost finished, let’s go through a summary of the tests to see what works and what doesn’t, at the end of 2025 and beginning of 2026 on StarFive’s low-cost RISC-V board:
- Storage
- MicroSD card slot – OK, but the 64GB Raspberry Pi microSD card (A2) is significantly slower than when used on a Raspberry Pi 5.
- NVMe SSD – Works, but relatively slow (up to 295 MB/s under specific conditions)
- Display interfaces
- HDMI – Video OK (tested up to 4K resolution), Audio OK
- MIPI DSI – Untested due to a lack of compatible hardware.
- GPU – 3D graphics acceleration enabled, tested with glmark2-es2-wayland and WebGL in Firefox. But the performance is on the low side.
- VPU – Works with ffplay
- Camera interface – MIPI CSI untested due to a lack of compatible hardware.
- Networking
- Gigabit Ethernet – OK (iperf3 DL: 933 Mbps, UL: 942 Mbps, full-duplex: 902/877 Mbps)
- WiFi 6 – Works, but very slow (16 Mbps at 2.4 and 5 GHz)
- Bluetooth – OK, but very slow and close to being unusable while transferring a file or playing music from an OPPO A98 5G Android smartphone
- USB – USB 3.0 port tested with an ORICO NVMe SSD enclosure, USB 2.0 ports with a USB HDD (both using an EXT-4 partition), and an RF dongle for a wireless keyboard/mouse combo. Front left to right
- USB 2.0 (top) – 480 Mbps; tested up to 39 MB/s with iozone3
- USB 3.0 (bottom) – 10 Gbps; tested up to 103 MB/s (read)/149 MB/s (write) with iozone3; works, but slower than expected
- USB 2.0 (top) – 480 Mbps; tested up to 38 MB/s with iozone3
- USB 2.0 (bottom) – 480 Mbps; tested up to 38 MB/s with iozone3
- GPIO – OK – Quickly checked with sysfs and libgpio.
Power consumption
I measured the VisionFive 2 Lite’s power consumption using a wall power meter:
- Power off – 1.7 Watts
- Idle
- 3.0 Watts (headless, microSD card, M.2 SSD, WiFi 6)
- 3.4 Watts (as above + Gigabit Ethernet)
- 4.2 Watts (as above + RF dongle for mouse & keyboard, HDMI monitor)
- 4K H.265 video (ffplay) – 6.1 – 7.0 Watts
- Stress test on all 4 cores (stress -c 4) – 6.1 – 6.4 Watts
Conclusion
A lot of progress has been made since I reviewed the VisionFive 2 in 2023, and everything I tested on Ubuntu 24.04 worked, a bit like on a decently supported Arm SBC. However, I didn’t say everything worked well, as there are still many caveats and limitations.
As expected, the StarFive JH7110S is an entry-level quad-core RISC-V SoC, and the performance is similar to that of a Raspberry Pi 3 Model B+ or an underclocked Rockchip RK3566 single board computer. That part is not surprising. However, the performance of the storage interfaces (microSD card slot and M.2. NVM eSSD), the USB 3.0 interface, and WiFi 6 and Bluetooth are all on the low side, and it’s unclear whether it’s a limitation of the silicon or the drivers, although I hope further software optimization may improve all of these. However, Gigabit Ethernet works well at around 930/940 Mbps.
I was also pleased to see 3D graphics acceleration (glmark2-es2-wayland and WebGL in Firefox) and H.265/H.265 hardware video decoding (ffplay/ffmpeg) were all implemented properly, albeit the GPU performance was also on the low side, but it might be due to the PowerVR BXE-4-32 GPU itself. The GPIOs were also detected by sysfs and libgpio. I was also delighted to see a recent Linux 6.12 kernel used here (albeit patched. However, some software limitations still exist with RISC-V, for example, you can’t just run apt dist-upgrade without messing up the system (another method is provided), and the provided Firefox version is old enough (126) that add-ons can’t be installed.
We’re not quite to the point where it’s a no-brainer to use a RISC-V SBC instead of an Arm SBC due to the limitations listed above, but we’re getting there, and if future RISC-V SoCs get more powerful, offer better I/Os and associated drivers, and additional RISC-V packages are supported, I can imagine RISC-V SBCs competing directly with the Arm equivalent. Right now, if performance is not an issue and you are aware of various limitations, the VisionFive 2 Lite can still be used for some projects as an alternative to Arm SBCs like the Pi 3 or RK3566 boards, as well as for RISC-V experimentation.
I’d like to thank StarFive for sending a VisionFive 2 Lite SBC for review to have another look at the RISC-V ecosystem at the end of 2025, beginning of 2026. The 4GB RAM + WiFI model reviewed here can be purchased on AliExpress (about $64), Amazon ($63.99), and Waveshare ($62.99).

Jean-Luc started CNX Software in 2010 as a part-time endeavor, before quitting his job as a software engineering manager, and starting to write daily news, and reviews full time later in 2011.
Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress. We also use affiliate links in articles to earn commissions if you make a purchase after clicking on those links.





























