Skip to content

Primary Display

Spec hygiene (CLAUDE.md rule 1). This document does not restate canonical values (resolution, framebuffer dims, cell size, color palette). Those live in CLAUDE.md’s Canonical Hardware Specification. Any value inline is a bug — fix it.


The Elecrow 7” IPS is the primary visible surface — a 1024×600 RGB565 framebuffer the operator looks at, rendered by the KN-86 native renderer per ADR-0036. Cell density is per-region via integer-scaled 8×8 glyphs: 128×75 is the 1× cell ceiling (8 px per cell on a 1024×600 panel — 1024 = 128×8, 600 = 75×8), with 2×, 3×, and larger scales available for headlines and dense overlays. The 128×150 half-block pseudo-pixel canvas (sub-cell vertical resolution via U+2580 / U+2584) is preserved from ADR-0027. The default phosphor is AMBER #E6A020 on black, with WHITE #F0F0F0 and GREEN #33F033 selectable via the SYS-tab aesthetic-mode picker per ADR-0034.

Row layout is non-negotiable:

  • Row 0 — firmware status bar (top). nOSh-runtime-owned.
  • Rows 1–73 — cartridge content area. 73 rows of usable surface.
  • Row 74 — firmware action bar (bottom). nOSh-runtime-owned.

Cartridges never draw on Row 0 or Row 74. CIPHER glyphs never render on the primary grid (one sanctioned exception: the Null cartridge, per CLAUDE.md Spec Hygiene Rule 6 + ADR-0015 §3a). All other CIPHER content goes to the auxiliary-display.md.

For the panel model, resolution, text grid dimensions, font cell, color, and display modes, see CLAUDE.md Canonical Hardware Specification.


⚠ LEGACY (superseded twice — by ADR-0027 on 2026-06-07, then by ADR-0036 on 2026-06-13). The 960×600 logical framebuffer / 12×24 cell / 32 px letterbox / SDL composition model below is retired. Canonical geometry is now a 1024×600 RGB565 framebuffer with per-region cell density via integer-scaled 8×8 glyphs (128×75 = 1× cell ceiling: 1024 = 128×8, 600 = 75×8), rendered by the KN-86 native framebuffer renderer directly to /dev/fb0 — no logical framebuffer, no Linux console PSF, no setfont, no tty1 handoff, no letterbox. The detailed rewrite of this section + the /dev/fb0 kiosk bring-up (replacing the SDL/HDMI steps below) is tracked in the nOSh re-flow task. Retained here as design history until that lands.

Per ADR-0014 (Accepted 2026-04-21 — superseded):

  • Logical framebuffer: 960×600 pixels. KN86_FRAMEBUFFER_WIDTH = 960; KN86_FRAMEBUFFER_HEIGHT = 600 in kn86-emulator/src/types.h.
  • Physical cell: 12×24 px on the Elecrow. KN86_CELL_WIDTH = 12; KN86_CELL_HEIGHT = 24.
  • Source font: 8×8 Press Start 2P bitmap (KN86_FONT_WIDTH = 8, KN86_FONT_HEIGHT = 8), rendered at 1× horizontal / 2× vertical scale, centered in the 12×24 cell with 2 px horizontal / 4 px vertical padding. Glyph origin: (col × 12 + 2, row × 24 + 4).
  • Composition onto the 1024×600 panel: scale = 1, 32 px horizontal letterbox per side, 0 px vertical letterbox. Integer scale throughout the pipeline. The 32 px bands read as intentional bezel.
  • BITMAP mode canvas: the full 960×600 logical framebuffer. The 32 px horizontal letterbox is invisible to cartridges.

The font asset stays at 8×8; a native 12×24 cut is queued as quality-upgrade follow-up (ADR-0014 §F1).


SignalFromToNotes
mini-HDMIPi Zero 2 W mini-HDMI portElecrow HDMI inputUse a mini-HDMI to full-HDMI adapter or short cable (BOM line 4).
PowerKN-86 main 5 V rail (Waveshare UPS Module 3S, ADR-0038)Display 5 V inputThe display runs off the device’s main 5 V / 5 A rail — the dominant load on it (~1.5–2 A typical with the panel on). See power.md.

The Pi drives HDMI from /boot/config.txt overrides (see Bring-up below). SDL3 on Linux composes the 960×600 logical framebuffer onto the 1024×600 panel surface with the 32 px letterbox baked in.


AMBER #E6A020 foreground on #000000 background by default — selectable between three phosphor schemes (AMBER / WHITE / GREEN) via the SYS-tab aesthetic-mode picker per ADR-0034 (as amended 2026-06-13 per ADR-0036). The grid is single-foreground at any given moment; inversion (fg/bg swap) provides the semantic “second color.” The font is Press Start 2P 8×8 plus a CP437 box-drawing subset for layout work. See software/api-reference/grammars/character-set.md for the full glyph set, the KN-86 Code Page (extended for ADR-0036), and the planned ~2,000-glyph Unicode subset (Layer 2).

Native framebuffer rendering means there is no 12×24 logical cell, no 8×8-with-padding step, and no letterbox — glyphs blit directly to /dev/fb0 at the per-region integer scale per ADR-0036.


The Elecrow runs off the KN-86 main 5 V rail from the Waveshare UPS Module 3S (ADR-0038) — it is the dominant load on that rail. Power topology lives in power.md. Because the display is now on the battery, backlight dim/blank during nOSh soft-idle is the highest-leverage runtime saving; it is a Pi-driven HDMI command, not a hardware switch.


The display module mounts behind a 3D-printed bezel cutout in the lid panel of the Pelican 1170 inset. Foam in the lid is cut to seat the display; the Pelican shell itself is unmodified. See enclosure.md. A clear acrylic / polycarbonate sheet sits behind the bezel as a display window.


Stage 1 in build-specification.md §4:

  1. Power the Elecrow from the KN-86 main 5 V rail (Waveshare UPS Module 3S; see power.md).
  2. Connect mini-HDMI from the Pi to the Elecrow input.
  3. Edit /boot/config.txt to force HDMI at 1024×600 native and disable HDMI compensation modes.
  4. Boot, verify SDL3 renders at 960×600 logical with 32/0 letterbox onto 1024×600 physical.
  5. Verify the 80×25 grid lays out correctly with Row 0 / Rows 1–23 / Row 24 partitioning.

The bitmap-rendering perf pass on Pi Zero 2 W (ADR-0014 §F2) measures the 960×600 render path under typical cartridge load. File a perf-optimisation task only on a real budget miss.


BOM line 2 in sourcing-guide.md. Single supplier: Elecrow direct. Locked to this specific panel — discontinuation forces a display-swap ADR and CAD respin. Buy a spare panel early; this is one of the high-risk sourcing items.

The mini-HDMI adapter / cable is BOM line 4 (Adafruit / Amazon).