Radxa E52C – A Rockchip RK3582 router with dual 2.5GbE, USB 3.0 port, USB serial console port

Ah, sorry, I misunderstood how U-Boot is configured.

Yes, U-Boot tries to load the next stage (e.g., boot.scr and kernel.img on an OpenWrt image) from mmc1 (SD) first, then mmc0 (eMMC).
Kernel tries to mount rootfs by UUID, so UUID needs to be unique.


Boot order on bootrom (in Rockchip CPU) is fixed, generally it loads TPL/SPL from SPI > eMMC > SD (> USB).
Boot order on SPL (from U-Boot) can be vary, generally it is configured to load U-Boot proper from "same-as-spl" > SD > eMMC.
Boot order on U-Boot proper can be vary, generally it is configured to load "next thing" from mmc1 > mmc0 > nvme > scsi > usb > pxe > dhcp > spi.
Boot order on "next thing" depends on how it works, e.g. root= bootargs for Linux kernel.


I guess TPL/SPL/U-Boot are loaded from eMMC, then U-Boot loads "next thing" from SD first.

1 Like

Just checked - openwrt does not unlock cores by default. Any ideas how it could be done?

Armbian does it by default, but it seems that it has some patches for bootloader…

Don’t think openwrt devs would make it the default :slight_smile:

Tested for a couple of hours, various benchmarks, works fine.

CPU unlocking result: 8 cores
GPU unlocking result: YES
Decoder 1 unlocking result: YES
Decoder 2 unlocking result: YES
Encoder 1 unlocking result: YES
Encoder 2 unlocking result: NO

root@radxa-e52c:/tmp# ./cpufetch_arm64_linux
[ERROR]: RK SoC was found but it does not match any known SoCs: 0x3582
[VERSION]: cpufetch v1.07 (Linux ARM build)

SoC:                 Unknown
Technology:          Unknown
CPU 1:
  Microarchitecture: Cortex-A55
  Max Frequency:     1.800 GHz
  Cores:             4 cores
  Features:          NEON,SHA1,SHA2,AES,CRC32
CPU 2:
  Microarchitecture: Cortex-A76
  Max Frequency:     2.304 GHz
  Cores:             2 cores
  Features:          NEON,SHA1,SHA2,AES,CRC32
CPU 3:
  Microarchitecture: Cortex-A76
  Max Frequency:     2.352 GHz
  Cores:             2 cores
  Features:          NEON,SHA1,SHA2,AES,CRC32
Peak Performance:    206.59 GFLOP/s

root@radxa-e52c:/tmp# inxi -C
CPU:
  Info: 8-core model: N/A variant-1: cortex-a76 variant-2: cortex-a55 bits: 64 type: MCP cache:
    L2: 2.5 MiB
  Speed (MHz): avg: 1800 min/max: 408/1800:2304:2352 cores: 1: 1800 2: 1800 3: 1800 4: 1800
    5: 1800 6: 1800 7: 1800 8: 1800


1 Like

Openwrt is strict on following manufacturer guidelines which is to always disable 1 cluster of the a76 cores. You could apply this patch to your build from ImmortalWRT.

1 Like

I think you are free to use the patches, but please never falsely advertise that the E52C has a 4-core A76.

2 Likes

True, sorry I should have clarified this in my reply.

My e52c have an additonal A76 core working more-or-less, but its not within specs, as it either scales to its min or max frequency, not in-between, so theres a reason why they’re disabled in the first place.

2 problems. Stock openwrt snapshot.

ubus call system board
{
	"kernel": "6.12.59",
	"hostname": "OpenWrt",
	"system": "ARMv8 Processor rev 0",
	"model": "Radxa E52C",
	"board_name": "radxa,e52c",
	"rootfs_type": "squashfs",
	"release": {
		"distribution": "OpenWrt",
		"version": "SNAPSHOT",
		"firmware_url": "https://downloads.openwrt.org/",
		"revision": "r32189-141ac0b2bd",
		"target": "rockchip/armv8",
		"description": "OpenWrt SNAPSHOT r32189-141ac0b2bd",
		"builddate": "1764668544"
	}
}

ubus list network.interface.*
network.interface.lan
network.interface.loopback
network.interface.wan
network.interface.wan6
  1. Even after sysupgrade -n and new config owut and attended sysupgrade complain:

ERROR: sysupgrade validation failed:
stderr =
Wed Dec 3 12:30:44 GMT 2025 upgrade: The device is supported, but the config is incompatible to the new image (1.0->1.1). Please upgrade without keeping config (sysupgrade -n).
Wed Dec 3 12:30:44 GMT 2025 upgrade: Network interface names have been changed
Wed Dec 3 12:30:44 GMT 2025 upgrade: Reading partition table from bootdisk...
zcat: write error: Broken pipe
zcat: write: Broken pipe
Wed Dec 3 12:30:44 GMT 2025 upgrade: Reading partition table from image...
Image check failed.

  1. there are some errors in kernel log, tested on a couple of snapshots:

[ 0.000000] GICv3: using LPI property table @0x00000000004c0000
[ 0.000000] GIC: using cache flushing for LPI property table
[ 0.000000] GICv3: CPU0: using allocated LPI pending table @0x00000000004d0000
[ 0.000000] GICv3: GIC: PPI partition interrupt-partition-0[0] { /cpus/cpu@0[0] /cpus/cpu@100[1] /cpus/cpu@200[2] /cpus/cpu@300[3] }
[ 0.000000] GICv3: GIC: PPI partition interrupt-partition-1[1] { /cpus/cpu@400[4] /cpus/cpu@500[5]
[ 0.000000] ------------[ cut here ]------------
[ 0.000000] WARNING: CPU: 0 PID: 0 at drivers/irqchip/irq-gic-v3.c:2219 gic_populate_ppi_partitions+0x1d8/0x298
[ 0.000000] Modules linked in:
[ 0.000000] CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 6.12.59 #0
[ 0.000000] Hardware name: Radxa E52C (DT)
[ 0.000000] pstate: 604000c9 (nZCv daIF +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 0.000000] pc : gic_populate_ppi_partitions+0x1d8/0x298
[ 0.000000] lr : gic_populate_ppi_partitions+0x188/0x298
[ 0.000000] sp : ffff800080ee3bf0
[ 0.000000] x29: ffff800080ee3bf0 x28: 0000000000000002 x27: 0000000000000001
[ 0.000000] x26: 0000000000000002 x25: ffff000000440960 x24: ffff00007fb8e1b0
[ 0.000000] x23: ffff000000440988 x22: ffff800080ef1120 x21: ffff00007fbc08b0
[ 0.000000] x20: 00000000ffffffed x19: ffff00007fbc0c60 x18: ffff800080f037a8
[ 0.000000] x17: 30407570632f7375 x16: 70632f207b205d30 x15: 0000000000000049
[ 0.000000] x14: ffffffffffffffff x13: 0000000000000000 x12: 0000000000000019
[ 0.000000] x11: 0101010101010101 x10: ffff80008167f717 x9 : 0000000000000003
[ 0.000000] x8 : 0101010101010101 x7 : 0000736c6c65632d x6 : 0000000000000001
[ 0.000000] x5 : 62697461700a0a11 x4 : 0000000000000000 x3 : 0000000000000001
[ 0.000000] x2 : 0000000000000006 x1 : 0000000000000006 x0 : 00000000ffffffed
[ 0.000000] Call trace:
[ 0.000000] gic_populate_ppi_partitions+0x1d8/0x298
[ 0.000000] gic_of_init+0x1bc/0x244
[ 0.000000] of_irq_init+0x1c8/0x34c
[ 0.000000] irqchip_init+0x18/0x24
[ 0.000000] init_IRQ+0x98/0xb0
[ 0.000000] start_kernel+0x448/0x584
[ 0.000000] __primary_switched+0x80/0x88
[ 0.000000] ---[ end trace 0000000000000000 ]---
[ 0.000000] ------------[ cut here ]------------
[ 0.000000] WARNING: CPU: 0 PID: 0 at drivers/irqchip/irq-gic-v3.c:2219 gic_populate_ppi_partitions+0x1d8/0x298
[ 0.000000] Modules linked in:
[ 0.000000] CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Tainted: G W 6.12.59 #0
[ 0.000000] Tainted: [W]=WARN
[ 0.000000] Hardware name: Radxa E52C (DT)
[ 0.000000] pstate: 604000c9 (nZCv daIF +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 0.000000] pc : gic_populate_ppi_partitions+0x1d8/0x298
[ 0.000000] lr : gic_populate_ppi_partitions+0x188/0x298
[ 0.000000] sp : ffff800080ee3bf0
[ 0.000000] x29: ffff800080ee3bf0 x28: 0000000000000003 x27: 0000000000000001
[ 0.000000] x26: 0000000000000002 x25: ffff000000440960 x24: ffff00007fb8eca0
[ 0.000000] x23: ffff000000440988 x22: ffff800080ef1120 x21: ffff00007fbc08b0
[ 0.000000] x20: 00000000ffffffed x19: ffff00007fbc0c60 x18: ffff800080f037a8
[ 0.000000] x17: 30407570632f7375 x16: 70632f207b205d30 x15: 0000000000000049
[ 0.000000] x14: ffffffffffffffff x13: 0000000000000000 x12: 0000000000000019
[ 0.000000] x11: 0101010101010101 x10: ffff80008167f717 x9 : 0000000000000003
[ 0.000000] x8 : 0101010101010101 x7 : 0000736c6c65632d x6 : 0000000000000001
[ 0.000000] x5 : 62697461700a0a11 x4 : 0000000000000000 x3 : 0000000000000001
[ 0.000000] x2 : 0000000000000006 x1 : 0000000000000006 x0 : 00000000ffffffed
[ 0.000000] Call trace:
[ 0.000000] gic_populate_ppi_partitions+0x1d8/0x298
[ 0.000000] gic_of_init+0x1bc/0x244
[ 0.000000] of_irq_init+0x1c8/0x34c
[ 0.000000] irqchip_init+0x18/0x24
[ 0.000000] init_IRQ+0x98/0xb0
[ 0.000000] start_kernel+0x448/0x584
[ 0.000000] __primary_switched+0x80/0x88
[ 0.000000] ---[ end trace 0000000000000000 ]---
[ 0.000000] }
[ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.

Wed Dec 3 12:30:44 GMT 2025 upgrade: The device is supported, but the config is incompatible to the new image (1.0->1.1). Please upgrade without keeping config (sysupgrade -n).
Wed Dec 3 12:30:44 GMT 2025 upgrade: Network interface names have been changed

The network interface names change from eth0 and eth1 to lan / wan recently on master, so you can’t restore your config as-is, you can try to download the backup file and edit the revelant config files, or re-configure from scratch.

Shouldn’t sysupgrade -n clear all settings?

Interface names are already lan/wan and router is functioning ok.

ubus list network.interface.*
network.interface.lan
network.interface.loopback
network.interface.wan
network.interface.wan6

I really like this little router box.

It would be nice to see it in the next Openwrt release, i guess 24.10.5? :slight_smile:

As for the mentioned problems…

First with sysupgrade was solved by adding “option compat_version '1.1'“ to the /etc/config/system. Solution was found in this thread: "The device is supported, but this image is incompatible for sysupgrade"
Without that, owut and attended sysupgrade would fail and had to be forced to install.
I don’t know much about the OpenWRT upgrade mechanism but seems to me that sysupgrade doesn’t know that the current config is compatible with the new interface names. I would expect that after first snapshot has been installed without keeping the config that check is not necessary anymore. I even reflashed the sdcard to be sure no config file survived but the problem was still there. Solved now :slight_smile:

Second problem, that warning in dmesg about “gic_populate_ppi_partitions”, it seems to not affect any router function. Does it need to be reported as bug and where, openwrt team or upstream (Radxa, linux kernel,…)?

1 Like

Low to none chances for 24.10 series but it will definetely be in the next 26.x release (most likely as we’re too late for 25.12 now)

1 Like

Can we clarify how to install Openwrt on EMMC?

@RadxaNaoki did write something earlier about the boot order.

I can confirm that my device came with preinstalled Radxa IstoreOS on emmc and that the boot priority is:

  1. SDcard

  2. EMMC

Official documentation requires erasing EMMC via special rkdevelop tool + flashing some Bootloader:

I would like to install openwrt to emmc but retain the boot order SD, EMMC.

What would be the exact procedure of flashing openwrt image to EMMC?

Do we need that custom bootloader?

Would openwrt upgrade work normally on emmc?

I just followed this guide on the Radxa website, flashed the OpenWrt img file on the eMMC, but still mostly use OpenWrt from the SD card. The boot order remained the same, namely SD > eMMC.

Never tried an update on the eMMC, so can’t comment on that one.

1 Like

Ok, flashing to emmc works fine. Boot order also. Tried owut upgrade on emmc (without SD), no problem. Router is now running only on emmc :smiley:

What can we do to help and get the device page up?

1 Like

Did you used the loader from the Raxda site ?
(https://dl.radxa.com/e/e52c/images/rk3588_spl_loader_v1.15.113.bin)

Also while we’re looking at the MMC, @RadxaNaoki
Do you think this will get implemented to the dts eventually? :slight_smile:

Why are you looking for such a bootloader?

This? https://github.com/openwrt/openwrt/pull/20780

1 Like

If you have (or flashed) something including U-Boot on eMMC, U-Boot is loaded from eMMC. Then, U-Boot loads OpenWrt (or something) from microSD card if available.

Please see messages on serial console carefully. I don't understand what the problem is.


Just FYI,

https://github.com/openwrt/openwrt/commit/d16d2765bd4fba96935f2a5ad6f4e830da317956

Installation
------------

Uncompress the OpenWrt sysupgrade and write it to a micro SD card or
eMMC using dd.

I'll check it later.

I can't remember the details, but I think it's normal.

Hi,
Yes exactly that commit :smiley:
Sorry i regularly check git, but that somehow slipped through without me noticing!

I looked at the guide on the official website, and that’s where it states to use rkdeveloptool, a loader then the img file.

I just created a new snapshot build, how would i dd it to the eMMC ?
I have openwrt-rockchip-armv8-radxa_e52c-squashfs-sysupgrade.img,
and an untouched iStoreOS partition scheme.

mmcblk0 179:32 0 14.7G 0 disk
├─mmcblk0p1 179:33 0 64M 0 part
├─mmcblk0p2 179:34 0 256M 0 part
└─mmcblk0p3 179:35 0 2G 0 part

EDIT: ignore me, i figured it out :slight_smile:
Thank you for the idea, that’s easier than rkdeveloptool.

Ok guys, it would really be nice if we had official page for this device :slight_smile:

Then maybe i would not have to follow the guide on the Radxa site to flash on emmc with that preloader image. It was not hard, but what was a PITA is to crimp the two halves of some old USB cables to make the USB A-A cable needed for the flash :rofl:

@RadxaNaoki

Thank you for your time and support for this device.

Do you maybe know why the SOC is not scaling under 1Ghz?

Is it because vendor Radxa BL and kernel or is it openwrt specific?

More standard linux distributions (I did try Armbian) allow the CPU to scale all the way down to 408 MHz. In idle my device is running around 4-5 °C cooler than in openwrt.

I can understand if it is some Openwrt specific thing, perhaps to lower some latency when CPU has to ramp up under load?

Current temps in stable 24 °C environment, device idle, latest Openwrt snapshot:

root@E52C_SD:~# sensors | grep "°C" | sort
Big Core 0:   +45.3°C  
Big Core 2:   +45.3°C  
Little Cores:  +45.3°C  
RTL8125 Port 1:  +50.5°C  (high = +120.0°C)
RTL8125 Port 2:  +50.5°C  (high = +120.0°C)
SoC Center:   +45.3°C  
SoC Package:  +44.4°C  

Docs on our web site are mainly focused on our offerings.

Boot something e.g. OpenWrt from SD, (optionally) wipe eMMC (e.g. blkdiscard, not zeroing), then dd sysupgrade.img to eMMC.