Releases: Scrumpper/H96_MAX_V58_Unofficial-Armbian
Release list
H96-MAX-V58_Unofficial-Armbian_v3
██╗ ██╗ █████╗ ██████╗ ███╗ ███╗ █████╗ ██╗ ██╗ ██╗ ██╗███████╗ █████╗
██║ ██║██╔══██╗██╔═════╝ ████╗ ████║██╔══██╗╚██╗██╔╝ ██║ ██║██╔════╝██╔══██╗
███████║╚██████║███████╗ ██╔████╔██║███████║ ╚███╔╝ ██║ ██║███████╗╚█████╔╝
██╔══██║ ╚═══██║██╔═══██╗ ██║╚██╔╝██║██╔══██║ ██╔██╗ ╚██╗ ██╔╝╚════██║██╔══██╗
██║ ██║ █████╔╝╚██████╔╝ ██║ ╚═╝ ██║██║ ██║██╔╝ ██╗ ╚████╔╝ ███████║╚█████╔╝
╚═╝ ╚═╝ ╚════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝ ╚════╝
U N O F F I C I A L A R M B I A N · v3 · OPEN GPU + WiFi 6
────────────────────────────────────────────────────────────────────────
Rockchip RK3588 · Mali-G610 · open Panthor + Mesa · PCIe WiFi 6
RK3588 · Mali-G610 · Panthor DRM · Mesa 26.1.4 · PanVK Vulkan 1.4 · WiFi 6 + Ethernet · ~5s boot
WIFI WORKS
⚡ Before → After
| Old vendor-blob builds | v3 — open Panthor | |
|---|---|---|
| Desktop compositing | ❌ llvmpipe (software), CPU-bound | ✅ Mali-G610 Panfrost — real GPU |
| Cursor | flickery software cursor | ✅ hardware cursor plane |
| Night light | ❌ unavailable | ✅ works (needs compositing) |
| Vulkan | closed blob, DXVK hard-fails | ✅ PanVK, open, Vulkan 1.4 |
| GPU clock | 800 MHz | ✅ 1000 MHz (+22%, thermally safe) |
| Boot | 12–22 s, dirty --failed |
✅ ~5 s, --failed empty |
| Boot log | ~370 noise lines | ✅ phantom-codec spam silenced |
🎬 Hardware video — YouTube at ~1.5% CPU
- YouTube & in-browser video are hardware-decoded through the RK3588 VPU — not the browser's CPU decoder. It "works""... with a pre-installed chromium extension/player stream: https://github.com/woodruffw/ff2mpv
- Hit "play in mpv" (the ff2mpv button) in chromium add-ons:
mpv with Rockchip MPP hardware decode: H.264 / HEVC / VP9, up to 1080p, at ~1.5% CPU.
┌────────────────────────────────────────────────────────────┐
│ browser video (software decode) ........ ~20%+ CPU, hot │
│ ▶ "play in mpv" (rkmpp / RK3588 VPU) ... ~1.5% CPU, cool │
└────────────────────────────────────────────────────────────┘
🖥️ Open-GPU composited desktop
- KDE Plasma & GNOME composite on the GPU — renderer reports
Mali-G610 MC4 (Panfrost), OpenGL ES, Mesa 26.1.4. No morellvmpipesoftware fallback. - Hardware cursor plane — smooth pointer, flicker gone.
- Night light / blue-light filter works (it depends on compositing — now that the GPU composites, it lights up).
- Fully open source: Panthor DRM kernel driver + Mesa Panfrost userspace. No closed Mali blob shadowing the loader.
🎮 GPU gaming — open Vulkan, no blob
- PanVK — the open-source Vulkan driver on Mali-G610, Vulkan 1.4 (Mesa 26.1.4).
vulkaninfoenumeratesMali-G610 (panvk). h96-game-modelauncher: box64 + wine (wow64) + stripped-DXVK in a nested compositor — the community-standard RK3588 gaming pattern. Desktop stays on Panfrost/X11; the game gets PanVK per-process.- GPU runs at 1000 MHz under load (validated ~57 °C peak).
- Steam ships as an opt-in, experimental one-command installer (
h96-install-steam, box86/box64 recipe) — nothing Steam-related is pre-baked.
🔎 Steam snap can't see this GPU (pressure-vessel breaks the driver mmap) — Canonical-layer limitation, not the image. Get steam with:
h96-game-mode(native arm64 PanVK).
🛜 Onboard WiFi — WiFi 6, and Ethernet at the same time
- The radio is a Broadcom BCM43752 / AP6275P — 802.11ax "WiFi 6", dual-band — on PCIe
Internets: lspci → Broadcom BCM43752 802.11ax [14e4:449d] · wlan0 up · eth0 up ·
💾 Flash it
# grab the compressed image (~1.4 GB), decompress, then flash over USB-USB CABLE
xz -dk H96-MAX-V58_Unofficial-Armbian_v3.img.xz
rkdeveloptool wl 0 H96-MAX-V58_Unofficial-Armbian_v3.imgH96-MAX-V58_Unofficial-Armbian_v2
H96 Max V58 — Unofficial Armbian v2 — Changelog
Built on Armbian 26.05 / Ubuntu 26.04 Resolute, BSP kernel 6.1.x-rk3588-ophub.
v2
Working LightDM plus a fully-offline desktop and gaming stack.
LightDM fix
LightDM was non-functional in every prior release — the greeter started an X server that
died on the spot. The cause is in the RK3588 BSP HDMI driver: it collapses the DDC i2c bus
when Xorg polls EDID, killing the X session before the greeter can draw.
The fix has two parts, now both in place:
- Global Xorg workaround, baked in.
/etc/X11/xorg.conf.d/20-h96-display.confships
unconditionally withmodesetting+ShadowFB "true"+PageFlip "false"and screen
blanking disabled. This sidesteps the i2c collapse for every X11 session, not just
LightDM. (Earlier builds applied this only via a per-LightDM path unit; it's now global.) - LightDM installs offline.
lightdmandlightdm-gtk-greeterare in the baked local
APT repo, soapt install lightdm lightdm-gtk-greeterworks with no internet. The
h96-lightdm-configurepath unit still fires on install to setminimum-vt=1, add
lightdmto thevideo/rendergroups, and enable the service.
Result: install an X11 desktop + LightDM and you get a working login screen out of the box.
Other bug fixes & improvements
- Fully-offline desktop + gaming installs.
/opt/h96-pkgs/is a real
dpkg-scanpackagesAPT repo (483 debs, ~461 MB) registered as
deb [trusted=yes] file:///opt/h96-pkgs ./. It carries the full dependency closure of
, LightDM, Wine/Wine64, DXVK, and the firstboot Python deps, alongside the
existing gaming/GPU packages. Verified on the live unit: with all online repos removed,
apt install cinnamon lightdm wine dxvkresolves 288 packages with zero errors. - No boot-time network fetches. Firstboot's DXVK / Wine /
python3-dbus/python3-gi
installs now resolve from the local repo, so a first boot with no internet completes
without errors. - One global X11 display config replaces the old per-desktop configure path units —
covers Cinnamon, XFCE, MATE, i3, and Enlightenment with a single baked file.
Carried over from the previous release
- Ethernet reconnect fix, removed the stale
wpasupplicantifupdown symlinks from
/etc/network/if-up.d/and/etc/network/if-post-down.d/. NetworkManager owns every
interface on this image, so those hooks were firingwpa_supplicantwith no config and
throwing "network binary not found" on ethernet plug/unplug. - Bluetooth (experimental, manual)
h96_bt.pyuserspace BCM4345C0 firmware loader.
Not auto-enabled (bluez isn't in the base image). Firmware loads cleanly; post-firmware
HCI attach is still best-effort.
For the complete project history (v001 → present), see the running changelog in the
project root.
H96-MAX-V58_Unofficial-Armbian_v1
## I was tired of the android 12 trash on this box and didn't want some half-baked android.
Built from the Rock5b images.
This build is packaged with a GPU driver stack & graphical compatibility packages pre-baked. Hardware acceleration works.
NO WiFi of Bluetooth.. yet.
Also working on the front display panel.
Tried to get RAM usage down as much as possible.
CPU frequency was scanned under load:
- LITTLE cores (Cortex-A55): 1800 MHz
- BIG cores (Cortex-A76): 2208 MHz
Those were thescaling_cur_freqreadings. The vendor DTB caps the A76 at 2208 MHz — the physical max is 2.4 GHz but that OPP entry isn't in the table.
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[UNOFFICIAL] H96 Max V58 — Armbian Ubuntu 26.04 · RK3588 · Performance stack · 7 desktops · v001
Device: H96 Max V58 (Rockchip RK3588, 8GB RAM, 64GB eMMC)
Status: Unofficial / community-built — not affiliated with the Armbian project
What is this
A ready-to-flash Armbian image for the H96 Max V58 Android TV box. Boots headless with SSH on first power-on. Installs a full performance/emulation stack and configures all 7 desktops during first boot — no manual steps required after flashing.
Built on top of the official Armbian Rock 5B image (same RK3588 SoC family, same BSP kernel). All H96 Max V58 hardware-specific customisation is applied by the build scripts on top.
Hardware
| SoC | Rockchip RK3588 |
| CPU | 4× Cortex-A76 @ 2208 MHz + 4× Cortex-A55 @ 1800 MHz |
| GPU | ARM Mali-G610 MP4 (Valhall) — Vulkan 1.3, OpenGL ES 3.2 |
| RAM | 8 GB LPDDR4X |
| Storage | 64 GB eMMC |
| HDMI | HDMI 2.1 (DW-HDMI-QP) — 4K@60 confirmed |
| Network | Gigabit Ethernet |
| Base OS | Armbian 26.x / Ubuntu 26.04 Resolute |
| Kernel | BSP 6.1.x-rk3588-ophub |
What's included
Boots headless by default (multi-user.target, SSH on first boot)
| Feature | Notes |
|---|---|
| Mali G610 GPU blobs | EGL · GBM · GLES · Vulkan 1.3 (g13p0 + g24p0) |
| Hardware video decode | Rockchip MPP — H.264, H.265, VP9, AV1 up to 8K |
| HDMI resolutions | 480p → 576p → 720p → 1080p → 2K → 4K@60 via firmware EDID |
| x86_64 emulation | box64 |
| x86 32-bit emulation | box86 |
| Power profiles | Performance · Balanced · Power Saver — D-Bus daemon, desktop quick-settings |
| Desktop support | 7 desktops auto-configure on install via armbian-config |
| Audio | PipeWire + PulseAudio bridge — HDMI audio out, volume control |
| Monitoring tool | h96-bench — live CPU/GPU/thermal snapshot + stress |
| SSH | Open — root / 1234 |
Wine not included — install after flashing: apt install wine wine64
Desktops (none installed by default — install via armbian-config → System → Desktop):
| Desktop | Display manager | Notes |
|---|---|---|
| GNOME | GDM | Wayland |
| KDE Plasma | SDDM | Wayland |
| Cinnamon | LightDM | X11 + ShadowFB |
| XFCE | LightDM | X11 + ShadowFB |
| MATE | LightDM | X11 + ShadowFB |
| i3 | LightDM | X11 + ShadowFB |
| Enlightenment | LightDM | X11 + ShadowFB |
Each desktop auto-configures (display manager, session files, groups, accessibility, lpadmin) the moment the package lands — no manual steps.
Known limitations
- WiFi — BCM43455 chip is present but not supported. Ethernet only.
- Bluetooth — Not configured.
- Desktop hardware compositing — All desktops run software compositing. BSP 6.1.x uses proprietary Mali blobs — no Panfrost/Panthor. GNOME (Mutter/Cairo) and KDE (KWin/llvmpipe) are Wayland; X11 desktops use ShadowFB. GNOME suppresses the warning; KDE shows a tray notice.
- KDE / KWin performance — KWin's software compositor is significantly CPU-heavy without GPU acceleration. Video playback (YouTube etc.) is jerky under KDE. Use Cinnamon, XFCE, or MATE for smooth video playback.
- BIG core max frequency — Vendor DTB caps Cortex-A76 at 2208 MHz. Physical max is 2.4 GHz but the OPP table doesn't include it.
- 8K HDMI output — Not tested. 4K@60 is the confirmed maximum.
- Night light / gamma — BSP DRM driver does not expose
gamma_lut_sizeon the CRTC. GNOME's night light toggle engages Mutter's software color pipeline — you'll see a slight brightness shift but the warm colour shift won't apply. - Browser video (YouTube etc.) — Chromium ships with
--ignore-gpu-blocklistbaked in so WebGL initialises. VLC plays everything fine via Rockchip MPP directly. - HDMI after soft reboot — The BSP HDMI PHY doesn't drop the HPD line on
reboot, so the TV may not re-sync. Hard power cycle (unplug/replug) always works. - Front panel LEDs / IR remote — No driver in BSP kernel.
HDMI note — why a firmware EDID is used
The BSP dwhdmi-rockchip driver collapses the DDC I²C bus at boot, so the kernel can never read a real EDID from the TV. Without an EDID the display is black.
Fix: drm.edid_firmware=HDMI-A-1:edid/h96-hdmi-multi.bin — the kernel serves a hand-crafted 256-byte EDID from the initramfs, bypassing all I²C reads entirely. The EDID covers all common resolutions from 480p to 4K@60 and declares RGB-only output (critical — if YCbCr flags are set, the BSP encoder switches colour space and the TV gets a black screen).
video=HDMI-A-1:e is also set to keep the DRM connector forced-on through the PHY re-probe that fires ~12s after boot.
Flashing
Requires: Linux host, rkdeveloptool, USB-A to USB-A cable (male both ends).
# 1a. First-time flash — Maskrom mode:
# Power off → hold Maskrom pinhole (beteen WiFi antennas) → plug USB-A into box USB2 port → Plug In power, (should go maskrom/loader mode), release pinhole
# 2. Verify:
rkdeveloptool ld
# Expected: DevNo=1 Vid=0x2207,Pid=0x350b Maskrom (or Loader)
# 3. Flash:
xz -d H96-MAX-V58_Unofficial-Armbian_v001.img.xz
rkdeveloptool wl 0 H96-MAX-V58_Unofficial-Armbian_v001.img
rkdeveloptool rdAfter flashing, always hard power cycle (unplug/replug) before first boot. The BSP HDMI PHY requires a cold start to sync with the TV.
Takes ~3–5 minutes. First boot runs setup (~10–15 min). Box reboots once automatically.
***After first boot the box runs fully standalone.
ssh root@h96max # or ssh root@<ip>
# password: 1234Full flashing guide: FLASHING.md
1b. Reflash from Armbian — SSH in and run:
reboot loader
First-boot pipeline
Everything runs automatically — no console, no interaction needed. Ethernet required.
- Root filesystem expanded to full eMMC
- SSH host keys regenerated (unique per device)
- Branding written, immutable flag set
- EDID firmware rebuilt into initramfs (
mkinitramfs + mkimage) - box64 + box86 installed from bundled offline debs
- Ubuntu packages installed from repos: gamemode, irqbalance, vulkan-tools, xserver-xorg-core, slick-greeter, pipewire-pulse, DXVK
- Mali G610 GPU blobs linked, Vulkan ICD configured, Rockchip MPP installed
--ignore-gpu-blocklistbaked into Chromium config- GNOME auto-configures on
gdm3install: at-spi2-core, lpadmin group, GDM settings
First boot takes ~10–15 minutes. Box reboots itself. SSH available within ~30 seconds of first power-on.
Credits
| Component | Credit |
|---|---|
| Base image | Armbian for Rock 5B — Armbian Project |
| BSP kernel (6.1.x RK3588) | ophub/kernel |
| Desktop tooling | armbian-config |
| x86_64 emulation | box64 — ptitSeb · debs by ryanfortner |
| x86 32-bit emulation | box86 — ptitSeb · debs by ryanfortner |
| LightDM greeter | slick-greeter — Linux Mint team |
| Windows layer | Wine + DXVK |
| Hardware decode | Rockchip MPP |
| Mali blobs | ARM Ltd. (g13p0 EGL/GBM/GLES, g24p0 Vulkan) |
| Build tooling | Claude Code — Anthropic |