Appendix · reference

PinePhone Pro schematic support map

Board-level features from the public PinePhone Pro schematics, mapped to FreeBSD support status and work logs.

This page is the board map: every hardware block we care about from the PinePhone Pro schematics, what the chip exposes to the OS, what our FreeBSD tree supports today, and where the work is documented.

It is not a replacement for the PDF. Keep the schematic open while using this page:

Status legend

Compute, boot, and storage

Rockchip RK3399S SoC — ● working

Schematic role: application processor; dual Cortex-A72 cluster, quad Cortex-A53 cluster, integrated clocks/resets, pinctrl, GPIO, I2C, SPI, UART, I2S, PWM, SARADC, USB2/USB3 controllers, display pipeline, MIPI DSI, HDMI, eDP/DP-capable PHY blocks, SD/MMC controllers, IOMMU, and Mali-T860 GPU.

FreeBSD support: SMP boots all six cores from SD. The tree uses the FreeBSD stable/15 arm64 kernel with Rockchip clock, reset, pinctrl, GPIO, I2C, PWM, SD/MMC, USB, DRM/KMS, and LinuxKPI DRM pieces layered by the mise patch pipeline. The normal development loop is documented in Building from source.

Gaps: power management is still crude. No suspend/resume target, no CPUfreq/OPP polish, no thermal/battery policy, and no upstream-ready consolidation of the Rockchip-specific hacks.

microSD, eMMC, SPI NOR — ● working

Schematic role: removable SD boot media, soldered 128 GB eMMC, and 16 MiB SPI NOR for U-Boot.

FreeBSD support: SD boot is the primary target. SPI flash contains rk2aw plus Megi’s U-Boot with SD-first boot order, so kernel testing does not require holding a volume key. eMMC is detected, but the active workflow intentionally leaves the phone booting from removable SD.

Work logs: Boot from SD and Build environment.

Display, GPU, and graphics

RK3399 VOP + DW-MIPI-DSI + HX8394 panel — ● working

Schematic role: 720x1440 portrait panel, four-lane MIPI DSI path, PWM backlight, panel reset/enable GPIOs, and EFI framebuffer handoff during boot.

FreeBSD support: the panel is driven by the Rockchip DRM display pipeline, custom DW-MIPI-DSI plumbing, and the HX8394 panel driver. Console output appears on the framebuffer, then Sway uses DRM/KMS.

Gaps: occasional first-frame/resume artifacts remain. Brightness is available at the backlight layer but not yet exposed as a finished phone UI control.

Work logs: Display from black.

ARM Mali-T860 MP4 / Panfrost — ● working

Schematic role: Midgard GPU attached behind the SoC GPU MMU.

FreeBSD support: Panfrost attaches, exposes the DRM render node, and Sway uses the Mali GPU rather than forced pixman. On kernel #77, closing the GL client no longer panics after the per-file MMU/GEM/job lifetime fix in be91afa. On 2026-05-05, kernel #172 added usable OPP-aware DVFS: idle sits mostly at 297 MHz / 825 mV, sustained glxgears ramps to 594 MHz / 925 mV, and the visible Sway/Xwayland test measured roughly 1448 FPS in auto mode.

Gaps: thermal-soak policy, Hyprland, browser/WebGL, and longer shader-heavy stress runs still need validation. Current instrumentation is good enough to capture the next fault, but the driver is not yet upstream-clean.

Work logs: GPU under load and GPU debugging.

USB, Type-C, and external I/O

Synopsys DWC3, USB2PHY, TCPHY — ● working

Schematic role: USB-C data path, OTG/peripheral mode, internal USB host path for the modem, USB2 PHY, USB3/TCPHY, and DisplayPort-capable alt-mode PHY wiring.

FreeBSD support: DWC3 gadget mode exposes the phone as a CDC Ethernet device. USB networking is the management lifeline and is intentionally kept even now that WiFi works. The internal USB host side can enumerate the EG25-G modem once powered.

Gaps: Type-C role/PD integration is not complete, USB3/DisplayPort alt mode is not validated, and modem policy is still userspace-driven.

Work logs: USB-Ethernet up and DWC3 gadget from scratch.

FUSB302 Type-C controller — ● working

Schematic role: USB-C CC controller for cable orientation, attach detection, and USB PD messaging.

FreeBSD support: sink-mode USB-PD r3.0 negotiation works on the bench: the phone requests 9 V / 3 A, reaches Ready, and the rk818 charger raises its input-current limit on that transition.

Gaps: proper Type-C source-role / OTG policy, hard-reset recovery without manual reattach, and DP-alt-mode policy.

Radios and networking

AzureWave AP6255: Broadcom BCM43455 WiFi — ◐ partial

Schematic role: SDIO WiFi function with WL_REG_ON, out-of-band interrupt, firmware, board NVRAM, and CLM regulatory blob.

FreeBSD support: native bwfm(4) SDIO WiFi works end-to-end on the bench at the protocol level: firmware loads, PPP-specific NVRAM and CLM load, scan results are visible, WPA2/PSK association completes through wpa_supplicant, DHCP binds wlan0, and bounded 2 MiB transfers complete without CMD53/rx/tx driver errors.

Recent fix: the RK3399 DWMMC host now delivers in-band SDIO function interrupts. The important register detail was Rockchip-specific: Linux uses SDIO interrupt bit 24 for slot 0, while the generic DWMMC bit is 16. c312250 dwmmc: use Rockchip SDIO interrupt bit teaches the FreeBSD host to use sdio_mask=0x01000000, and 9703c32 bwfm: defer SDIO IRQ tasking during attach prevents the first real IRQ from running the bwfm_sdio task before attach/deferred init is ready. On 2026-05-05, kernel #160 completed the 2 MiB bidirectional transfer receipt logs/wifi-transfer/20260505-095119-sdio-bit24-irq-active.log with irqmode=irq-active-watchdog, dev.rockchip_dwmmc.0.sdio_intrs=515, cmd53_err=0, rx_err=0, and tx_err=0.

Recent fix: firmware power policy is now explicit rather than baked into the init path. 2458d80 bwfm: expose firmware power save control adds dev.bwfm_sdio.0.power_save; 1 applies FAST_PS + MPC (pm=2 mpc=1) for low-power operation, while 0 applies CAM + MPC-off (pm=0 mpc=0) for throughput experiments.

Gaps: throughput is still poor even with IRQs active and PM/MPC forced off: SSH-based 2 MiB legs took 78-79 s, and a local 16 MiB HTTP fetch over WiFi stayed around 42-43 KB/s before and after the unrelated rk_vop interrupt storm was fixed by fb81d0f rk_vop: mask vblank interrupts when idle . That moves the open problem from host IRQ delivery or firmware power save to the bwfm_sdio data path, firmware credit/window handling, glomming, or another scheduler limit above the host interrupt layer.

Work logs: Where we are and What’s next, with the runnable sequence in Finishing plan.

AzureWave AP6255: Broadcom BCM4345C5 Bluetooth — ● working

Schematic role: UART HCI Bluetooth side of the same combo module, with BT_REG_ON, BT_HOST_WAKE, and BT_DEV_WAKE.

FreeBSD support: HCI over UART works with patchram upload, Murata-compatible firmware, SSP pairing, AES-CCM encryption, and A2DP audio out to a Bluetooth speaker.

Gaps: orchestration is still script-heavy. ng_h4frame and the A2DP userland pieces need upstream-quality packaging.

Work logs: BT attach, HOST_WAKE, SSP / Murata, and A2DP.

Quectel EG25-G modem and GNSS — ◐ partial

Schematic role: internal USB LTE modem with reset, PWRKEY, AP_READY, W_DISABLE_N, status pins, ring indicator, audio lines, and GNSS support.

FreeBSD support: repeatable GPIO power sequencing can enumerate the modem as a multi-port USB serial device. AT commands answer on the expected /dev/cuaU* ports.

Gaps: SIM/data path, ECM/PPP policy, SMS/call UI, audio routing for voice calls, GNSS extraction, and boot-time power policy are not done. The project is intentionally not focusing on SIM/cellular until the rest of the pocket-computer path is less fragile.

Work logs: Where we are and Mobile software.

Audio, buttons, LEDs, and sensors

Realtek RT5640 codec + AW8737 speaker amp — ● working

Schematic role: I2S audio codec, headphone/earpiece/loudspeaker routing, microphone bias, headset detect, and external speaker amplifier.

FreeBSD support: I2S0 plus RT5640 playback produces audible sound through the phone loudspeaker. Internal DMIC capture is confirmed on kernel #190 with the div3/edge3/adc32 RT5640 default. The volume keys drive a themed on-screen volume meter in Sway through omfreebdy.

Gaps: consuming the DTS headphone-detect GPIO, analog headset mic, earpiece, clean speaker/headset routing policy, echo/gain policy, and call-audio routing are still open.

Work logs: On-device audio and work log 2026-05-06.

Goodix GT917S touchscreen — ● working

Schematic role: I2C capacitive touchscreen with reset GPIO and interrupt line.

FreeBSD support: multitouch works under Wayland. Goodix IRQ delivery is live and omfreebdy starts lisgd against the Goodix evdev node for edge gestures.

Gaps: deeper touch power-management states are not implemented.

Work logs: Goodix and PIC methods.

SARADC volume keys and GPIO power/ring keys — ● working

Schematic role: resistor-ladder volume buttons on SARADC plus GPIO power and ring/wakeup inputs.

FreeBSD support: rk_saradc and rk_adc_keys emit KEY_VOLUMEUP/KEY_VOLUMEDOWN. The side power button emits KEY_POWER and omfreebdy binds it to Sway output power on/off instead of suspend.

Gaps: wake-from-suspend semantics are blocked until suspend/resume exists.

RGB notification LEDs and vibrator — ◐ partial

Schematic role: GPIO-driven red/green/blue notification LEDs plus a small vibration motor.

FreeBSD support: /dev/led/led-red, /dev/led/led-green, and /dev/led/led-blue work. omfreebdy wraps them with phone-led and a narrow root helper. The vibration motor (GPIO3_B1) now has a Linux-compatible gpio-vibrator node and a first EV_FF / FF_RUMBLE driver candidate.

Gaps: the haptic path is compile-checked but not bench-verified. See component-vibrator for the evdev upload/play predicates and the remaining suspend/resume work.

STK3311 ALS/proximity and MPU-6500 accel/gyro — ◐ partial

Schematic role: ambient light/proximity sensor and six-axis IMU on I2C, with interrupt lines available.

FreeBSD support: both devices attach and expose raw sysctls. STK3311 reports chip ID, raw proximity/light values, and IRQ-backed near/far state; MPU-6500 reports WHO_AM_I and raw accel/gyro/temperature.

Gaps: calibration, orientation policy, ALS backlight policy, and opt-in proximity screen blanking are userland/driver follow-ups.

Work logs: Where we are and What’s next.

Magnetometer / compass — ◐ partial

Schematic role: compass sensor on I2C for heading/orientation.

FreeBSD support: AF8133J DTS identity and a polled raw-axis driver candidate are in this tree; bench confirmation is pending.

Gaps: confirm attach/sample movement on phone, then add scaling, calibration, and optional DRDY interrupt handling.

Power, charging, and privacy controls

RK818 PMIC, battery gauge, charger, regulators — ◐ partial

Schematic role: system rails, battery charging/gauge, RTC, power-key integration, and regulator sequencing for always-on and switched domains.

FreeBSD support: the PMIC/regulator path is good enough to boot and keep the phone alive. Several drivers rely on fixed regulators or local sequencing rather than a complete phone power policy.

Gaps: battery percentage/charging UI, hardware thermal trips, suspend/resume rail transitions, and safe low-battery shutdown are not complete.

Hardware privacy switches and serial jack — ● working

Schematic role: kill switches for modem, WiFi/Bluetooth, microphone, cameras, and UART routing through the 3.5 mm jack.

FreeBSD support: the switches are hardware-enforced; the OS mostly observes the resulting absence/presence of devices. The 1500000 baud headphone-jack UART is the post-boot serial console when switch #6 is in the right position.

Gaps: no desktop UI yet exposes switch state as a first-class status surface.

Cameras

Sony IMX258 rear, OmniVision OV8858 front, LED flash — ◐ partial

Schematic role: MIPI CSI camera modules and flash control.

FreeBSD support: no camera pipeline exists in this tree, but the SGM3140 flash LED now has a two-GPIO gpioled overlay and bounded bench helper.

Gaps: FreeBSD lacks the Linux media-controller/V4L2-style camera stack this phone expects. This is phase-four work, after the phone is otherwise useful.

Short version

The map is no longer dominated by “unknown.” The phone has working boot, networking, display, touch, audio, WiFi, Bluetooth, LED, buttons, and raw sensors. The remaining work is mostly power policy, cellular policy, camera infrastructure, suspend/resume, and turning local driver work into upstreamable patches.