Google LG Nexus 5 LG hammerhead Qualcomm MSM8974 Snapdragon 800 · Krait 400 armv7 RO-OS · mainline 6.16
Nexus 5 · 2013 · daily driver

The pure-Google flagship,
running mainline.

Google's own KitKat-era phone — the last of the Nexus line built with LG and the first to wear Android's translucent status bar — now boots an unmodified 6.16 kernel on RO-OS, with an open GPU driver stock Android never had and battery intelligence protecting the oldest cell in the fleet.

Kernel
6.16.12
GPU
Adreno 330 (a3xx)
SoC
MSM8974 · Krait 400
Android life
4.4 KitKat → 6.0 Marshmallow
Kernel jump
3.4 → 6.16
50%hw parity
11 of 22 subsystems live
Phase P5 · GPU + Wayland

Hardware

Every subsystem, and exactly where it stands.

WorkingIn progressBlocked / portingNot started

Display / panel

LIVE

MDP5 DSI controller lit via mainline KMS; 1080×1920 IPS portrait.

fd900100.display-controller · 1080×1920

Touchscreen

LIVE

Synaptics RMI4 touch surface on the mainline driver, feeding SXMO gestures.

RMI4 · Synaptics

WiFi

LIVE

brcmfmac BCM4339 SDIO; device NVRAM sourced from the AOSP device tree.

wlan0 · BCM4339

Bluetooth

LIVE

BCM4339 UART via btbcm + BCM4335C0.hcd firmware.

hci0 · BCM4335C0

GPU — display

LIVE

Adreno 330 (a3xx) rendering through mainline freedreno — no closed Adreno blob, unlike stock KitKat.

fdb00000.gpu · a3xx DRM

GPU — DVFS

FREQ-ONLY

Frequency-only OPP table (27/200/320 MHz) works; voltage scaling needs opp-microvolt entries + vdd/vddcx regulator phandles to the pm8841 RPM.

devfreq · no DVFS

CPU freq scaling

IN FLIGHT

Krait clock controller wired; OPP patch (operating-points-v2-krait-cpu + QFPROM speedbin) written and queued for CI verification. See sprint.

krait-cc · patch 0003

ADSP

LIVE

remoteproc1 boots the audio DSP firmware image.

remoteproc1 · Q6

Sensors

LIVE

mpu6515 IMU, ak8975 compass, bmp280 baro, apds9930 prox/ALS — all four read via iio.

iio:device* · 4 sensors

Battery + charger

PARTIAL

Capacity reads correctly and batteryd's protective 80/75% charge band is live in the image; the max17040 driver just doesn't yet honor DT power-supplies for charge state.

max17040 · cap ok

Notification LED

LIVE

rgb:status LED wired with a charging trigger.

led:rgb:status

Vibration

LIVE

pwm_vibra with FF_RUMBLE — the felt-parity motor.

pwm_vibra · FF_RUMBLE

Backlight

LIVE

lcd-backlight sysfs, full 0–255 range.

lcd-backlight

USB networking

FLAKY

Gadget net works but drops on screen-off — ci_hdrc runtime-autosuspend disabled in modem-start, end-to-end fix still settling.

usb0 · autosuspend

Touch gestures (SXMO)

LIVE

lisgd hooks configured — swipe nav live on the compositor.

lisgd · SXMO

Double-tap-to-wake

WIRED · UNVERIFIED

Shipped into the image — dt2w, touch-boost and feltd now build for this device and launch from the SXMO session. Screen-off here is a DPMS blank, and the RMI4 touch controller runs in nosleep mode so it stays powered and keeps reporting taps — no suspend-wake gesture bit needed. Not yet confirmed on glass.

RMI4 · nosleep-mode=1

Audio

NO UPSTREAM DRIVER

WCD9320 codec has no mainline driver — the hardest single blocker on this device; full SLIMBUS + MFD + ASoC dep chain is missing.

WCD9320 · SLIMBUS

Modem

CRASH-LOOP

MDM9x55 mpss crash-loops every ~40s; suspected missing BIMC ICC interconnect path (MASTER_MSS_PROC → SLAVE_EBI1) that upstream doesn't wire yet.

mpss · ~40s loop

Camera

PORTING

No mainline CAMSS driver for MSM8974 — OV8825 rear and 1.3MP front sensors sit unprobed.

OV8825 · no CAMSS

HW video decode

QUEUED

No Venus/VIDC support on MSM8974 in mainline.

Venus · absent

Suspend/resume

BLOCKED

s2idle blocked by the USB autosuspend interaction plus modem wake events — needs both fixed first.

s2idle · blocked

NFC

QUEUED

PN544 present on the board; needs DT wire-up, not started.

PN544

Beyond Android

Kernel-level capabilities the frozen 3.4 firmware never allowed — the parity ceiling raised, not just met.

6.16

A living kernel

An unmodified upstream 6.16 kernel, targeting 7.x — where Android froze forever at Linux 3.4.

A decade-plus of security fixes and driver work stock KitKat never received.
⚡

Battery intelligence

batteryd ships in the image with a protective 80/75% charge band and continuous State-of-Health telemetry.

This 2013 pack is the oldest in the fleet — Android just trickled it to 100% and left it plugged in for over a decade.
⇄

