2026-05-26 17:33:02 +02:00
|
|
|
|
<!doctype html>
|
|
|
|
|
|
<html lang="en">
|
|
|
|
|
|
<head>
|
|
|
|
|
|
<meta charset="utf-8">
|
|
|
|
|
|
<title>Flicker Investigation Continued — MIPI DSI Screen-Shift</title>
|
|
|
|
|
|
<style>
|
|
|
|
|
|
:root {
|
|
|
|
|
|
--arrive-purple: #5f016f;
|
|
|
|
|
|
--arrive-purple-dark: #3e0049;
|
|
|
|
|
|
--arrive-pink: #ff32a2;
|
|
|
|
|
|
--arrive-tint: #faf3fb;
|
|
|
|
|
|
--arrive-pink-tint: #fff0f8;
|
|
|
|
|
|
--text: #1a1a1a;
|
|
|
|
|
|
--muted: #666;
|
|
|
|
|
|
--rule: #e6dbe9;
|
|
|
|
|
|
--pass: #1a7f37;
|
|
|
|
|
|
--fail: #c62a3d;
|
|
|
|
|
|
--warn: #b58105;
|
|
|
|
|
|
}
|
|
|
|
|
|
body { font: 15px/1.55 -apple-system, BlinkMacSystemFont, "Segoe UI",
|
|
|
|
|
|
Roboto, sans-serif; max-width: 920px; margin: 0 auto;
|
|
|
|
|
|
padding: 0; color: var(--text); background: #fff; }
|
|
|
|
|
|
.page { padding: 0 28px 36px; }
|
|
|
|
|
|
.banner { background: var(--arrive-purple); padding: 18px 28px;
|
|
|
|
|
|
display: flex; align-items: center; gap: 24px;
|
|
|
|
|
|
border-bottom: 4px solid var(--arrive-pink); }
|
|
|
|
|
|
.banner .who { color: #fff; font-size: 13px; opacity: 0.95;
|
|
|
|
|
|
line-height: 1.4; }
|
|
|
|
|
|
.banner .who strong { display: block; font-size: 15px; opacity: 1;
|
|
|
|
|
|
margin-bottom: 2px; }
|
|
|
|
|
|
h1 { font-size: 26px; color: var(--arrive-purple);
|
|
|
|
|
|
border-bottom: 3px solid var(--arrive-purple); padding-bottom: 8px;
|
|
|
|
|
|
margin: 32px 0 4px; }
|
|
|
|
|
|
h2 { font-size: 19px; color: var(--arrive-purple); margin: 28px 0 8px;
|
|
|
|
|
|
border-bottom: 1px solid var(--rule); padding-bottom: 4px; }
|
|
|
|
|
|
h3 { font-size: 16px; margin: 18px 0 6px; color: var(--arrive-purple-dark); }
|
|
|
|
|
|
.meta { color: var(--muted); font-size: 13px; margin-bottom: 18px; }
|
|
|
|
|
|
.tldr { background: var(--arrive-tint); border-left: 4px solid var(--arrive-purple);
|
|
|
|
|
|
padding: 14px 18px; margin: 16px 0 24px;
|
|
|
|
|
|
border-radius: 0 6px 6px 0; }
|
|
|
|
|
|
.tldr strong { color: var(--arrive-purple); }
|
|
|
|
|
|
.disclaimer { background: #fff8e6; border-left: 4px solid var(--warn);
|
|
|
|
|
|
padding: 12px 18px; margin: 16px 0 24px;
|
|
|
|
|
|
border-radius: 0 6px 6px 0; font-size: 14px; }
|
|
|
|
|
|
.disclaimer strong { color: var(--warn); }
|
|
|
|
|
|
.straws { background: #ffe9e9; border-left: 4px solid var(--fail);
|
|
|
|
|
|
padding: 14px 18px; margin: 16px 0 24px;
|
|
|
|
|
|
border-radius: 0 6px 6px 0; font-size: 14px; }
|
|
|
|
|
|
.straws strong { color: var(--fail); }
|
|
|
|
|
|
table { border-collapse: collapse; margin: 8px 0 16px; font-size: 14px;
|
|
|
|
|
|
width: 100%; }
|
|
|
|
|
|
th, td { padding: 7px 12px; text-align: left;
|
|
|
|
|
|
border-bottom: 1px solid var(--rule); vertical-align: top; }
|
|
|
|
|
|
th { background: var(--arrive-purple); color: #fff; font-weight: 600; }
|
|
|
|
|
|
tbody tr:nth-child(even) { background: var(--arrive-tint); }
|
|
|
|
|
|
.pass { color: var(--pass); font-weight: 600; }
|
|
|
|
|
|
.fail { color: var(--fail); font-weight: 600; }
|
|
|
|
|
|
.warn { color: var(--warn); font-weight: 600; }
|
|
|
|
|
|
code { font: 13px/1.4 "SF Mono", Menlo, Consolas, monospace;
|
|
|
|
|
|
background: var(--arrive-tint); padding: 1px 5px; border-radius: 3px;
|
|
|
|
|
|
color: var(--arrive-purple-dark); }
|
|
|
|
|
|
pre { background: var(--arrive-purple-dark); color: #f7e9f9; padding: 12px 16px;
|
|
|
|
|
|
border-radius: 4px; font: 13px/1.5 "SF Mono", Menlo, Consolas, monospace;
|
|
|
|
|
|
overflow-x: auto; white-space: pre-wrap; word-wrap: break-word; }
|
|
|
|
|
|
.verdict { font-size: 17px; margin: 18px 0; padding: 16px 20px;
|
|
|
|
|
|
background: var(--arrive-pink-tint);
|
|
|
|
|
|
border: 2px solid var(--arrive-pink);
|
|
|
|
|
|
border-radius: 8px; }
|
|
|
|
|
|
.verdict strong.big { font-size: 20px; color: var(--arrive-purple); }
|
|
|
|
|
|
ul.tight li { margin-bottom: 4px; }
|
|
|
|
|
|
.footnote { color: var(--muted); font-size: 12px; margin-top: 32px;
|
|
|
|
|
|
border-top: 1px solid var(--rule); padding-top: 10px; }
|
|
|
|
|
|
.quote-callout { background: #fff; border: 1px dashed var(--arrive-purple);
|
|
|
|
|
|
padding: 10px 14px; margin: 8px 0; font-style: italic;
|
|
|
|
|
|
color: var(--arrive-purple-dark); }
|
|
|
|
|
|
.frame-gallery { margin: 12px 0 20px; display: grid;
|
|
|
|
|
|
grid-template-columns: 1fr; gap: 18px; }
|
|
|
|
|
|
.frame { margin: 0; }
|
|
|
|
|
|
.frame img { width: 100%; height: auto; display: block;
|
|
|
|
|
|
border: 1px solid #ccc; border-radius: 4px; }
|
|
|
|
|
|
.frame figcaption { font-size: 13px; color: var(--muted); margin-top: 4px;
|
|
|
|
|
|
font-style: italic; }
|
|
|
|
|
|
</style>
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
|
|
<body>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="banner">
|
|
|
|
|
|
<div class="who">
|
|
|
|
|
|
<strong>Flicker Investigation Continued</strong>
|
|
|
|
|
|
Hawk board, Digi i.MX8M Mini SoM · 2026-05-26
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="page">
|
|
|
|
|
|
|
|
|
|
|
|
<h1>Flicker Investigation Continued</h1>
|
|
|
|
|
|
<div class="meta">
|
|
|
|
|
|
Author: David Rice (Electronics) ·
|
|
|
|
|
|
Hawk unit at <code>10.32.33.157</code> · Kernel <code>6.6.44-pknbsp-svn9520</code>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<h2>1. Visual evidence — the artifact is "screen shift"</h2>
|
|
|
|
|
|
|
|
|
|
|
|
<p>Captured slow-motion phone video of the screen during a flicker event and
|
|
|
|
|
|
pulled individual frames out. Frame 362 is a clean baseline. Frames 363, 370,
|
|
|
|
|
|
376, 381, 382 are flickers. The consistent signature:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<ul class="tight">
|
|
|
|
|
|
<li>Image content is intact (no garbage colours, no noise, no black frames)</li>
|
|
|
|
|
|
<li>Image is vertically displaced or split into horizontal bands</li>
|
|
|
|
|
|
<li>Frame 381 is the clearest — the image appears stacked, multiple partial
|
|
|
|
|
|
frames at different vertical positions within one displayed frame</li>
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
<p>To my eye this is the signature of a frame-tearing / VSYNC-alignment slip.
|
|
|
|
|
|
Not a data integrity problem — a timing-alignment problem.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<p>Reference frames (slow-motion phone capture, resized for inclusion;
|
|
|
|
|
|
I have the original full-size PNGs if you want them):</p>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="frame-gallery">
|
|
|
|
|
|
<figure class="frame">
|
|
|
|
|
|
<img src="data:image/jpeg;base64,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
|
|
|
|
|
|
<figcaption>Frame 362 — baseline. Clean image.</figcaption>
|
|
|
|
|
|
</figure>
|
|
|
|
|
|
<figure class="frame">
|
|
|
|
|
|
<img src="data:image/jpeg;base64,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
|
|
|
|
|
|
<figcaption>Frame 363 — flicker. Vertical displacement; content recognisable but geometry wrong.</figcaption>
|
|
|
|
|
|
</figure>
|
|
|
|
|
|
<figure class="frame">
|
|
|
|
|
|
<img src="data:image/jpeg;base64,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
|
|
|
|
|
|
<figcaption>Frame 370 — flicker. Same vertical shift pattern.</figcaption>
|
|
|
|
|
|
</figure>
|
|
|
|
|
|
<figure class="frame">
|
|
|
|
|
|
<img src="data:image/jpeg;base64,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
|
|
|
|
|
|
<figcaption>Frame 376 — flicker. Lower-amplitude shift.</figcaption>
|
|
|
|
|
|
</figure>
|
|
|
|
|
|
<figure class="frame">
|
|
|
|
|
|
<img src="data:image/jpeg;base64,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
|
|
|
|
|
|
<figcaption>Frame 381 — flicker (most dramatic). Multi-band tearing; multiple partial frames stacked vertically.</figcaption>
|
|
|
|
|
|
</figure>
|
|
|
|
|
|
<figure class="frame">
|
|
|
|
|
|
<img src="data:image/jpeg;base64,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
|
|
|
|
|
|
<figcaption>Frame 382 — flicker. Frame after the dramatic shift; partial recovery still showing artifacts.</figcaption>
|
|
|
|
|
|
</figure>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<h2>2. Test-pattern bisection rules out the LVDS output stage and panel</h2>
|
|
|
|
|
|
|
|
|
|
|
|
<p>While a burst of flicker was actively occurring on the MIPI input path, I
|
|
|
|
|
|
enabled the SN65DSI83's internal LVDS test pattern (write <code>0x10</code>
|
|
|
|
|
|
to CSR <code>0x3C</code>, i.e. bit 4 of LVDS_FORMAT — confirmed via the known
|
|
|
|
|
|
i2cset sequence). With no other change:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
|
<thead><tr><th>SN65 source</th><th>Observed</th></tr></thead>
|
|
|
|
|
|
<tbody>
|
|
|
|
|
|
<tr><td>MIPI input (normal)</td>
|
|
|
|
|
|
<td class="fail">Flicker happening as before</td></tr>
|
|
|
|
|
|
<tr><td>Internal LVDS test pattern enabled</td>
|
|
|
|
|
|
<td class="pass">Clean colour-bar pattern, no flicker, for as long as enabled</td></tr>
|
|
|
|
|
|
<tr><td>Back to MIPI input</td>
|
|
|
|
|
|
<td class="fail">Flicker resumes</td></tr>
|
|
|
|
|
|
</tbody>
|
|
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
|
|
<p>The internal test pattern is generated <em>inside</em> the SN65 at the LVDS
|
|
|
|
|
|
output stage, downstream of the MIPI input and the MIPI-to-LVDS conversion.
|
|
|
|
|
|
The fact that it is clean while the MIPI-fed image flickers means everything
|
|
|
|
|
|
from the SN65 LVDS PLL through the panel is physically healthy. The fault
|
|
|
|
|
|
must therefore lie upstream of that point — somewhere in the i.MX DSIM
|
|
|
|
|
|
controller output, the MIPI bus, the SN65's MIPI receiver, or the SN65's
|
|
|
|
|
|
internal MIPI-to-LVDS conversion logic.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<h2>3. On-target instrumentation I built today</h2>
|
|
|
|
|
|
|
|
|
|
|
|
<p>To complement the visual capture I wrote a small Flask HTTP service that
|
|
|
|
|
|
runs on the Hawk and polls register state at high rate, plus a host-side
|
|
|
|
|
|
Python tool that drives it and records events. <strong>This is not
|
|
|
|
|
|
production-quality software</strong> — it's a measurement harness, and Claude
|
|
|
|
|
|
helped me write the Python.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
|
<thead><tr><th>File</th><th>Role</th></tr></thead>
|
|
|
|
|
|
<tbody>
|
|
|
|
|
|
<tr><td><code>device_server.py</code></td>
|
|
|
|
|
|
<td>Runs on Hawk as a systemd service. Polls SN65 registers
|
|
|
|
|
|
(<code>csr_0a</code>, <code>csr_e5</code>) every 10 ms via I²C, and a
|
|
|
|
|
|
block of DSIM registers (STATUS, CLKCTRL, CONFIG, ESCMODE, MDRESOL,
|
|
|
|
|
|
MVPORCH, MHPORCH, MSYNC, SDRESOL, INTSRC, INTMSK, PHYTIMING0/1/2)
|
|
|
|
|
|
every 500 ms via memtool. Logs transitions. Exposes endpoints to
|
|
|
|
|
|
start/stop monitoring and toggle the SN65 test pattern.</td></tr>
|
|
|
|
|
|
<tr><td><code>trigger.py</code></td>
|
|
|
|
|
|
<td>Host-side. Talks to the on-target service over HTTP, prints alerts as
|
|
|
|
|
|
events arrive, lets the operator press <code>f</code> to mark a visible
|
|
|
|
|
|
flicker observation, correlates marks against switch/unlock timing, and
|
|
|
|
|
|
writes a full session log to file.</td></tr>
|
|
|
|
|
|
<tr><td><code>display_test_nexio.py</code></td>
|
|
|
|
|
|
<td>The existing GStreamer kiosk, modified to support a UDP "switch video"
|
|
|
|
|
|
trigger and a <code>--start</code> CLI flag so the test rig can drive
|
|
|
|
|
|
switches deterministically.</td></tr>
|
|
|
|
|
|
<tr><td><code>cycle.sh</code></td>
|
|
|
|
|
|
<td>Shell-side reproducer that loops <code>echo 4 / echo 0 ></code>
|
|
|
|
|
|
<code>/sys/class/graphics/fb0/blank</code>. Drives many pipeline
|
|
|
|
|
|
restart cycles in sequence so flicker rate can be eyeballed.</td></tr>
|
|
|
|
|
|
</tbody>
|
|
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
|
|
<h2>4. Captured a burst of 93 flickers with no register-level signal</h2>
|
|
|
|
|
|
|
|
|
|
|
|
<p>In one session, with the monitor running and an operator (me) pressing
|
|
|
|
|
|
<code>f</code> on each visible flicker, I recorded a single burst of
|
|
|
|
|
|
<strong>93 visible flickers in ~29 s</strong> (~3 Hz, randomly spaced from
|
|
|
|
|
|
roughly 100 ms to 700 ms apart). All 93 marks fell within a single
|
|
|
|
|
|
~30-second window between two scheduled video switches.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<p>Throughout the burst, the on-target poller reported:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<ul class="tight">
|
|
|
|
|
|
<li>SN65 PLL stayed locked: <code>csr_0a = 0x85</code> the entire time</li>
|
|
|
|
|
|
<li>No SN65 error bits set: <code>csr_e5 = 0x00</code></li>
|
|
|
|
|
|
<li>DSIM <code>INTSRC</code> stayed at <code>0x02000018</code> (the
|
|
|
|
|
|
<code>PllStable</code> bit plus some status bits the kernel does not
|
|
|
|
|
|
clear; no transient error bits caught)</li>
|
|
|
|
|
|
<li>No DSIM configuration registers changed during the burst</li>
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
<p>So from the register-polling perspective the system looks healthy at the
|
|
|
|
|
|
sampling rates I used. I have the full session log if useful.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<h3>How confident am I that nothing happened?</h3>
|
|
|
|
|
|
|
|
|
|
|
|
<p>Less confident than the above bullet list might suggest, and I want to be
|
|
|
|
|
|
honest about that. 500 ms is a long time compared to a single video frame
|
|
|
|
|
|
(40 ms at 25 Hz), so the wide DSIM-register snapshot could easily miss a
|
|
|
|
|
|
transient that completes within one poll interval. Specifically:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<ul class="tight">
|
|
|
|
|
|
<li><strong>What I can say with confidence.</strong> The SN65 PLL did
|
|
|
|
|
|
not lose lock during the burst — that was polled at 10 ms, fast enough
|
|
|
|
|
|
to catch the ~50 ms unlocks we see around video switches, and it
|
|
|
|
|
|
caught none. The SN65 bridge did not undergo a driver-driven teardown
|
|
|
|
|
|
either (those leave a clear ~500 ms imprint, and there was nothing in
|
|
|
|
|
|
the log).</li>
|
|
|
|
|
|
<li><strong>What I might have missed.</strong> A DSIM configuration
|
|
|
|
|
|
register flipping briefly and flipping back within 500 ms would
|
|
|
|
|
|
not show up in the wide snapshot diff. Likewise <code>DSIM_INTSRC</code>
|
|
|
|
|
|
error bits are latched but the kernel's interrupt handler clears them,
|
|
|
|
|
|
typically much faster than 500 ms, so a transient error bit could be
|
|
|
|
|
|
set and cleared between my polls and I would never see it. Pure
|
|
|
|
|
|
hardware-level events that do not change any register I am polling
|
|
|
|
|
|
(e.g. a brief PHY FIFO timing slip with no associated interrupt)
|
|
|
|
|
|
are also outside what this instrumentation can detect.</li>
|
2026-05-26 17:33:37 +02:00
|
|
|
|
<li><strong>Why I did not push the wide poll faster.</strong> The
|
|
|
|
|
|
<code>memtool</code> subprocess calls have non-trivial overhead and
|
|
|
|
|
|
pushing the wide poll much below ~100 ms started loading the device CPU
|
|
|
|
|
|
and impacting the I²C poll loop.</li>
|
2026-05-26 17:33:02 +02:00
|
|
|
|
</ul>
|
|
|
|
|
|
|
2026-05-26 17:33:37 +02:00
|
|
|
|
<h3>Follow-up trial: high-rate /dev/mem mmap poll</h3>
|
|
|
|
|
|
|
|
|
|
|
|
<p>To try to see below the 500 ms ceiling I added a second poller that
|
|
|
|
|
|
bypasses <code>memtool</code> by mmap-ing <code>/dev/mem</code> directly in
|
|
|
|
|
|
Python and reading the DSIM registers via load instructions, aiming for
|
|
|
|
|
|
~1 ms resolution. A short captured window showed:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<ul class="tight">
|
|
|
|
|
|
<li><code>DSIM_CLKCTRL</code> (offset 0x008) <em>is</em> active at sub-
|
|
|
|
|
|
millisecond timescales — it flips from its steady-state value of
|
|
|
|
|
|
<code>0x02</code> to <code>0x10</code>, <code>0x100</code> or
|
|
|
|
|
|
<code>0x01</code> in 1–2 ms wide pulses, occurring roughly every
|
|
|
|
|
|
200 ms during normal operation.</li>
|
|
|
|
|
|
<li>The pulses appear at a very regular cadence and are not visibly
|
|
|
|
|
|
aligned with the video switches I was driving. The pattern looks
|
|
|
|
|
|
consistent with routine per-frame clock-enable management by the
|
|
|
|
|
|
kernel driver rather than fault-correlated events — but I am
|
|
|
|
|
|
<em>not</em> claiming to have shown that, only that the activity I
|
|
|
|
|
|
saw was regular.</li>
|
|
|
|
|
|
<li>The mmap poll at that rate destabilised the device — the full unit
|
|
|
|
|
|
(not just the userspace service) crashed/rebooted within seconds of
|
|
|
|
|
|
starting, on multiple attempts at 1 ms target rate. I therefore could
|
|
|
|
|
|
not run it long enough to mark visible flicker events and compare
|
|
|
|
|
|
timestamps against the CLKCTRL transitions.</li>
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
<p>So the most accurate position on register-level diagnostics for this
|
|
|
|
|
|
investigation is:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<ul class="tight">
|
|
|
|
|
|
<li>At the resolutions I could safely sustain (500 ms wide poll, 10 ms PLL
|
|
|
|
|
|
poll), nothing showed up during a confirmed flicker burst.</li>
|
|
|
|
|
|
<li>At higher rate (1 ms) the registers are demonstrably busy, but the
|
|
|
|
|
|
activity I captured looks like normal driver behaviour, and I could
|
|
|
|
|
|
not keep the device alive long enough to test correlation with
|
|
|
|
|
|
flicker timing.</li>
|
|
|
|
|
|
<li>The combined evidence is consistent with — but not proof of — the
|
|
|
|
|
|
fault being below register-level visibility on this rig, e.g. a
|
|
|
|
|
|
sub-frame transient timing event that does not change any register
|
|
|
|
|
|
I am able to read safely.</li>
|
|
|
|
|
|
</ul>
|
2026-05-26 17:33:02 +02:00
|
|
|
|
|
|
|
|
|
|
<h2>5. Reproducer without GStreamer or video</h2>
|
|
|
|
|
|
|
|
|
|
|
|
<p>To check whether GStreamer / userspace was contributing, I stopped both the
|
|
|
|
|
|
kiosk and the device-server service, leaving just the Linux text console on
|
|
|
|
|
|
screen. Then ran the cycle script:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<pre>echo 4 > /sys/class/graphics/fb0/blank
|
|
|
|
|
|
echo 0 > /sys/class/graphics/fb0/blank
|
|
|
|
|
|
sleep ...
|
|
|
|
|
|
(repeat)</pre>
|
|
|
|
|
|
|
|
|
|
|
|
<p>A random subset of the cycles produced the same vertical-shift artifact as
|
|
|
|
|
|
during video playback, at roughly the same hit rate. The flicker is also
|
|
|
|
|
|
visible on the U-Boot splash screen during boot, before Linux is up.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<p>As I read this, the fault is reachable from both the U-Boot DSI bring-up
|
|
|
|
|
|
path and the Linux DRM/KMS pipeline-restart path on every cycle. GStreamer is
|
|
|
|
|
|
not required and not the cause.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<h2>6. dmesg signature on every pipeline restart</h2>
|
|
|
|
|
|
|
|
|
|
|
|
<p>Every blank/unblank cycle produces this exact 3-line sequence in dmesg,
|
|
|
|
|
|
deterministically across many cycles:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<pre>mxsfb 32e00000.lcdif: [drm] magic pixel crtc=0 offset 0x3e7ffc
|
|
|
|
|
|
sn65dsi83 4-002c: Using DSI clock for LVDS
|
|
|
|
|
|
@MF@ sn65dsi83_get_dsi_range dsi_rate=216000000 mode_clock=72000000 min_rate=216000000 => range=0x2b</pre>
|
|
|
|
|
|
|
|
|
|
|
|
<p>So the SN65 bridge driver is re-initialising on every cycle (recomputing
|
|
|
|
|
|
its DSI range and re-applying LVDS configuration). The visible flicker
|
|
|
|
|
|
variability appears to be in <em>how</em> this re-init lands relative to the
|
|
|
|
|
|
panel's own scan cycle — sometimes the timing aligns and the panel locks
|
|
|
|
|
|
cleanly; sometimes it does not. But that is software-side interpretation and
|
|
|
|
|
|
I am not confident in it.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<p>At boot the dmesg also shows the line:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<pre>samsung-dsim 32e10000.dsi: @MF@ flb-flags=0x0</pre>
|
|
|
|
|
|
|
|
|
|
|
|
<p>which led me to poke around in the source code, see section 7.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<h2>7. Something I noticed in the BSP source — may well be a red herring</h2>
|
|
|
|
|
|
|
|
|
|
|
|
<p>This may turn out to be unrelated, but while poking around in the kernel
|
|
|
|
|
|
patches looking for anything that might be connected to what I am seeing,
|
|
|
|
|
|
I came across <code>flb-hack-dsi-autoflush</code> in
|
|
|
|
|
|
<code>parkeon_linux_bsp/trunk/kernel/patches-6.6/</code> (dated 2025-05-16,
|
|
|
|
|
|
authored by Martin Fuzzey). The commit message reads:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="quote-callout">
|
|
|
|
|
|
"dsi: allow forcing of FIFO flush on vsync from DT — Hack for screen shift
|
|
|
|
|
|
problem to let electronics team test while I'm on holiday..."
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<p>The phrase "screen shift" jumped out because it is exactly the words I
|
|
|
|
|
|
would use to describe the artifact I am seeing. From my limited reading of
|
|
|
|
|
|
the patch source, it looks like it adds two device-tree flags on the Samsung
|
|
|
|
|
|
DSIM driver:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
|
<thead><tr><th>Bit</th><th>Flag</th><th>What I think it does</th></tr></thead>
|
|
|
|
|
|
<tbody>
|
|
|
|
|
|
<tr><td>0</td><td><code>FLB_FLAG_AUTO_FLUSH</code></td>
|
|
|
|
|
|
<td>Clears <code>DSIM_MFLUSH_VS</code>, switching from manual FIFO flush
|
|
|
|
|
|
to auto flush on VSYNC</td></tr>
|
|
|
|
|
|
<tr><td>1</td><td><code>FLB_FLAG_NO_BURST</code></td>
|
|
|
|
|
|
<td>Clears <code>DSIM_BURST_MODE</code></td></tr>
|
|
|
|
|
|
</tbody>
|
|
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
|
|
<p>The patch also adds <code>dev_info(dev, "@MF@ flb-flags=0x%x\n",
|
|
|
|
|
|
dsi->flb_flags);</code> in <code>samsung_dsim_parse_dt()</code>, which I
|
|
|
|
|
|
believe is where the <code>@MF@ flb-flags=0x0</code> line in my boot dmesg
|
|
|
|
|
|
comes from. If that mapping is right, then the patch is in the running
|
|
|
|
|
|
kernel, but <code>flb_flags == 0</code> at runtime, and the behavioural
|
|
|
|
|
|
changes the patch adds are wrapped in two <code>if</code> blocks that both
|
|
|
|
|
|
evaluate to false:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<pre>if (dsi->flb_flags & FLB_FLAG_AUTO_FLUSH)
|
|
|
|
|
|
reg &= ~DSIM_MFLUSH_VS;
|
|
|
|
|
|
if (dsi->flb_flags & FLB_FLAG_NO_BURST)
|
|
|
|
|
|
reg &= ~DSIM_BURST_MODE;</pre>
|
|
|
|
|
|
|
|
|
|
|
|
<p>So, again from my limited understanding: it looks like this patch may have
|
|
|
|
|
|
been written as a fix associated with the same kind of artifact I am
|
|
|
|
|
|
investigating, and on the unit I have it is compiled in but not actually doing
|
|
|
|
|
|
anything because no <code>flb-flags</code> property has been set in the device
|
|
|
|
|
|
tree. If that interpretation is correct, the fix would be to add
|
|
|
|
|
|
<code>flb-flags = <1>;</code> to the DSIM device-tree node (which I
|
|
|
|
|
|
think lives in the <code>flb-dt-hawk</code> patch, but I have not opened it
|
|
|
|
|
|
to confirm).</p>
|
|
|
|
|
|
|
|
|
|
|
|
<p>I am writing this section mainly to check on its validity — or at the very
|
|
|
|
|
|
least to try to understand it. I am not making a claim that this is the fix.
|
|
|
|
|
|
Specifically I do not know:</p>
|
|
|
|
|
|
|
|
|
|
|
|
<ul class="tight">
|
|
|
|
|
|
<li>Whether matching on the commit-message phrase "screen shift" really
|
|
|
|
|
|
means the patch addresses the same issue I am seeing.</li>
|
|
|
|
|
|
<li>Whether my reading of what the two bits actually do is correct.</li>
|
|
|
|
|
|
<li>Whether the device tree is even the right place to enable it, or
|
|
|
|
|
|
whether there is a reason it has been left off on this Hawk unit.</li>
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
<p>If you can tell me whether this is a real lead or a red herring, that
|
|
|
|
|
|
alone would be very useful. And if it is a real lead, a one-line device-tree
|
|
|
|
|
|
change would let me test it against the blank/unblank reproducer immediately
|
|
|
|
|
|
— I would expect dmesg to then show <code>flb-flags=0x1</code> and the
|
|
|
|
|
|
visible flicker rate to drop sharply if the hypothesis is right.</p>
|
|
|
|
|
|
|
|
|
|
|
|
<h2>8. What I have on my side, if any of it is useful</h2>
|
|
|
|
|
|
|
|
|
|
|
|
<p>All of this lives on my workstation; happy to share any of it on request:</p>
|
|
|
|
|
|
<ul class="tight">
|
|
|
|
|
|
<li>Slow-mo phone captures of the flicker events (frames 362–382 are the
|
|
|
|
|
|
labelled examples used above)</li>
|
|
|
|
|
|
<li>Register-polling session logs from the on-target instrumentation, with
|
|
|
|
|
|
operator flicker marks</li>
|
|
|
|
|
|
<li>The on-target Flask measurement service (runs as
|
|
|
|
|
|
<code>device-server.service</code> on the Hawk)</li>
|
|
|
|
|
|
<li>The host-side CLI driver / monitor that talks to it</li>
|
|
|
|
|
|
<li>The modified GStreamer kiosk that allows remote video switching</li>
|
|
|
|
|
|
<li>The blank/unblank cycle reproducer script</li>
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="footnote">
|
|
|
|
|
|
Written 2026-05-26 to summarise the electronics-side investigation done
|
|
|
|
|
|
in a single day. Hardware observations and on-target test results are
|
|
|
|
|
|
solid; the patch interpretation in §7 is speculative and may be wrong.
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</body>
|
|
|
|
|
|
</html>
|