The displays & cluster override
The dash has 4 physical panels, but the i.MX6 drives only 2 video outputs:
| Logical display | Output | Physical panel |
|---|---|---|
[0] Integrated screen | LVDS (built-in) | center infotainment (the Android UI) |
[1] HDMI screen | HDMI (presentation) | right small portrait panel (cluster media area) |
The driver speed/SoC cluster and the left portrait panel are separate ECUs — not reachable from this Android. The reachable right panel is only the top-left crop of the HDMI canvas (~264 × 464 px, portrait, with a slight keystone skew to allow for).
Painting above the OEM
The OEM paints the cluster from a very high window layer. A normal application window is drawn under it. Because a system-signed app runs as uid.system, it can add a system-level overlay window bound to display [1] that lands above the OEM layer, so our content wins.
Two gotchas that cost hours:
screencapdoes not capture this overlay (hardware-overlay path) — verify on the physical panel, not a screenshot.- The overlay must be fully opaque when active; a partly-transparent fill lets the OEM show
through.
Implemented: a speed-limit sign + “SLOW DOWN” appears on the right panel when the over-speed rule fires, and is transparent otherwise. See speedwarning.