Gesture nav + haptics

lisgd swipe gestures drive SXMO today, with pwm_vibra hardware ready for haptic commit; paired audio cues are fleet-wide design work still pending.

A modern touch-UX layer the Holo/KitKat nav bar — tied to hardware buttons — never offered.
◱

Double-tap-to-wake

Now wired into the image — the RMI4 touch controller runs in nosleep mode through a DPMS screen blank, so a double-tap wakes the panel. On-glass confirmation is the last step.

A capability the stock firmware never shipped on this generation at all.
▲

Open GPU driver

Adreno 330 rendering through mainline freedreno + Mesa — clean-room, no closed vendor blob.

Stock KitKat depended on Qualcomm's proprietary Adreno driver, unsupported and unpatched for years now.

Road to RO-OS

Where the phase ladder puts this device today, and what the next rung means.

P0
Boots
P1
Access
P2
Display+Touch
P3
Connectivity
P4
Core I/O
P5
GPU+Wayland
P6
RO-OS shell
P7
Full parity

Target track:Track 3 — RO Lite — freedreno-only GL, ~2 GB RAM, stripped RO or sway/SXMO with core physics and no blur; touch-boost carries the "snappy" feel since the GPU ceiling is fixed. No Waydroid on this tier.

P6 for this device means the bespoke RO read-only shell itself running on hammerhead: double-tap-wake through the mainline Synaptics RMI4 path, DPMS blank/wake tied to the power key, auto + locked rotation, and lisgd-style swipe gestures promoted from SXMO into RO proper. None of P6 is code-complete yet fleet-wide — N5 is well positioned to be an early Track-3 candidate once RO itself exists.

% model: P0≈5% · P1≈15% · P2≈30% · P3≈45% · P4≈60% · P5≈75% · P6≈90% · P7=100% — hammerhead sits at P5, three-quarters of the way up the ladder, with the felt-parity floor (haptics ✓, gestures ✓, audio cues pending) already partly built underneath it.

Live sprint

What's on the bench right now.

In flight

CPU frequency scaling — the last register

✓
Krait clock controller wired

krait-cc landed and CPU clocks are hooked up for cpufreq — the prerequisite the Krait 400 cores needed before any OPP table could attach.

84e7bb5 · nexus5: add krait-cc clock controller
✓
OPP patch drafted

Patch 0003 adds operating-points-v2-krait-cpu + the QFPROM speedbin NVMEM cell the Krait cpufreq driver requires — written and sitting in the pmaports overlay.

patch 0003 · queued in overlay
3
Trigger CI, verify on-device

Build the overlay and check scaling_available_frequencies populates and the governor actually steps — the OPP table has never been confirmed live on real hardware yet.

next CI run · cpu0/cpufreq

The die, and what it drives

Every block coloured by what has been proven on hardware; every wire labelled with the bus it really runs on. The idle engines read as the holes they are — nothing here is illustrative.

MSM8974 · SNAPDRAGON 800 KRAIT 400 ×4 2.26 GHz · no cpufreq ADRENO 330 freedreno · a330 fw MDP5 display controller DSI-1 1080×1920 SDCC eMMC + SDIO ci_hdrc USB OTG gadget SLIMbus bus up · no codec LPASS / ADSP remoteproc1 boots MPSS modem q6v5 crash-loop ~40 s TSENS 12 zones 37–55 °C BLSP i2c ×2 sensors · NFC · touch QFPROM speedbin for OPP krait-cc — CPU CLOCK CONTROLLER REMOVED 2026-08-09 · hung the boot before console · cpufreq-dt cannot attach without it (-19) aboot (LG) stock · secure-boot, unlocked lk2nd 23.1 boot part · reads ext2 /boot extlinux → vmlinuz 6.16.12 + 6 DT patches initramfs 3.12 usb-net + debug shell switch_root → OpenRC → sway JDI panel 1080×1920 card0-DSI-1 · msmdrmfb DSI ×4 lanes WLED backlight lcd-backlight 0–255 Synaptics RMI4 i2c · dt2w, nosleep-mode i2c PWM vibrator clk_pwm · never observed BCM4339 WiFi wlan0 DOWN · fw −2 SDIO BCM4339 BT hci0/hci1 · BCM4335C0.hcd UART Cellular / GNSS blocked by mpss loop QMI WCD9320 codec NO MAINLINE DRIVER speaker · mic · headset all dead behind this gap SLIMbus PM8941 PMIC regulators · RTC · pwrkey RGB LED (LPG) bq24192 + max17048 charger + fuel gauge 95 % · Not charging mpu6515 · ak8975 accel + magnetometer direct i2c — unaffected qcom_smgr sensor hub sns.reg firmware missing (−2) → −ETIMEDOUT · apds9930 ALS/prox behind it BOOT REACHED — 2026-08-09, build a5b0ffe5 lk2nd → extlinux → kernel 6.16.12 → initramfs (usb-net + debug shell) → switch_root → OpenRC → seatd → sway/SXMO SSH over usb0 · display lit · GPU firmware loaded at t+158 s · first on-device artifacts this repo has ever held for lg-hammerhead
energized — proven on hardware charging — in progress derezzed — blocked dormant — parked / no path

every label traced in BRINGUP_NEXUS5.md