Introduction
Five days ago, I received the Orange Pi RV2 board I ordered. For about 54 EUR / 64 USD (+ shipping), this board has very attractive features, in particular:

- 8 GB of LPDDR4X RAM (2 and 4 GB options exist)
- 8-core K1 64 bit RISC-V CPU
- 2x Gigabit Ethernet ports
- 2x M.2 M-Key PCIe2 sockets… great to plug-in PCIe devices, in particular NVME SSDs.
- 3x USB 3 and 1x USB 2 ports
- WiFi and Bluetooth
- 128 Mb SPI flash
- Micro-SD card and eMMC (not populated)
- Full-size HDMI
- Others: 2x MIPI CSI camera interfaces, MIPI DSI display connector, general purpose headers, buttons, jack audio…
All this is amazing, and if not for the slower CPU compared to Raspberry Pi 4 (according to reviews I read), this board could be more appealing than the Raspberry Pi 5 itself, which has just one Gigabit Ethernet port, no SPI flash and needs an additional “HAT” to connect just one PCIe device. Raspberry Pi 5 has two HDMI ports though, sadly micro-HDMI ones.
Ready-made images
The Orange Pi RV2 board comes with official software images:
- OpenWRT, a good choice for a device with multiple Ethernet ports
- Orange Pi OS, based on OpenHarmony
- Ubuntu, which is the image I tested
The website also provides a link to the Linux source code, maintained on GitHub. That’s when things become disappointing: the latest commit is from 5 months ago. That’s typical of hardware vendors who create a custom tree to support a new device, and then have to move on to other similar projects. You are left with an image that’s fixed, and that will never get security updates.
Therefore, you can only use the official images for building prototypes. Even though you can apply software updates (I checked that I could apply the Ubuntu package updates), you still have a fixed kernel with unfixed vulnerabilities. That’s where the community can make all the difference, if it is able to take over and support the hardware in the mainline kernel and bootloader.

Support for building images with Yocto
Thanks to patient work from Alper Ak, and with help from Khem Raj and other Yocto contributors, it is now possible to build images for the board, using the meta-riscv community layer. What’s built are images based on the vendor kernel and u-boot sources, but that’s a great step forward building custom images and with different versions of Linux and U-boot.
Unlike with other images, the Yocto Project offers a reproducible and easy to customize way to build any type of image. So, supporting the board with Yocto will make it easier to do development on Linux and U-Boot.
Support in the mainline Linux kernel
Thanks to work from Hendrik Hamerlinck, Yixun Lan, both from the Gentoo project, and other people before them, the board is now supported in mainline Linux since version 6.18-rc1 (commit).
As often, this is just basic support to get things started. All you can do so far is boot into a shell on the serial console and blink an LED.
Using Yocto to build an image booting on mainline Linux
After getting help quickly from Alper Ak to address recent issues due to OpenEmbedded Core changes that broke the old U-Boot code that is used for the board, I was able to adapt meta-riscv in less than 2 hours, to build an image with the mainline Linux 5.18-rc1 kernel instead of the custom Linux 6.6 vendor sources.
Since there is no MMC support yet, I made the kernel boot in RAM, using the already generated initramfs. U-Boot stays the same for the moment. Here’s a screenshot of the result.

If you want to know more, you can also check the full boot log of the platform.
How to build your own images
Please do! We need contributors: testers, bug reporters and people who work on further support for the board in Linux, and in U-Boot as well. Now that it’s easy to build images, you can focus on these further tasks.
My changes to meta-riscv to support this feature have been accepted through this commit.
To use them and build your image, all you need is copy this YAML file for Kas (available in Debian / Ubuntu repositories, for example):
header:
version: 14
machine: orangepi-rv2-mainline
distro: poky
target: core-image-minimal
repos:
poky:
url: git://git.yoctoproject.org/poky.git
commit: 557a3150a16575641f8541fc81853b74508eda87
layers:
meta:
meta-poky:
meta-riscv:
url: https://github.com/riscv/meta-riscv.git
commit: 8cb1ca3f6b55b2533fee63cba12371009985ba71
local_conf_header:
orangepi-rv2: |
EXTRA_IMAGE_FEATURES = "empty-root-password allow-empty-password allow-root-login"
KERNEL_DANGLING_FEATURES_WARN_ONLY = "1"
Save it as orangepi-rv2.yml, for example, and run:
$ kas build orangepi-rv2.yml
Another possibility is to get this file from a Root Commit GitLab repository:
$ git clone https://gitlab.com/rootcommit/demos.git
$ kas build demos/kas/orangepi-rv2.yml
If case you read this in the future and wish to build the exact same output, the demo in this article was built with this commit.

And if you wish to get more familiar with Yocto to make your own changes, checkout my Yocto Project and OpenEmbedded training course. It offers open-source lectures and practical lab materials, with a total of 19 labs to give you a pretty solid first experience with Yocto.

