Files
MiPi_TEST/flicker_investigation_report.html
david rice d73aa2f2a4 Changes
2026-05-11 16:14:19 +01:00

354 lines
45 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>MIPI DSI Flicker — Root Cause Investigation</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 img { height: 64px; width: auto; display: block;
border-radius: 4px; }
.banner .who { color: #fff; font-size: 13px; opacity: 0.9;
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); }
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); }
th { background: var(--arrive-purple); color: #fff; font-weight: 600; }
td.num { text-align: right; font-variant-numeric: tabular-nums; }
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; }
pre.diagram { background: var(--arrive-tint); color: var(--text);
border-left: 4px solid var(--arrive-purple); }
.verdict { font-size: 18px; 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: 22px; 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; }
</style>
</head>
<body>
<div class="banner">
<img src="data:image/png;base64,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AACQnNAKAAAAAACA5IRWAAAAAAAAJCe0AgAAAAAAIDmhFQAAAAAAAMkJrQAAAAAAAEhOaAUAAAAAAEByQisAAAAAAACSE1oBAAAAAACQnNAKAAAAAACA5IRWAAAAAAAAJCe0AgAAAAAAIDmhFQAAAAAAAMkJrQAAAAAAAEhOaAUAAAAAAEByQisAAAAAAACSE1oBAAAAAACQnNAKAAAAAACA5IRWAAAAAAAAJCe0AgAAAAAAIDmhFQAAAAAAAMkJrQAAAAAAAEhOaAUAAAAAAEByQisAAAAAAACSE1oBAAAAAACQnNAKAAAAAACA5IRWAAAAAAAAJCe0AgAAAAAAIDmhFQAAAAAAAMkJrQAAAAAAAEhOaAUAAAAAAEByQisAAAAAAACSE1oBAAAAAACQnNAKAAAAAACA5IRWAAAAAAAAJCe0AgAAAAAAIDmhFQAAAAAAAMkJrQAAAAAAAEhOaAUAAAAAAEByQisAAAAAAACSE1oBAAAAAACQnNAKAAAAAACA5IRWAAAAAAAAJCe0AgAAAAAAIDmhFQAAAAAAAMkJrQAAAAAAAEhOaAUAAAAAAEByQisAAAAAAACSE1oBAAAAAACQnNAKAAAAAACA5IRWAAAAAAAAJCe0AgAAAAAAIDmhFQAAAAAAAMkJrQAAAAAAAEhOaAUAAAAAAEByQisAAAAAAACSE1oBAAAAAACQnNAKAAAAAACA5IRWAAAAAAAAJCe0AgAAAAAAIDmhFQAAAAAAAMkJrQAAAAAAAEhOaAUAAAAAAEByQisAAAAAAACSE1oBAAAAAACQnNAKAAAAAACA5IRWAAAAAAAAJCe0AgAAAAAAIDmhFQAAAAAAAMkJrQAAAAAAAEhOaAUAAAAAAEByQisAAAAAAACSE1oBAAAAAACQnNAKAAAAAACA5IRWAAAAAAAAJCe0AgAAAAAAIDmhFQAAAAAAAMkJrQAAAAAAAEhOaAUAAAAAAEByQisAAAAAAACSE1oBAAAAAACQnNAKAAAAAACA5IRWAAAAAAAAJCe0AgAAAAAAIDmhFQAAAAAAAMkJrQAAAAAAAEhOaAUAAAAAAEByQisAAAAAAACSE1oBAAAAAACQnNAKAAAAAACA5IRWAAAAAAAAJCe0AgAAAAAAIDmhFQAAAAAAAMkJrQAAAAAAAEhOaAUAAAAAAEByQisAAAAAAACSE1oBAAAA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AAAAANIJrQAAAAAAAEgntAIAAAAAACCd0AoAAAAAAIB0QisAAAAAAADSCa0AAAAAAABIJ7QCAAAAAAAgndAKAAAAAACAdEIrAAAAAAAA0gmtAAAAAAAASCe0AgAAAAAAIJ3QCgAAAAAAgHRCKwAAAAAAANIJrQAAAAAAAEgntAIAAAAAACCd0AoAAAAAAIB0QisAAAAAAADSCa0AAAAAAABIJ7QCAAAAAAAgndAKAAAAAACAdEIrAAAAAAAA0gmtAAAAAAAASCe0AgAAAAAAIJ3QCgAAAAAAgHRCKwAAAAAAANIJrQAAAAAAAEgntAIAAAAAACCd0AoAAAAAAIB0QisAAAAAAADSCa0AAAAAAABIJ7QCAAAAAAAgndAKAAAAAACAdEIrAAAAAAAA0gmtAAAAAAAASCe0AgAAAAAAIJ3QCgAAAAAAgHRCKwAAAAAAANIJrQAAAAAAAEgntAIAAAAAACCd0AoAAAAAAIB0QisAAAAAAADSCa0AAAAAAABIJ7QCAAAAAAAgndAKAAAAAACAdEIrAAAAAAAA0gmtAAAAAAAASCe0AgAAAAAAIJ3QCgAAAAAAgHRCKwAAAAAAANIJrQAAAAAAAEgntAIAAAAAACCd0AoAAAAAAIB0QisAAAAAAADSCa0AAAAAAABIJ7QCAAAAAAAgndAKAAAAAACAdEIrAAAAAAAA0gmtAAAAAAAASCe0AgAAAAAAIJ3QCgAAAAAAgHRCKwAAAAAAANIJrQAAAAAAAEgntAIAAAAAACCd0AoAAAAAAIB0QisAAAAAAADSCa0AAAAAAABIJ7QCAAAAAAAgndAKAAAAAACAdEIrAAAAAAAA0gmtAAAAAAAASCe0AgAAAAAAIJ3QCgAAAAAAgHRCKwAAAAAAANIJrQAAAAAAAEgntAIAAAAAACCd0AoAAAAAAIB0QisAAAAAAADSCa0AAAAAAABIJ7QCAAAAAAAgndAKAAAAAACAdEIrAAAAAAAA0gmtAAAAAAAASCe0AgAAAAAAIJ3QCgAAAAAAgHRCKwAAAAAAANIJrQAAAAAAAEgntAIAAAAAACCd0AoAAAAAAIB0QisAAAAAAADSCa0AAAAAAABIJ7QCAAAAAAAgndAKAAAAAACAdEIrAAAAAAAA0gmtAAAAAAAASCe0AgAAAAAAIJ3QCgAAAAAAgHRCKwAAAAAAANIJrQAAAAAAAEgntAIAAAAAACCd0AoAAAAAAIB0/w9T1XH95rH4WQAAAABJRU5ErkJggg==" alt="Arrive">
<div class="who">
<strong>Hardware Engineering</strong>
Display interface investigation
</div>
</div>
<div class="page">
<h1>MIPI DSI Flicker — Root Cause Investigation</h1>
<div class="meta">
Display flicker on i.MX 8M Mini → SN65DSI83 → LVDS panel<br>
Investigation period: May 7 May 11, 2026 ·
Author: David Rice
</div>
<div class="tldr">
<strong>TL;DR.</strong> The flicker is caused by the
<code>PUT&nbsp;/video&nbsp;stop</code> path on the i.MX, not by signal-integrity
on the MIPI bus, not by the SN65DSI83 itself, and not by the panel.
Each video stop tears down the DSI HS-clock; the SN65's PLL loses lock
for 1545&nbsp;ms (13 display frames); on the subsequent start, the
PLL must re-acquire and the LVDS output is briefly garbled — the
visible flicker. <strong>Fix:</strong> change "stop" semantics so the
HS-clock keeps running (e.g. GStreamer <code>PAUSED</code> instead of
<code>NULL</code>), or simply avoid stopping video in production.
</div>
<h2>1. The problem</h2>
<p>
An i.MX 8M Mini SoC drives a SN65DSI83 MIPI-DSI → LVDS bridge into an
LCD panel. Under steady-state operation the display sometimes flickers.
Initial hypothesis: a MIPI bit-error or signal-integrity issue on the
CLK or data lanes.
</p>
<h2>2. Investigation summary</h2>
<table>
<thead><tr><th>Phase</th><th>Approach</th><th>Result</th></tr></thead>
<tbody>
<tr><td>1 proto decoder</td>
<td>Decode raw MIPI bursts from differential captures, look for byte-level anomalies</td>
<td><span class="fail">Inconclusive.</span> Capture coverage was ~0.0004% of time
(20 µs windows on a 10 s cycle). Flicker events not captured.</td></tr>
<tr><td>2 segmented memory</td>
<td>Use scope's segmented-memory mode to capture 100 LP-trigger events per acquisition
(~50× higher coverage), analyse per-segment</td>
<td><span class="warn">Negative result.</span> Flicker and non-flicker captures
statistically indistinguishable across all LP-state metrics.</td></tr>
<tr><td>3 SN65 register monitor</td>
<td>High-rate HTTP polling of SN65DSI83's status registers
(<code>csr_0a</code>, <code>csr_e5</code>) to catch transient PLL events
the post-event snapshot missed</td>
<td><span class="pass">Smoking gun found.</span> PLL unlocks during flicker
sessions, never during good sessions.</td></tr>
<tr><td>4 Pulse-width characterisation</td>
<td>100 Hz polling (median 20 ms) to measure actual unlock pulse width</td>
<td>Pulse width <strong>1545 ms</strong> (13 display frames). Too short for
a software-driven clock pause; too short for a brownout-and-restart.
Consistent with a brief clock-lane disturbance.</td></tr>
<tr><td>5 Cycling vs hold</td>
<td>Compare PLL behaviour under continuous video to behaviour under
on/off cycling</td>
<td><span class="pass">Definitive.</span> 0 unlocks in 10 min 51 s of
continuous video. 30 unlocks in 9 min of cycling. The cycling is
the trigger.</td></tr>
<tr><td>6 Transition isolation</td>
<td>Time-correlate every unlock against each <code>PUT&nbsp;/video&nbsp;start</code>
and <code>PUT&nbsp;/video&nbsp;stop</code> event</td>
<td><span class="pass">Conclusive.</span> 100% of unlocks happen 225259 ms
after <code>stop</code>. 0% after <code>start</code>.</td></tr>
</tbody>
</table>
<h2>3. Key data</h2>
<h3>3.1 Continuous video (hold) — baseline</h3>
<table>
<thead><tr><th>Run</th><th class="num">Duration</th><th class="num">PLL unlocks</th>
<th class="num">Rate</th><th class="num">I²C read errors</th></tr></thead>
<tbody>
<tr><td>Hold (no cycling)</td><td class="num">650.9 s</td>
<td class="num pass">0</td><td class="num pass">0.0/min</td>
<td class="num pass">0.0%</td></tr>
</tbody>
</table>
<h3>3.2 Video on/off cycling</h3>
<table>
<thead><tr><th>Run</th><th class="num">Duration</th><th class="num">Cycles</th>
<th class="num">PLL unlocks</th><th class="num">Unlocks / cycle</th></tr></thead>
<tbody>
<tr><td>May 11 — 30 unlock-recovery pairs</td>
<td class="num">~9 min</td><td class="num">~54</td>
<td class="num fail">30</td><td class="num fail">0.56</td></tr>
<tr><td>May 11 — controlled (17 cycles)</td>
<td class="num">177 s</td><td class="num">17</td>
<td class="num fail">8</td><td class="num fail">0.47</td></tr>
</tbody>
</table>
<h3>3.3 Unlock pulse-width distribution</h3>
<table>
<thead><tr><th>Metric</th><th class="num">Value</th><th>Notes</th></tr></thead>
<tbody>
<tr><td>min</td> <td class="num">14.5 ms</td><td>under 1 frame at 60 Hz</td></tr>
<tr><td>median</td> <td class="num">21.3 ms</td><td>~1.3 frames</td></tr>
<tr><td>p90</td> <td class="num">40.0 ms</td><td>~2.4 frames</td></tr>
<tr><td>max</td> <td class="num">44.5 ms</td><td>~2.7 frames</td></tr>
</tbody>
</table>
<div class="verdict">
<strong class="big">Transition-isolation verdict (n = 8)</strong><br><br>
Unlocks <strong>after STOP:</strong>&nbsp;&nbsp;<strong>8 / 8 &nbsp;(100%)</strong>&nbsp; ·
median offset <strong>230 ms</strong> (range 225259 ms)<br>
Unlocks <strong>after START:</strong>&nbsp;&nbsp;0 / 8 &nbsp;(0%)<br>
Unlocks unattributable to either:&nbsp;&nbsp;0 / 8 &nbsp;(0%)
</div>
<h2>4. Mechanism</h2>
<pre class="diagram">
PUT /video stop arrives
│ ~5 ms HTTP / Flask processing
│ ~50-150ms App + GStreamer pipeline tears down
│ (state goes to NULL)
DSIM driver disables HS_CLK_EN ──────► ~230 ms after stop
MIPI CLK lane goes to LP-11
SN65DSI83 sees no reference clock
PLL drops lock ◄── csr_e5.pll_unlock = 1 caught here
(pulse width 15-45 ms)
PLL re-acquires to "no-signal" idle state
(~500 ms OFF window)
PUT /video start
DSIM re-enables HS_CLK_EN; MIPI traffic resumes
SN65DSI83 PLL has to re-acquire to the new clock
│ (~10-30 ms, LVDS output is garbage during this)
──── visible flicker on the panel ────
</pre>
<p>
The bridge is behaving correctly: a PLL is expected to lose lock when its
reference clock disappears. The defect is upstream — the act of
<em>stopping the video</em> drops the MIPI HS-clock, which puts the bridge
through an unlock-relock cycle every time, and the next start has to
re-acquire from cold. That re-acquisition window is the visible flicker.
</p>
<h2>5. Recommended fix</h2>
<p>Two orthogonal options. Either should eliminate the flicker.</p>
<h3>5.1 Don't tear the pipeline down</h3>
<p>
In the device-side video stack, change the "stop" path from a full
teardown to a soft pause that <strong>keeps the DSI HS-clock running</strong>.
For GStreamer:
</p>
<pre>// Today (causes flicker):
gst_element_set_state(pipeline, GST_STATE_NULL);
// Proposed:
gst_element_set_state(pipeline, GST_STATE_PAUSED);
</pre>
<p>
<code>PAUSED</code> retains the pipeline graph and buffers — and, importantly,
doesn't trigger the bridge-disable path in the i.MX DSIM driver, so HS-CLK
stays on and the SN65 PLL stays locked through the transition. Resume is
near-instant and visually clean.
</p>
<h3>5.2 Don't stop video in production</h3>
<p>
If the only reason <code>/video stop</code> is called in real deployments
is the flicker test harness itself, the flicker mode is purely an artefact
of the test. Production code that starts the stream once at boot and
leaves it running will see <strong>zero</strong> PLL unlocks (confirmed
empirically — 0 unlocks in 10 min 51 s of continuous video).
</p>
<h3>5.3 Verify the fix</h3>
<p>
Once the device server gains a soft-stop action (e.g.
<code>{"action": "pause"}</code>), <code>compare_stops.py</code> in this
repo runs an A/B test automatically:
</p>
<pre>STYLES = [
("stop_full", {"action": "start", "mode": "static-pink"}, {"action": "stop"}),
("stop_pause", {"action": "start", "mode": "static-pink"}, {"action": "pause"}),
]
$ python3 compare_stops.py --cycles 30
</pre>
<p>
A successful fix will show <code>~0.5</code> unlocks/cycle for
<code>stop_full</code> and <code>0.00</code> for <code>stop_pause</code>.
</p>
<h2>6. Tools developed</h2>
<table>
<thead><tr><th>Script</th><th>Purpose</th></tr></thead>
<tbody>
<tr><td><code>sn65_monitor.py</code></td>
<td>Polls SN65 status registers at 50100 Hz, logs every PLL transition with
millisecond timestamps. Rolling 30 s buffer dumped to JSON on
<code>f</code>/<code>g</code> keypress.</td></tr>
<tr><td><code>video_cycler.py</code></td>
<td>Toggles <code>/video</code> start/stop on the device on a configurable
cadence. Logs every transition to a CSV. Has a <code>--hold</code>
mode for the no-cycling baseline.</td></tr>
<tr><td><code>analyze_session.py</code></td>
<td>Cross-references the latest SN65 log with the latest cycle log,
classifies each unlock as "after_START / after_STOP / neither",
prints a verdict.</td></tr>
<tr><td><code>compare_stops.py</code></td>
<td>Runs a controlled A/B/… test across multiple stop-style payloads.
Polls SN65 inline, attributes unlocks to the active style,
prints a comparison table. Use this to verify the eventual fix.</td></tr>
</tbody>
</table>
<h2>7. Open questions</h2>
<ul class="tight">
<li><strong>The rare catastrophic black-screen mode.</strong> Most unlocks
recover cleanly within ~40 ms. Twice during the investigation a
flicker resulted in a persistent black screen. That is presumably the
same root cause but where PLL re-acquisition fails outright; eliminating
the trigger should eliminate the rare variant too, but worth
confirming with extended runs.</li>
<li><strong>The 8 % of "good" sessions that contained early unlock activity.</strong>
One <code>f</code> press on 11 May (08:33:28) had zero PLL activity in
the preceding minute, suggesting either an observation false-positive
or a separate, sub-poll-rate fault path. Worth keeping the
<code>sn65_monitor</code> running in any future regression testing
to catch.</li>
<li><strong>Device-side endpoint additions.</strong> Three small additions
would close out the diagnostic kit:
<ul>
<li><code>POST /video</code> support for <code>action=pause</code>
(GStreamer <code>GST_STATE_PAUSED</code>)</li>
<li><code>/registers</code> to expose the runtime DSIM registers
<code>DSIM_STATUS</code>, <code>DSIM_CLKCTRL</code>,
<code>DSIM_INTSRC</code>, <code>DSIM_FIFOCTRL</code> alongside the
existing PHY-timing config registers</li>
<li><code>GET /video/state</code> exposing the GStreamer pipeline
state (NULL / READY / PAUSED / PLAYING), which would let us
time-correlate the actual pipeline state transitions with the
PLL unlock window</li>
</ul>
</li>
</ul>
<div class="footnote">
Investigation traces, raw register snapshots, and the analysis scripts
are in this repository under <code>data/sn65_log/</code>,
<code>data/cycle_logs/</code>, and <code>data/compare_logs/</code>.
Each timestamped run is independently reproducible.
</div>
</div> <!-- /.page -->
</body>
</html>