What I find compelling about this RV2 board is not its compute but its dual GigE and relatively easy potential for dual radios, combined with ample RAM. I'm interested in finding a somewhat compact mobile router that I can stick between sketchy (hotel/cafe/…) WiFi and my device(s), that can also run Pi-Hole in a container. It's nice that this board is also not super expensive.
Too bad this does not have removable bootable storage (SDCARD), nor integrated usb-serial debug port. @xiaobo Is the bootloader code also open ?
I just realized there's this:
And I see built images for the RV2 here.
Is the bootloader code also open?
Don't have this R2s yet so unsure about the 2.5g interfaces, but the RV2 will be in my staging spacemit target.
According to some benchmarks, the Ky X1 (Almost equivalent to the SpacemiT K1) is about the same as a Raspberry Pi 3 in single core performance. Will it actually be able to route 2.5GbE?
Can't agree.
Why NanoPi can upstream PR almost all their devices then?
NanoPi (ARM)'s SoC was launched early, has a large market share, and is widely used. As a result, the probability of submitting upstream code is naturally high, which is a gradual process.
RISC-V is an open-source instruction set architecture (ISA) that gradually improves its upstream code development stage, relying on everyone to port or contribute code upstream together.
A router is not all about CPU performance, the I/O side (ethernet/ switch drivers, offloading, etc.) matters a lot more than the CPU itself. There's no alternative to actually testing the SOC/ device for the intended purpose.
I just got the R2S anyone know the default credentials for the bainbu system installed on the EMMC from factory? I am also able to test any image people need help with.
cool device! is it support in mainstream kernel?
it doesn't look that hard to do basic support for these x1 thingies but it looks like the onboard 1G ethernet ports may not support working vlan interfaces (same limitation as the starfive visionfive 2 ?), it lets you make them, and ping works but i'm not sure what else does after that. So that's the good feature of the 2x 2.5G ports on this particular board.
the bianbu trees there are awesome for this purpose it's just that the wireless isn't hooked up in the dts I think so that's also something you might find handy that you wouldn't get access to yet. At least if you're looking to go past the 6.6 vendor kernel
Hi @xiaobo , I installed the product yesterday but the system load values are quite bad. It was always between 2.xx and 3.xx. Obviously I wanted to change it to Raspberry Pi 4 but I couldn't because of the extremely slow interface. I wonder if I did something wrong?
- Run
htop,sensors, andiostatto diagnose the root cause (CPU hogs, overheating, or I/O issues). - Disable unnecessary services and update firmware.
- Add cooling if overheating is detected.
Noting change, htop sorted by CPU usage:
There is not much heat in the system right now. Could this be a bug?
P.S: By the way, it was the same before I installed cloudflare and dockerd.
Can you see processes blocked in "D" state (with ps w, 4th column, STAT) ? Load is not always about waiting for CPU.
root@OpenWrt:~# ps w
PID USER VSZ STAT COMMAND
1 root 1592 S /sbin/procd
2 root 0 SW [kthreadd]
3 root 0 SW [pool_workqueue_]
4 root 0 IW< [kworker/R-rcu_g]
5 root 0 IW< [kworker/R-rcu_p]
6 root 0 IW< [kworker/R-slub_]
7 root 0 IW< [kworker/R-netns]
9 root 0 IW< [kworker/0:0H-mm]
12 root 0 IW< [kworker/R-mm_pe]
13 root 0 IW [rcu_tasks_kthre]
14 root 0 IW [rcu_tasks_trace]
15 root 0 SW [ksoftirqd/0]
16 root 0 IW [rcu_preempt]
17 root 0 SW [migration/0]
18 root 0 SW [cpuhp/0]
19 root 0 SW [cpuhp/1]
20 root 0 SW [migration/1]
21 root 0 SW [ksoftirqd/1]
24 root 0 SW [cpuhp/2]
25 root 0 SW [migration/2]
26 root 0 SW [ksoftirqd/2]
29 root 0 SW [cpuhp/3]
30 root 0 SW [migration/3]
31 root 0 SW [ksoftirqd/3]
34 root 0 SW [cpuhp/4]
35 root 0 SW [migration/4]
36 root 0 SW [ksoftirqd/4]
39 root 0 SW [cpuhp/5]
40 root 0 SW [migration/5]
41 root 0 SW [ksoftirqd/5]
44 root 0 SW [cpuhp/6]
45 root 0 SW [migration/6]
46 root 0 SW [ksoftirqd/6]
47 root 0 IW [kworker/6:0-mm_]
49 root 0 SW [cpuhp/7]
50 root 0 SW [migration/7]
51 root 0 SW [ksoftirqd/7]
53 root 0 IW< [kworker/7:0H-kb]
54 root 0 SW [kdevtmpfs]
55 root 0 IW< [kworker/R-inet_]
56 root 0 IW [kworker/u16:1-e]
58 root 0 SW [oom_reaper]
59 root 0 IW< [kworker/R-write]
60 root 0 SW [kcompactd0]
61 root 0 IW< [kworker/R-kinte]
62 root 0 IW< [kworker/R-kbloc]
63 root 0 IW< [kworker/R-blkcg]
64 root 0 IW< [kworker/R-ata_s]
77 root 0 SW [irq/19-spm8821]
78 root 0 IW< [kworker/R-md]
79 root 0 IW< [kworker/R-md_bi]
80 root 0 IW< [kworker/4:1H-kb]
81 root 0 SW [watchdogd]
82 root 0 IW< [kworker/R-rpcio]
83 root 0 IW< [kworker/R-xprti]
86 root 0 SW [kswapd0]
87 root 0 IW< [kworker/R-nfsio]
88 root 0 IW< [kworker/R-cifsi]
89 root 0 IW< [kworker/R-smb3d]
90 root 0 IW< [kworker/R-cifsf]
91 root 0 IW< [kworker/R-cifso]
92 root 0 IW< [kworker/R-defer]
93 root 0 IW< [kworker/R-serve]
94 root 0 IW< [kworker/R-cfid_]
95 root 0 IW< [kworker/R-xfsal]
96 root 0 IW< [kworker/R-xfs_m]
97 root 0 IW< [kworker/R-kthro]
98 root 0 SW [irq/66-aerdrv]
101 root 0 SW [irq/70-aerdrv]
102 root 0 IW [kworker/0:2-eve]
108 root 0 IW< [kworker/u17:0]
109 root 0 SW [v2d]
112 root 0 IW< [kworker/R-pvr_t]
113 root 0 IW< [kworker/R-pvr_f]
114 root 0 IW< [kworker/R-pvr_f]
115 root 0 SWN [pvr_defer_free]
116 root 0 SW [pvr_device_wdg]
120 root 0 IW< [kworker/R-nvme-]
121 root 0 IW< [kworker/R-nvme-]
122 root 0 IW< [kworker/R-nvme-]
123 root 0 IW< [kworker/R-targe]
124 root 0 IW< [kworker/R-targe]
125 root 0 IW< [kworker/R-xcopy]
126 root 0 IW< [kworker/1:1H-kb]
129 root 0 IW< [kworker/R-mv_ot]
130 root 0 IW< [kworker/R-uas]
131 root 0 SW [dvfs]
132 root 0 IW< [kworker/R-mvx_s]
133 root 0 SW [fw_cache]
134 root 0 IW< [kworker/R-mvx_s]
136 root 0 IW< [kworker/R-mars-]
137 root 0 SW [irq/90-thermal_]
138 root 0 SW [irq/90-thermal_]
139 root 0 IW< [kworker/R-raid5]
140 root 0 IW< [kworker/R-bch_b]
141 root 0 IW< [kworker/R-bcach]
142 root 0 IW< [kworker/R-bch_j]
143 root 0 IW< [kworker/R-dm_bu]
144 root 0 IW< [kworker/R-kmpat]
145 root 0 IW< [kworker/R-kmpat]
146 root 0 IW< [kworker/R-sdhci]
147 root 0 SW [irq/91-mmc2]
148 root 0 IW< [kworker/R-mmc_c]
150 root 0 DW [vq0]
151 root 0 DW [vq1]
153 root 0 IW< [kworker/3:1H-kb]
158 root 0 IW< [kworker/R-mld]
159 root 0 IW< [kworker/R-ipv6_]
160 root 0 SW< [krfcommd]
162 root 0 SW [jbd2/mmcblk2p2-]
163 root 0 IW< [kworker/R-ext4-]
168 root 0 IW< [kworker/2:1H-kb]
172 root 0 IW< [kworker/5:1H-kb]
194 root 0 IW< [kworker/6:1H-kb]
379 ubus 1112 S /sbin/ubusd
387 root 736 S /sbin/askfirst /usr/libexec/login.sh
425 root 820 S /sbin/urngd
527 root 0 IW [kworker/2:2-mm_]
528 root 0 IW< [kworker/R-cfg80]
679 logd 1580 S /sbin/logd -S 128
996 root 912 S /usr/sbin/dropbear -F -P /var/run/dropbear.1.pid -p 22 -K 300 -T 3 -W 262144
1639 root 2120 S {hostapd} /sbin/ujail -t 5 -n hostapd -U network -G network -C /etc/capabilities/wpad.json -c -- /usr/sbi
1640 root 2120 S {wpa_supplicant} /sbin/ujail -t 5 -n wpa_supplicant -U network -G network -C /etc/capabilities/wpad.json
1676 network 2560 S /usr/sbin/hostapd -s -g /var/run/hostapd/global
1677 network 2532 S /usr/sbin/wpa_supplicant -n -s -g /var/run/wpa_supplicant/global
1704 root 1868 S /sbin/netifd
2039 root 1224 S /usr/sbin/odhcpd
2111 root 944 S /usr/bin/netserver
2669 root 2168 S /sbin/rpcd -s /var/run/ubus/ubus.sock -t 30
2972 root 1136 S /usr/sbin/uhttpd -f -h /www -r OpenWrt -x /cgi-bin -u /ubus -t 60 -T 30 -k 20 -A 1 -n 3 -N 100 -R -p 0.0.
3207 root 1968 S /usr/sbin/vnstatd --nodaemon --noadd --startempty --noremove
4256 squid 19496 S /usr/sbin/squid -s -f /tmp/squid/squid.conf -N
4994 root 0 IW< [kworker/4:2H]
5036 root 2120 S {ntpd} /sbin/ujail -t 5 -n ntpd -U ntp -G ntp -C /etc/capabilities/ntpd.json -c -u -r /bin/ubus -r /usr/b
5080 ntp 1088 S /usr/sbin/ntpd -n -N -S /usr/sbin/ntpd-hotplug -p 0.openwrt.pool.ntp.org -p 1.openwrt.pool.ntp.org -p 2.o
6085 root 0 IW [kworker/u16:0-e]
6761 root 0 IW [kworker/1:0-eve]
7054 root 0 IW< [kworker/7:1H-kb]
7406 root 0 IW< [kworker/5:2H-kb]
7643 root 1258m S /usr/bin/dockerd --config-file=/tmp/dockerd/daemon.json
7772 root 1241m S containerd --config /var/run/docker/containerd/containerd.toml --log-level warn
7817 root 0 IW [kworker/4:2]
9340 root 0 IW< [kworker/1:0H]
9491 root 0 IW< [kworker/3:2H]
13174 root 0 IW [kworker/7:2-eve]
13175 root 2120 S {dnsmasq} /sbin/ujail -t 5 -n dnsmasq -u -l -r /bin/ubus -r /etc/TZ -r /etc/dnsmasq.conf -r /etc/ethers -
13214 dnsmasq 3440 S /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf.cfg01411c -k -x /var/run/dnsmasq/dnsmasq.cfg01411c.pid
13800 root 0 IW [kworker/6:1]
14686 root 0 IW [kworker/0:1]
14928 root 0 IW< [kworker/0:1H]
14985 root 0 IW [kworker/2:0]
15051 root 0 IW [kworker/u16:3-e]
15249 root 0 IW [kworker/7:0-mm_]
18864 root 0 IW [kworker/5:2-eve]
20735 root 1088 S udhcpc -p /var/run/udhcpc-eth0.pid -s /lib/netifd/dhcp.script -f -t 0 -i eth0 -x hostname:OpenWrt -C -R -
20737 root 832 S odhcp6c -s /lib/netifd/dhcpv6.script -P0 -t120 eth0
20768 root 0 IW< [kworker/2:2H]
21100 root 1231m S /usr/bin/cloudflared tunnel --no-autoupdate --config /etc/cloudflared/config.yml --origincert /etc/cloudf
21632 root 0 IW [kworker/3:1]
23332 root 1328 S /usr/bin/rsync --daemon --no-detach
23510 root 0 IW [kworker/5:1-mm_]
23529 root 0 IW< [kworker/6:2H]
23721 root 0 IW [kworker/1:1-eve]
23738 root 0 IW [kworker/1:2-eve]
23852 root 936 R /usr/sbin/dropbear -F -P /var/run/dropbear.1.pid -p 22 -K 300 -T 3 -W 262144 -2 9
23853 root 1104 S -ash
23861 root 1096 R ps w
25656 root 0 IW [kworker/4:1-mm_]
25729 root 0 IW [kworker/3:0-eve]
this is my ps w export; but i dont understand anything
I can spot two processes (kernel threads actually) that are in DW state: [vq0] and [vq1] with PIDs 150 & 151.
That could explain the >2.x load.
I quickly tried to search what those are, but found confusingly few informations (mainly about virtqueue structure), but I'm not even sure that is related...
Has anyone created an image from the Orange Pi source code?
I'm trying to create an image from the source for R2S, and it's giving me an error.
make[4]: Entering directory '/home/gabriel/openwrt/build_dir/target-riscv64_riscv64_musl/u-boot-x1/u-boot-2022.10.ky~89bff4a7'
ENVC include/generated/env.txt
ENVP include/generated/env.in
ENVT include/generated/environment.h
CC env/common.o
AR env/built-in.o
CC lib/efi_loader/dtbdump.o
LD lib/efi_loader/dtbdump_efi.so
OBJCOPY lib/efi_loader/dtbdump.efi
CC lib/efi_loader/initrddump.o
LD lib/efi_loader/initrddump_efi.so
OBJCOPY lib/efi_loader/initrddump.efi
LD u-boot
OBJCOPY u-boot-nodtb.bin
BUILD u-boot-env-default.bin
OBJCOPY u-boot.srec
MKIMAGE fit-dtb.blob
touch -d @1738624177 fit-dtb.blob
chmod 0600 fit-dtb.blob
CAT u-boot-fit-dtb.bin
COPY u-boot.bin
SYM u-boot.sym
CC spl/env/common.o
AR spl/env/built-in.o
LD spl/u-boot-spl
OBJCOPY spl/u-boot-spl-nodtb.bin
CAT spl/u-boot-spl-dtb.bin
COPY spl/u-boot-spl.bin
BUILD FSBL.bin
(2025-07-16 20:39:06,694) arch : RISCV64
(2025-07-16 20:39:06,694) description : ky x1 fsbl image
writing RSA key
writing RSA key
(2025-07-16 20:39:06,917) arch : RISCV64
(2025-07-16 20:39:06,917) description : ky x1 spinor bootinfo image
(2025-07-16 20:39:07,024) arch : RISCV64
(2025-07-16 20:39:07,024) description : ky x1 spinand bootinfo image
(2025-07-16 20:39:07,119) arch : RISCV64
(2025-07-16 20:39:07,119) description : ky x1 eMMC bootinfo image
(2025-07-16 20:39:07,214) arch : RISCV64
(2025-07-16 20:39:07,214) description : ky x1 sdcard bootinfo image
SYM spl/u-boot-spl.sym
MKIMAGE u-boot.img
MKIMAGE u-boot-dtb.img
CAT u-boot-dtb.bin
BUILD u-boot.itb
sh: 1: dtc: not found
./tools/mkimage: Can't open ./u-boot.itb.tmp: No such file or directory
Error: Bad parameters for FIT image type
Usage: ./tools/mkimage [-T type] -l image
-l ==> list image header information
-T ==> parse image file as 'type'
-q ==> quiet
./tools/mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-R ==> set second image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
-s ==> create an image with no data
-v ==> verbose
./tools/mkimage [-D dtc_options] [-f fit-image.its|-f auto|-F] [-b [-b ]] [-E] [-B size] [-i <ramdisk.cpio.gz>] fit-image
file is used with -f auto, it may occur multiple times.
-D => set all options for device tree compiler
-f => input filename for FIT source
-i => input filename for ramdisk file
-E => place data outside of the FIT structure
-B => align size in hex for FIT structure and header
-b => append the device tree binary to the FIT
-t => update the timestamp in the FIT
Signing / verified boot options: [-k keydir] [-K dtb] [ -c ] [-p addr] [-r] [-N engine]
-k => set directory containing private keys
-K => write public keys to this .dtb file
-g => set key name hint
-G => use this signing key (in lieu of -k)
-c => add comment in signature node
-F => re-sign existing FIT image
-p => place external data at a static position
-r => mark keys used as 'required' in dtb
-N => openssl engine to use for signing
-o => algorithm to use for signing
./tools/mkimage -V ==> print version information and exit
Use '-T list' to see a list of available image types
Long options are available; read the man page for details
make[4]: *** [board/ky/x1/config.mk:56: u-boot.itb] Error 1
make[4]: Leaving directory '/home/gabriel/openwrt/build_dir/target-riscv64_riscv64_musl/u-boot-x1/u-boot-2022.10.ky~89bff4a7'
make[3]: *** [Makefile:56: /home/gabriel/openwrt/build_dir/target-riscv64_riscv64_musl/u-boot-x1/u-boot-2022.10.ky~89bff4a7/.built] Error 2
make[3]: Leaving directory '/home/gabriel/openwrt/package/boot/uboot-ky'
time: package/boot/uboot-ky/x1/compile#4.63#3.03#7.92
ERROR: package/boot/uboot-ky failed to build (build variant: x1).
make[2]: *** [package/Makefile:179: package/boot/uboot-ky/compile] Error 1
make[2]: Leaving directory '/home/gabriel/openwrt'
make[1]: *** [package/Makefile:173: /home/gabriel/openwrt/staging_dir/target-riscv64_riscv64_musl/stamp/.package_compile] Error 2
make[1]: Leaving directory '/home/gabriel/openwrt'
make: *** [/home/gabriel/openwrt/include/toplevel.mk:233: world] Error 2
I checked the kernel compilation menu and found that it is indeed enabled with
&rcpu {
/* pinctrl-names = "default"; */
/* pinctrl-0 = <&pinctrl_rcpu>; */
mboxes = <&mailbox 0>, <&mailbox 1>;
mbox-names = "vq0", "vq1";
memory-region = <&rcpu_mem_0>, <&vdev0vring0>, <&vdev0vring1>, <&vdev0buffer>, <&rsc_table>, <&rcpu_mem_snapshots>;
status = "okay";
};

