🌐 English · Español
Mainline support for the Orange Pi 4A (Allwinner T527 SoC, A523 family /
sun55iw3), on a vanilla 6.18.38 kernel. A 130-patch series + defconfig +
the board device-tree. The ports from the community minimyth2 series keep their
original authorship (Justin Suess, Jernej Škrabec) in the patch headers.
Working-tree base:
linux-6.18.38vanilla. These patches apply on top.git format-patch --baseembeds the base hash in every.patch.
Latest image: v0.3 — hardware video decode (VPU) + a GNOME desktop. See CHANGELOG.md for release history.
Heads-up: these patches are the kernel behind the v0.3 images (GPU clock fix, PCIe bring-up, hardware video decode). Refreshed Debian images — a GNOME desktop and a CLI / headless one, built on this kernel — are on the Releases page. You can also build the kernel yourself from the patches here.
| Block | Status |
|---|---|
| HDMI KMS display (DE33/DE3.5 + TCON-TV + DW-HDMI 2.0 + Inno PHY) | ✅ 720p/1080p, clean VSU8 scaling |
HDMI boot console (fbcon via simple-framebuffer over U-Boot's FB) |
✅ with the BSP U-Boot (not needed with mainline U-Boot; see §4) |
| HDMI HPD / hotplug (native connector detection) | ✅ connected at boot + hotplug (plug/unplug) without forcing |
| Mali-G57 GPU (Panfrost) | ✅ accelerated (GNOME on Wayland) |
| HDMI audio (i2s2 → dw-hdmi) | ✅ PCM output to the TV |
| Analog audio (3.5 mm headphone jack + jack detect) | ✅ headphones + hotplug (custom sun55i-a523-codec driver ported from the BSP — no mainline driver exists otherwise). Line-out / mic capture wired but not yet bench-tested |
| Ethernet GMAC1 (YT8531 PHY, RGMII) | ✅ RX/TX |
| WiFi AP6256 (BCM43456, brcmfmac, SDIO) | ✅ 2.4/5 GHz scan, association |
| reboot / poweroff (sunxi_wdt / AXP717) | ✅ |
| AFBC scanout (v350 AFBD decoder) | ✅ |
| USB (4 rear Type-A ports — all USB 2.0: the SoC's single USB3/PCIe combo lane goes to the M.2 slot, so this board has no USB 3.0 at all; see the FAQ) | ✅ HID (keyboard/mouse) + mass storage + hotplug; the OTG pair works as host |
| THS thermal sensors (5 zones: cpu_l / cpu_b / gpu / npu / ddr) | ✅ sysfs/hwmon readout + 110 °C critical trip |
| CPU cpufreq/DVFS (little 480 MHz–1.416 GHz, big 480 MHz–1.8 GHz) + thermal throttling at 90 °C | ✅ |
| Asymmetric CPU topology (cpu-map + capacity-dmips-mhz 922/1024 + EAS energy model) | ✅ big cluster preferred for heavy tasks |
| GPU devfreq/DVFS (Panfrost, 150–600 MHz) + thermal throttling | ✅ and now at the right frequencies — the A523 GPU divider turned out to be a cycle-masking (fractional) one, rate = source × (16−M)/16, not a linear divider; measured with the Mali cycle counter |
| eMMC (MMC storage) | ✅ detected + HS200 read/write (confirmed by a tester); booting from eMMC not wired up yet |
| PCIe / M.2 (DesignWare RC + Innosilicon combo PHY) | ✅ controller and PHY probe, link training runs and the root port enumerates — verified here with an empty slot. NVMe with a real drive is still untested (no drive on hand — testers very welcome) |
Hardware video decode (VPU) — partly working, kernel side included. This tree
ships the cedar-ve shim with its device-tree node and the IOMMU mappings for the
video-engine masters. Paired with the Allwinner userspace (libcedarc +
gstreamer1.0-omx), H.264 and H.265 decode work: YouTube plays smoothly in a
WebKit browser (Epiphany / GNOME Web) on this board. VP8/VP9 do not — that
engine never raises its interrupt, so those codecs are capped in our setup, which
makes YouTube negotiate H.264 instead. Note this is the kernel half: the
userspace decoding stack is not part of this patch set — but the v0.3 Debian
images do ship it (libcedarc + gst-omx), so hardware decode works out of the
box there. If you build only the kernel from these patches, you supply the
userspace yourself.
The 4 GB variant is confirmed working (tested by JamesCL — thanks! — who
also confirmed the eMMC; the bootloader auto-detects the RAM size).
Decisions made in the distributed image (these are not kernel patches):
- First boot auto-resizes the rootfs to fill the microSD and regenerates the SSH host keys — so the first boot takes a bit longer. Don't pull the power.
- SSH is enabled from first boot; user/password are
user/user. Change the password immediately (passwd) — a default password on a network-facing device is how boards end up in botnets. - 1 GB zram swap on by default; SD swap file optional. zram (zstd) is a
compressed in-RAM swap: it keeps the desktop responsive when a browser fills
the 2 GB board's RAM, never touches the SD, and costs almost nothing while
unused. Disable with
systemctl disable --now zram-swap.service. For extra headroom, theadd-swapfile.shscript in the home folder adds an optional 1 GB swap file on the SD, used only as overflow. - Wayland session — the desktop is GNOME on Wayland. No X11 session is shipped: Panfrost gives its best accelerated experience under Wayland, and hardware video in the browser in particular needs it.
- Newcomer-friendly desktop — GNOME ships with a taskbar (Dash to Panel), system-tray / app-indicator support and minimise/maximise window buttons, all on by default so the desktop behaves the way most people expect. These are standard GNOME extensions — turn any of them off in the Extensions app if you prefer stock GNOME.
- File indexer (Tracker) disabled — GNOME's
$HOMEindexer is off: it uses RAM that the 2 GB board needs. Re-enable it if you have the 4 GB variant and want faster in-file search. - Software store removed — GNOME Software is not installed; just polling for
updates costs it >150 MB of RAM. Updates go through
apt(see the kernel-pin note below). - Power saving / suspend disabled (on purpose, for now) — automatic suspend and the screen blanking after idle are both off by default. On this SoC the mainline resume path still needs polishing: the system doesn't always come back once the screen has powered off. So the board stays awake and the display stays on, rather than risk a session you can't wake. This will be re-enabled once resume is solid; meanwhile you can turn suspend back on, or set a screen-blank timeout, in Settings → Power.
- Audio output follows what's connected — a tiny user service
(
aureal-audio-autoswitch) moves the default sink to the 3.5 mm headphone jack when you plug in, and back to HDMI when you unplug. Bluetooth headsets are respected (the service only reacts to the wired jack, never overriding a BT or manual choice). PipeWire doesn't do this on its own here because the analog codec and HDMI are two separate cards. Override anytime in the tray; disable withsystemctl --user disable --now aureal-audio-autoswitch.
Spare-time work, so no dates promised — but on the horizon:
- Kernel refresh to 6.18.40. I've been going through the stable changes since 6.18.38 and there's a fair amount worth having: general security and stability fixes across the tree, plus a handful of A523-specific improvements — notably better GPIO-interrupt handling on this SoC. I'm looking at rolling a security-and-improvements kernel update soon to pick those up.
- The open hardware items above still stand: NVMe with a real drive (testers very welcome), booting from eMMC, and line-out / microphone capture.
patches/—git format-patchseries (0001–0130).opi4a_blindboot_defconfig— forarch/arm64/configs/.sun55i-t527-orangepi-4a.dts— board device-tree.
cd linux-6.18.38 # 6.18.38 vanilla
git am /path/to/share-orangepi-4a/patches/0*.patch
cp /path/to/opi4a_blindboot_defconfig arch/arm64/configs/
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- opi4a_blindboot_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image dtbs modulesThe patches aren't homogeneous. If you're going to integrate/forward them, this is the classification by where each group belongs:
pinctrl: sun55i-a523: withstand PIO banks from hw detectionpinctrl: sunxi: inverted POW_MOD_SEL polarity on A523/T527watchdog: sunxi_wdt: restart priority 200 (beats PSCI)mfd: axp20x: AXP717 poweroff (OFF_CTRL range not writeable)- Bug:
RESET_GPIObreaksmmc-pwrseq-simplewith#gpio-cells=3— affects any sunxi board with SDIO WiFi. Here it's shipped asconfig=n; the real fix belongs in the driver, upstream.
HDMI pipeline bring-up series. Much of it comes from the minimyth2 community
work (H728) — marked (minimyth2 NNNN) — plus our A523 fixes (IOMMU
PHYS_OFFSET/PTE, DE v35x RCQ, VSU8, MBUS wedge, AFBC). Natural destination:
dri-devel / linux-sunxi as a series, crediting minimyth2.
A523 CPU CCU (clk sunxi-ng, ported from the BSP ccu-sun55iw3-displl.c), A523
THS (thermal sun8i, custom variant with 4-sensor calibration), CPU/GPU OPP
tables and cooling-maps. cpufreq (little up to 1.416 GHz, big up to 1.8 GHz) +
GPU devfreq 150–600 MHz, both as cooling devices. Asymmetric CPU topology
(cpu-map + capacity-dmips-mhz 922/1024 + dynamic-power-coefficient) so the
scheduler/EAS knows the big cluster is the more capable one — verbatim from the
BSP; without it the two clusters looked identical to the scheduler.
Crutches to boot under the BSP's proprietary U-Boot (it doesn't fill /memory,
and injects display nodes into the FDT): /soc/{de,sunxi-drm} stubs, static
/memory, firmware secure regions, simple-framebuffer over U-Boot's FB,
heartbeat LED. Not needed with mainline U-Boot. Included to reproduce the
boot as-is, not as an upstream proposal.
This is spare-time hardware-enablement (bring-up) work — display, GPU, audio and network — built on Allwinner's public documentation and vendor BSP together with upstream and community patches, with the project's own patches validated on real hardware. If it helped with your Orange Pi 4A, you can buy me a coffee:
- Ko-fi: https://ko-fi.com/aurealnix
Prefer to support it another way? I'm available for freelance / contract embedded-Linux work (board bring-up, drivers, mainlining) — juanmanuellopezcarrillo@gmail.com.
- Mainline port, A523 fixes and integration: Juan Manuel López Carrillo (AurealNix).
- Display pipeline bring-up: based on the minimyth2 / Suess series for Allwinner H728 (ported and adapted to the A523) — original authorship by Justin Suess and Jernej Škrabec kept in the patches.
- PCIe controller + Innosilicon combo PHY: from the Armbian series by Marvin Wewer (forward-ported to 6.18 here, with a 1-lane fix from the BSP and this board's device-tree wiring) — his authorship kept in the patches.
- The cycle-masking GPU divider was found thanks to Chen-Yu Tsai, who pointed out the fractional semantics while reviewing an upstream patch.
- Allwinner 5.15 BSP (vendor kernel,
sun55iw3) used throughout as the hardware reference and guide: register semantics, device-tree values and sensor calibration were taken from the BSP, not invented; where mainline lacked support, driver logic was ported/adapted from it (CPU CCU, THS, DVFS/OPP tables, USB VBUS, poweroff, display).
This project became real the day other people started putting it on their own boards. Thank you:
- JamesCL (Armbian forum) — confirmed the 4 GB variant and the eMMC (HS200) with detailed reports (dmesg, lsblk), and is helping figure out booting from eMMC.
- L. Jorge Soares (Armbian forum) — first independent validation of both v0.2 images (CLI and KDE: Wi-Fi, HDMI, YouTube, audio), plus serial-console logs to help debug eMMC boot.
- bickns (Armbian forum) — early feedback on the patch series and testing it against Armbian builds.
- Nick_Sl (Armbian forum) — asked for the CLI/headless image and volunteered to test it. It exists because of that.
- defencedog (GitHub) — maintainer of the other community repo for this board, for the generous offer to collaborate and for sharing his VPU/GStreamer work.
If you test an image or a patch and report back — success or failure — you are doing bring-up with me, and your name belongs here too.
I hope my work helps you enjoy your boards a bit more. Because I think you already know this isn't bad hardware — an octa-core, even if it's just A55s, can go a long way, and it's a shame to miss out on updates, security patches and general OS improvements simply because the manufacturer can't be bothered. I'm certain that if the vendor had made even a minimal effort and shipped at least the longterm kernels now and then, we'd all be a lot happier. But they didn't even do that. It's true I didn't do all of this myself — but I put in what was missing and gave it the shape it needed so it can actually be enjoyed. And with your collaboration I've been able to make it better. Anyway — that's all. Thanks for your help.
These patches derive from the Linux kernel and are distributed under the same terms: GNU General Public License, version 2 (GPL-2.0-only) — full text in LICENSE. The Debian userspace in the image is stock Debian under its own respective licenses.
Parts of this work were done with the help of AI agents. That is exactly why it stays honest and is published in the open: Allwinner's documentation and BSP were both the hardware source of truth — no register semantics were invented — and every change was validated on real hardware. The patches are here to be reviewed: break them, and send bug reports or corrections.