Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 16 additions & 18 deletions libs/display/FreeInkDisplay/src/driver/Ssd1677Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -425,24 +425,22 @@ void Ssd1677Driver::displayImpl(EpdBus& bus, const uint8_t* fb, const uint8_t* p
// the single-pass HALF (0xD7 "_updateFull"); it never runs the multi-flash OTP
// full waveform (0xF7 is a dead fallback branch there). Promote to HALF where
// the board has one; boards without (Sticky) promote to their vendor FULL.
if (!turnOff) {
if (_needsInitialFull) {
// First paint after boot/wake must not be a differential FAST: it only drives
// pixels that differ from the RED baseline, so it can't clear whatever is
// physically on the panel (the boot screen) and that ghosts through. But a HALF
// or FULL the caller already asked for is non-differential (BYPASS_RED) and
// clears the panel + seeds the baseline on its own — honor it and just consume
// the one-shot. Only upgrade a FAST request. This keeps the boot logo (a HALF)
// from paying an extra multi-inversion FULL-waveform flash on top of its own.
if (mode == RefreshMode::Fast) mode = RefreshMode::Full;
_needsInitialFull = false;
mode = (_cfg.halfSeqOverride != 0) ? RefreshMode::Half : RefreshMode::Full;
} else if (!_isScreenOn && _cfg.fullSeqOverride == 0) {
// X4-class cold start: panel asleep -> a (warmed) HALF full-clear. Override
// boards skip this — their fast sequence self-powers, so _isScreenOn is false
// every page and forcing HALF would make every page a slow full-waveform flash.
mode = RefreshMode::Half;
}
if (_needsInitialFull) {
// First paint after boot/wake must not be a differential FAST: it only drives
// pixels that differ from the RED baseline, so it can't clear whatever is
// physically on the panel (the boot screen) and that ghosts through. But a HALF
// or FULL the caller already asked for is non-differential (BYPASS_RED) and
// clears the panel + seeds the baseline on its own — honor it and just consume
// the one-shot. Only upgrade a FAST request. This keeps the boot logo (a HALF)
// from paying an extra multi-inversion FULL-waveform flash on top of its own.
if (mode == RefreshMode::Fast) mode = RefreshMode::Full;
_needsInitialFull = false;
mode = (_cfg.halfSeqOverride != 0) ? RefreshMode::Half : RefreshMode::Full;
} else if (!turnOff && !_isScreenOn && _cfg.fullSeqOverride == 0) {
// X4-class cold start: panel asleep -> a (warmed) HALF full-clear. Override
// boards skip this — their fast sequence self-powers, so _isScreenOn is false
// every page and forcing HALF would make every page a slow full-waveform flash.
mode = RefreshMode::Half;
}

// Leaving grayscale content without the firmware's cleanup: stock parity — the
Expand Down