Orange Pi i96 support lands in meta-pantavisor — mainline U-Boot and Linux 6.6 on the RDA8810PL

meta-pantavisor just gained support for the Orange Pi i96 — the tiny RDA8810PL (ARM Cortex-A5) board in the 96Boards IoT Edition form factor. It joins the supported-machines list as 96boards-orangepi-i96, landed in pantavisor/meta-pantavisor#449.

A modern stack on abandoned silicon

The interesting part of this port is what it does not use. The official Orange Pi sources for this SoC — shared with the Orange Pi 2G-IOT — are OrangePiRDA_kernel, a Linux 3.10 tree, and OrangePiRDA_uboot, a 2012-era U-Boot. Both have been effectively frozen for years and no longer build with a current toolchain, and the old meta-96boards layer that wrapped them is abandoned. So the board now boots a modern stack instead:

  • the vendor SPL (DDR and clock init) chain-loads a U-Boot 2024.01 stage-2,
  • which boots linux-yocto 6.6 carrying an RDA8810PL patch series: clocks/resets, the IFC dmaengine, MMC, I²C, the combo power controller, the mdcom/msys blocks, machine restart, and the rdawlan WiFi driver ported to cfg80211.

None of the official tree’s code ships in the image — the only vendor piece reused is the SPL blob that does DDR and clock init. The old trees still earned their keep during the bring-up, though: they are the register-level reference for this SoC, and the port’s WiFi driver was compared against the vendor’s line by line when chasing hardware quirks.

The BSP lives in its own layer, meta-orangepi-i96, which the KAS config fetches automatically — meta-pantavisor carries just the integration.

All of it is verified on hardware, on an image built from the merged commit: the board boots, mounts storage, brings up wlan0, associates with WPA2 and rejoins the network unattended after a reboot. Since the board has no WiFi MAC in NVRAM, the driver derives a stable one from the SD card’s CID — the address travels with the card.

Building and flashing

./kas-container build kas/build-configs/release/96boards-orangepi-i96-scarthgap.yaml

The bootloader is a hybrid (vendor SPL + modern U-Boot) that sits at a raw offset ahead of the partition table, so a helper assembles the flashable image from the deploy artifacts:

DEPLOY=<build>/tmp-scarthgap/deploy/images/orangepi-i96 \
BL=bootloader.rda \
OUT=orangepi-i96.img \
sh recipes-bsp/u-boot/files/mk-sd-image.sh

The board is also selectable from the Kconfig build menu, and CI builds it alongside the other machines on manual and release-tag workflows.

Things to know before you boot one

  • The serial console runs at 921600 baud, not 115200 — the boot ROM prints at that rate, so a terminal at 115200 shows garbage or nothing. Conveniently, PVR 053 just added the flag for exactly this: pvr device tty -d /dev/ttyUSB0 -b 921600.
  • There is no Ethernet — WiFi is the only network path. Provision it with pvwificonnect-cli (bumped to v1.8.1 along the way, fixing five CLI provisioning defects), or with improv-serial for a device that has never been configured.
  • First boot is slow on purpose — Pantavisor verifies the SHA-256 of every object in the trail, which takes a few minutes on a single Cortex-A5 core. Later boots skip most of it.
  • Two hardware features do not work: Bluetooth and WiFi AP mode. Both were reproduced on the vendor’s own Debian image with vendor tools, so neither is a gap in this port — the board guide and the BSP layer’s MODEM-WIFI-PORT.md document the evidence in detail.

Get started

The full walkthrough — console, building, the SD image helper, WiFi provisioning and the known limitations — is in the board guide in the meta-pantavisor docs (docs/getting-started/how-to-install/boards/orangepi-i96.md), with the board row in the supported-devices table.

If you have one of these boards gathering dust in a drawer — this is a nice weekend to give it a second life. Questions welcome below!