Skip to content

feat: add Allwinner A733 / Radxa Cubie A7S board support - #16128

Draft
Klutzleo wants to merge 9 commits into
batocera-linux:masterfrom
GameOctane:board/allwinner-a733-cubie-a7s
Draft

feat: add Allwinner A733 / Radxa Cubie A7S board support#16128
Klutzleo wants to merge 9 commits into
batocera-linux:masterfrom
GameOctane:board/allwinner-a733-cubie-a7s

Conversation

@Klutzleo

@Klutzleo Klutzleo commented Jul 23, 2026

Copy link
Copy Markdown

Board: Allwinner A733 / Radxa Cubie A7S

Board page: https://radxa.com/products/single-board-computers/cubie-a7s/

This adds support for the Allwinner A733 SoC (sun60iw2) on the Radxa Cubie A7S. I'm the developer of OctaneOS, a Batocera-based gaming distribution that ships on this board. The board is working and we've been releasing builds to real users, so this isn't a bringup experiment — it's battle-tested.


Hardware

SoC Allwinner A733 (sun60iw2) — 2×A76 + 6×A55 @ 2.0 GHz
GPU Imagination PowerVR BXM-4-64 MC1
Display USB-C DisplayPort Alt Mode (eDP 1.4 → Cadence SERDES → HUSB311 TypeC)
WiFi/BT AIC8800D80 USB 2.0
Boot Radxa U-Boot pre-built blobs (rsdk-r2)

GPU — PowerVR BXM-4-64

This SoC uses a PowerVR GPU, not Mali. Panfrost does not apply. pvrsrvkm.ko is built out-of-tree in post-build.sh from the BSP source that lives in bsp/modules/gpu/ inside the kernel tree.

The userspace DDK (libGLESv2, pvr_dri.so, pvr_gbm.so, etc.) is bundled in fsoverlay/usr/local/lib/ and fsoverlay/usr/lib/. These come from Radxa's xserver-xorg-img-bxm package:

  • Section: free — the SoC vendor (Allwinnertech) is the package maintainer and explicitly classifies it as freely distributable under Debian's DFSG definition
  • The same binaries are distributed publicly by the Deepin Linux project at github.com/deepin-community/img-gpu-bin
  • See board/batocera/allwinner/a733/DDK_LICENSE_EVIDENCE.md for full provenance details

This is the opposite situation from the StarFive/JH7110 img-gpu-powervr package (LICENSE = Strictly Confidential, REDISTRIBUTE = NO). The Allwinner variant has a different and more permissive classification from the vendor.

Mesa softpipe is kept as a fallback for packages that need a Mesa EGL/GLES provider at link time.


Kernel

Source: https://github.com/GameOctane/allwinner-a733-linux
Branch: a733-batocera-v1

The A733 requires two upstream repos: Radxa's 6.6 kernel (radxa/kernel) and the BSP overlay (radxa/allwinner-bsp). Buildroot's BR2_LINUX_KERNEL_CUSTOM_GIT only supports a single repo, so the solution is a pre-merged snapshot where both are combined — bsp/ is dropped into the kernel tree with drivers-y += bsp/ already wired in the Makefile. BSP drivers (CCU, MMC, display pipeline, USB TypeC, AXP PMIC) and pvrsrvkm.ko all build as part of a normal kernel compile.


Boot

The Radxa U-Boot is a heavily customised Android/AIOT fork that does not integrate with Buildroot's BR2_TARGET_UBOOT. Pre-extracted boot blobs from Radxa's rsdk-r2 release are committed to board/batocera/allwinner/a733/cubie-a7s/boot/ and written to their raw SD card offsets by the post-image script via dd.


Status

  • EmulationStation launches and is fully usable
  • Controllers (USB, xpad) working
  • Audio over DisplayPort working
  • RetroArch running (software renderer; PVR OpenGL ES path works)
  • OTA updates working
  • WiFi via AIC8800D80 working

Project

This fork is the work coming from OctaneOS. OctaneOS is a forked version of Batocera that will run on a DIY gaming handheld, with the hopes of wireless streaming to a dock. Utilizing the Radxa Cubie A7S board for the performance/price to play most retro games, and the features to make the handheld a potential $150 DIY project.

The project page can be found here: OctaneOS

Klutzleo and others added 8 commits July 22, 2026 22:09
mkdir -p for etc/udev/rules.d was placed AFTER the install that needs
it, causing 'No such file or directory' when target/ is fresh (not
cached between CI runs). Move mkdir before the install.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The install script created spa-0.2/ffmpeg/ with 'install -d' but had no
equivalent for videoconvert/, causing 'Not a directory' when target/ is
fresh (not cached between CI runs) and the file installs into a path
that doesn't exist as a directory.

Add rm -f + install -d before the videoconvert install so both scenarios
(directory missing, stale file) are handled cleanly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PIPEWIRE_FFMPEG_PLUGINS_INSTALL_PW_CAT installed pw-cat without
ensuring target/usr/bin/ exists first, causing 'No such file or
directory' when target/ is fresh (not cached between CI runs).

Add install -d usr/bin before the pw-cat install.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rror)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
A733 (Allwinner A733 / Cubie A7S) was missing from the
BATOCERA_CONFIGGEN_SYSTEM chain, causing BATOCERA_CONFIGGEN_SYSTEM
to be empty and the staging install to fail copying
configgen-defaults-.yml (no arch suffix).

Add BR2_PACKAGE_BATOCERA_TARGET_A733 → a733 entry and create
configgen-defaults-a733.yml based on t527 (closest Allwinner peer).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
New board: Allwinner A733 (sun60iw2) SoC, Radxa Cubie A7S reference board.

SoC: 2x Cortex-A76 + 6x Cortex-A55 @ 2.0GHz (sun60iw2)
GPU: Imagination PowerVR BXM-4-64 MC1 (pvrsrvkm.ko, proprietary DDK)
Display: USB-C DisplayPort Alt Mode via Cadence eDP SERDES + HUSB311 TypeC
WiFi/BT: AIC8800D80 USB 2.0 adapter
Boot: Radxa U-Boot (pre-built blobs, rsdk-r2) → extlinux → kernel

Kernel source:
  https://github.com/GameOctane/allwinner-a733-linux (branch: a733-batocera-v1)
  Radxa 6.6 kernel + allwinner-bsp pre-merged so Buildroot can fetch in one
  git clone. BSP drivers (CCU, MMC, display, USB TypeC, AXP PMIC) and
  pvrsrvkm.ko build automatically via drivers-y += bsp/ in the Makefile.

GPU notes:
  The A733 uses a PowerVR GPU — Panfrost does not apply. pvrsrvkm.ko is
  built in post-build.sh after the kernel. The proprietary userspace DDK
  (libGLESv2, pvr_dri.so, pvr_gbm.so) is bundled in fsoverlay/usr/local/lib/
  from Radxa's xserver-xorg-img-bxm package (Section: free, Maintainer:
  Allwinnertech). See DDK_LICENSE_EVIDENCE.md for provenance details.
  Mesa softpipe provides a GL fallback for packages that need a Mesa
  EGL/GLES provider at link time.

Display pipeline:
  Wayland via labwc (XWayland excluded — pulls in libglew/XORG7 which
  conflicts with the PVR GL stack). Video output activates after USB-C
  DisplayPort negotiation completes (~3-5s after boot).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@Klutzleo

Copy link
Copy Markdown
Author
First video on A7S
A7S.Doom.mp4

@Klutzleo
Klutzleo marked this pull request as ready for review July 23, 2026 14:02
@Klutzleo

Copy link
Copy Markdown
Author

I'm sorry if I need to clarify anything or missed something. This is legitimately my first PR, and fairly nervous and excited about this. Please feel free to reach out if needed

@Tovarichtch

Copy link
Copy Markdown
Collaborator

Thanks for your first submission! That's what we want to see: real effort to contribute upstream instead of isolating in a bubble, somewhere. A quick glance shows a lot of spaghetti/bloated code. Perhaps a major clean up can reduce a lot of lines.

@Klutzleo

Copy link
Copy Markdown
Author

Trying to get this board to work was very...messy. Especially with the GPU. Let me see what I can do.

Remove dead x86 PRIME GPU detection from labwc-launch — only one GPU
configuration exists on A733, the code was never reachable.

Remove verbose pre-flight diagnostic log dump from labwc-launch. Reduce
make invocation in post-build.sh to non-redundant variables.

Remove batocera-info fsoverlay override — the A733-specific big.LITTLE
cluster_id CPU detection belongs in the upstream script, not as a full
board-level replacement of the system tool.

Remove S99-diag — bringup diagnostic helper, not appropriate for a
production board submission.

Remove serial console diagnostic block from S13-videooutput.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@Klutzleo

Copy link
Copy Markdown
Author

Cleanup and snapshot kernel fix

Went through a cleanup pass.

  • Removed S99-diag. This was to diag init scripts and was dumping into /boot

  • Removed dead x86 PRIME GPU detection block from labec-launch

  • Removed verbose pre-flight logging from labec-launch

  • Removed batocera-info fsoverlay override

  • Removed serial console diagnostic dumps from S13-videooutput

Also fixed the kernel snapshot (a733-batocera-v1). The original orphan push has bsp/ excluded by .git ignore, so the GPU module source and DRM drivers were missing entirely. This was rebuilt.

Removed a BSP-level 60hz ceiling in sunxi_drm_hdmi.c

Silly code I've been trying to figure this out for months and the code was (if (rate > 60) return MODE_BAD)

...This was blocking 120hz at the DRM layer.

The updated snapshot should include this fix

@dmanlfc

dmanlfc commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator

@Klutzleo please mark it as draft for now and continue to refine the PR.
Ideally, squash your commits to one commit in the PR.
Once you're happy, request for me to review and I will get to it when I can however first pass about this device looks is that it's very restrictive in the GPU department and there are hacks for GPU int which should be avoided. We're also not a fans of binary drivers without source code or further closed source driver details.
You should also consider using the imagination vulkan driver and zink for OpenGL to Vulkan for compatibility.

Quick Notes:
Try to make package files instead of scripts & dumping binary blobs.
Try to provide more information on the SDK sources etc so we can review and guide you.

It may be better to talk on Discord in the #developers channel. Bear in mind i'm in Brisbane, Australia and it's late here as I type this.

@Klutzleo
Klutzleo marked this pull request as draft July 24, 2026 13:08
@Klutzleo

Copy link
Copy Markdown
Author

I will leave this in draft as I look into the requests you are asking for. Let me know if you want to close this for any reason. But its going to take more time on my end and right now the GPU really only seems to be hacked into submission through-out multiple projects.

I'm not giving up, just putting it on the back burner.

@retro98boy

Copy link
Copy Markdown
Contributor

I will leave this in draft as I look into the requests you are asking for. Let me know if you want to close this for any reason. But its going to take more time on my end and right now the GPU really only seems to be hacked into submission through-out multiple projects.

I'm not giving up, just putting it on the back burner.

Here is the mainline Linux port for Cubie A7A, including the mainline PowerVR GPU driver.
This is where everyone is discussing the Cubie A7A Linux port.
Hope this helps!
Finally, let's thank NickAlilovic for his hard work on this mainlining effort.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants