Standalone bring-up project and reproducible build tree for running modern mainline Linux 7.2 and Alpine Linux 3.20 on the Exper Easypad 8 (Model T8E) quad-core tablet.
Internal NAND/eMMC flash remains completely untouched; the entire system boots cleanly from an external MicroSD card. Removing the SD card restores the factory stock Android system.
Hardware Specifications
| Component | Specification | Details / Bus |
|---|---|---|
| SoC | Allwinner A31s (sun6i) |
Quad-core ARM Cortex-A7 @ 1.2 GHz |
| RAM | 1 GiB DDR3 | Clocked at 432 MHz (ZQ 251) |
| GPU | PowerVR SGX544 MP2 | Rev 1.1.5 (0x01c40000, IRQ SPI 97, AXP221 DCDC2 @ 1.2 V) |
| PMIC | X-Powers AXP221s | Connected via P2WI @ 0x68 (switched to P2WI mode by U-Boot) |
| Display | 1024×768 LVDS | Single-channel 24-bit LVDS panel (VESA mapping, 60 MHz pixel clock); PG12 panel supply, PH13 PWM0 + PA25 backlight |
| Touchscreen | Goodix GT911 | Capacitive Multi-touch on TWI1 @ 0x5d (INT=PA3, RST=PA2) |
| Storage | MicroSD (mmc0) |
Routed to PF0–PF5; always-on 3.3V rail |
| USB | OTG / MUSB | Micro-USB connector; supports Device / Gadget mode |
| Accelerometer | ST LIS3DH | 3-axis motion sensor on TWI2 @ 0x19 |
| Wireless | Broadcom AP6210 / AP6181 (BCM43362) | SDIO Wi-Fi (mmc1) |
| Debug Port | UART0 (115200 8N1) | Test pads on mainboard; routed to PH20 (TX) / PH21 (RX) |
Hardware Support Status
| Subsystem | Driver / Mechanism | Status | Notes |
|---|---|---|---|
| BROM & SPL | Allwinner boot0 / U-Boot SPL | Working | Boots reliably from MicroSD (offset 8 KB) |
| U-Boot | Mainline U-Boot 2024+ | Working | PSCI, Non-Secure HYP mode, SimpleFB splash |
| PMIC & Fuel Gauge | axp20x MFD / battery / ac / usb |
Working | P2WI @ 0x68 + NMI IRQ; battery capacity, voltage, USB/AC sensing, PEK power key |
| Serial Console | Synopsys DW APB UART (ttyS0) |
Working | Earlycon + interactive getty shell |
| MicroSD Storage | sunxi-mmc (mmc0) |
Working | Rootfs mounted on mmcblk0p2 |
| USB Gadget | musb-sunxi + g_ether (usb0) |
Working | CDC Ethernet / RNDIS (172.16.42.1/24) |
| SSH Server | OpenSSH on Alpine Linux | Working | Direct root login via USB cable or Wi-Fi |
| Wi-Fi | Broadcom brcmfmac (wlan0) |
Working | SDIO Ampak AP6181 (BCM43362) on mmc1; live scanning & association verified |
| Touchscreen | goodix driver (input0) |
Working | 1024×768 1:1 aligned coordinate space, 5-point multi-touch validated |
| Sensors | ST lis3dh IIO driver (iio:device0) |
Working | 3-axis motion & tilt vector sensing with PA9 IRQ |
| cpufreq / DVFS | cpufreq-dt + schedutil, AXP221 DCDC3 |
Working | 480 / 720 / 864 / 1008 MHz at 1.0–1.2 V; reduces idle draw from ~470 mA to ~400 mA |
| Display (LCD) | sun4i-drm (DE1 backend + TCON0 LVDS) |
Working | card0 / LVDS-1 1024×768 @ 54.87 Hz, XRGB overlay planes, fbcon |
| HDMI & Audio | sun4i-drm-hdmi + hdmi-codec |
Working | EDID read, 1920×1080 @ 60 Hz on independent CRTC + ALSA stereo output (sun4i-hdmi) |
| Backlight | pwm-backlight (PH13 PWM0, PA25 enable) |
Working | /sys/class/backlight/backlight (0–56), bl_power for on/off |
| Video Decoder | cedrus (A31 Cedar VE, /dev/video0) |
Working | Stateless V4L2 decode for VP8 (bit-exact), H.264 High Profile, and MPEG-2 |
| GPU (3D) | pvrsrvkm (DDK 1.17 port) + Mesa GBM/EGL |
Working (Out-of-tree) | SGX544 MP2 active on Linux 7.2: 55 fps KMS/EGL, glmark2-es2-drm score 211, Weston 10 Wayland |
| Thermal | sun4i-ts sensor (cpu-thermal) |
Working | /sys/class/thermal/thermal_zone0/temp (~36 °C idle) |
| Audio | Allwinner sun4i-codec (sun6i-a31-codec) |
Working | Stereo DAC, Line Out (Speaker amp PL4), Headphone & Mic |
PowerVR SGX544 MP2 GPU Bring-Up on Linux 7.2
The Allwinner A31s integrates a PowerVR SGX544 MP2 rev 1.1.5 (CORE_ID 0x01191201, CORE_REVISION 0x00010105 at 0x01c40000, IRQ SPI 97, powered by AXP221 dcdc2 at 1.2 V). While mainline Linux includes the Device Tree binding (allwinner,sun6i-a31-gpu), there is no mainline kernel driver.
Key Hardware & Driver Findings
- Bank Layout & Early Bus Hang Root Cause:
- The SGX544 MP2 register space is divided into
0x0000–0x3fff(broadcast bank — writes broadcast to all cores, reads hang the AXI/AHB bus),0x4000–0x7fff(MP master bank), and0x8000 + n*0x4000(per-core banks). - Early bring-up probes hung on the first register read because they read offset
0x0020in the broadcast bank before the master bank (0x4000) and per-core clock gating controls were sequenced.
- The SGX544 MP2 register space is divided into
- Clock & Power Sequencing (
sunxiPlatform Layer):- Sequencing
dcdc2(1.2 V), PRCM power-off gating release, PLL8/PLL9, and the GPU core/hyd/mem/AHB clocks brings the MP master bank (0x4010/0x4014) and both SGX cores online cleanly.
- Sequencing
- Kernel Module (
pvrsrvkm) & Mesa Integration:- Ported the open-source
eurasia_kmkernel module to Mainline Linux 7.2, paired with a patched Mesa GBM/EGL bridge and an OpenRCpvrinit service (modprobe pvrsrvkm+pvrsrvctl --start). - Cold-boot verification: kernel module loads at ~4.96 s, SGX microkernel initializes at ~7.69 s.
- Ported the open-source
- Measured GPU Benchmarks on the 1024×768 Panel:
kms-gles(GBM + EGL + GLES2 onsun4i-drm): 55.0 fps (vsync-locked to the 54.87 Hz LVDS panel) for single-layer rendering; 27.4 fps constant across 20 blended near-full-screen layers (~430 Mpixel/s) over a 180-second soak test (4,940 frames, 32k SGX interrupts, zero hardware recoveries/lockups).glmark2-es2-drm: Completed all default benchmark scenes at 1024×768 with a score of 211 (after tuning/etc/powervr.iniParamBufferSize=33554432andMaxParamBufferSize=67108864to avoid TA parameter buffer exhaustion on complex scenes).- Wayland (
weston10.0.1): Runs on the DRM backend using the SGX544 MP2 GL renderer with a customgles-unpack-shimpreload library providingGL_EXT_unpack_subimage;weston-simple-eglruns at ~55 fps vsync-locked with Goodix multi-touch input.
Built on This Port: Wireless Android Auto Head Unit
Repository: Mechres/exper-t8e-android-auto
Using the mainline Linux 7.2 DRM, ALSA, Wi-Fi, and Goodix touch stack from this port, the tablet also serves as a standalone wireless Android Auto head unit:
phone (hotspot, AA head unit server :5277)
▲ Wi-Fi (tablet = client, phone = default gateway)
│ TLS, Android Auto protocol
┌──────┴────────────────────────────────────────────────────────────┐
│ exper-auto ── H.264 ──► ffmpeg (decode, yuv420p) ──► drm-show │
│ │ NEON bilinear scale+crop │
│ │ touch (Goodix GT911, evdev) ──► DRM overlay plane ──► LVDS panel
│ └ audio PCM ──► aplay ──► ALSA ──► 3.5 mm jack │
│ exper-powerd: power key / external power (AXP221) │
└─────────────────────────────────────────────────────────────────────┘
- Custom ARMv7 NEON Scaler (
drm-show): Because the Allwinner A31s DE1 hardware frontend scaler (sun4i-frontend) does not produce output on this SoC,drm-showimplements a hand-tuned ARMv7 NEON bilinear scaler and YUV420p-to-XRGB converter that renders 800×480 H.264 streams onto asun4i-drmplane at ~60 fps (compared to 25–40 fps with FFmpegswscale). - Native 4:3 Projection: Requests a 640×480 active UI region (
margin_width = 160) and scales it 1.6× to fill the 1024×768 panel without black bars or distortion. - Automotive Power Daemon (
exper-powerd): Monitors AXP221 VBUS/AC presence and the physical power key, blanking the backlight when ignition power cuts and shutting down cleanly after a configurable delay.
Boot Architecture
[BROM] → [boot0 / SPL] (MicroSD offset 8 KB)
↓
[U-Boot 2024.x] (MicroSD offset 40 KB, PSCI / Non-Secure HYP)
├── LCD init & splash screen (SimpleFB @ 1024x768x32)
└── Loads boot.scr → sun6i-a31s-exper-t8e-drm.dtb, zImage (cma=64M)
↓
[Linux Kernel 7.2 Mainline] (init at ~1.8 s)
├── 4× Cortex-A7 (SMP), 8250_dw serial console (PH20/PH21)
├── AXP221s PMIC on P2WI @ 0x68 (regulators, battery, power key)
├── sunxi-mmc root mount (root=/dev/mmcblk0p2), mmc1 SDIO Wi-Fi (wlan0)
├── goodix touchscreen (I2C1 0x5d), musb-sunxi USB gadget (usb0 CDC Ethernet)
└── sun4i-drm (/dev/dri/card0, LVDS-1 + HDMI-A-1) & pvrsrvkm (SGX544 MP2)
↓
[Alpine Linux 3.20 (ARMv7 OpenRC)]
├── /sbin/getty 115200 ttyS0
├── sshd listening on 172.16.42.1:22
└── wlan0 & DRM/Wayland/Android-Auto services ready
Reproducible Build Quick Start
# 1. Fetch Bootlin ARMv7 hard-float toolchain, mainline U-Boot, and Linux 7.2
bash scripts/fetch-sources.sh
# 2. Build U-Boot SPL + u-boot-sunxi-with-spl.bin
bash scripts/25-uboot-build.sh
# 3. Build mainline Linux 7.2 kernel, sun6i-a31s-exper-t8e-drm.dtb, and modules
bash scripts/30-kernel-build.sh
# 4. Assemble the Alpine Linux 3.20 ARMv7 rootfs and write bootable MicroSD image
bash scripts/45-alpine-stage1.sh
sudo bash scripts/45-alpine-stage2.sh
Device Tags: