OrangePi R2S is a great new RISC-V OpenWrt device

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.

1 Like

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?

riscv64 bootloader

Don't have this R2s yet so unsure about the 2.5g interfaces, but the RV2 will be in my staging spacemit target.

2 Likes

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?

1 Like

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.

1 Like

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.

1 Like

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?

  1. Run htop, sensors, and iostat to diagnose the root cause (CPU hogs, overheating, or I/O issues).
  2. Disable unnecessary services and update firmware.
  3. 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

1 Like

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";
};

@phyesix Disable vq firmware image