Skip to content

MagTag SSD1680 contrast fix (FPC-7519rev.b only)#10992

Open
mikeysklar wants to merge 3 commits intoadafruit:mainfrom
mikeysklar:magtag-fpc7519-vcom20-v2
Open

MagTag SSD1680 contrast fix (FPC-7519rev.b only)#10992
mikeysklar wants to merge 3 commits intoadafruit:mainfrom
mikeysklar:magtag-fpc7519-vcom20-v2

Conversation

@mikeysklar
Copy link
Copy Markdown

@mikeysklar mikeysklar commented May 8, 2026

MagTag units with the SSD1680 - FPC-7519rev.b display panel show bold, blurry text with the default firmware. This fix reads the correct VCOM voltage for that panel directly from its manufacturer register and applies it automatically. All other MagTag panels are unaffected.

forum thread

initial difference between earlier SSD1680 FPC-A005 (top) and new rev: FPC-7519rev.b (bottom)


IMG_0308


final difference same panels with PR applied:


IMG_0312

The FPC-7519rev.b panel (User ID byte 0xca) shows a dark gray background
with the default VCOM=0x28. Setting VCOM=0x20 (-1.5V) gives a light gray
background with solid black text.

Surgical fix: dedicated ssd1680_vcom20_display_start_sequence and
DISPLAY_SSD1680_COLSTART_8_VCOM20 type routed to case 0xca: only.
The 0x44 and 0x00 panels are untouched.
@mikeysklar mikeysklar changed the title MagTag SSD1680 FPC-7519rev.b: VCOM=0x20 contrast fix MagTag SSD1680 contrast fix (FPC-7519rev.b only) May 8, 2026
Testing across 0x28→0x20→0x1c→0x18→0x14→0x10 confirmed 0x14 as the
sweet spot: background matches the FPC-7619rev.b panel without the dark
halo fringe artifacts that appear below 0x14.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@mikeysklar
Copy link
Copy Markdown
Author

Image for testing on new MagTag 7519rev.b with this patch.

magtag-fpc7519-vcom14.zip

Rename ssd1680_vcom20_display_start_sequence → ssd1680_vcom14_display_start_sequence
and DISPLAY_SSD1680_COLSTART_8_VCOM20 → DISPLAY_SSD1680_COLSTART_8_VCOM14 to match
the actual register value being set (0x14, not the earlier test value 0x20).

Add comment noting that VCOM=0x14 was independently confirmed by reading OTP register
0x2D on the physical panel — byte 1 of the response is 0x14, matching what the panel
manufacturer programmed as the recommended VCOM for this revision.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@dhalbert
Copy link
Copy Markdown
Collaborator

dhalbert commented May 9, 2026

The comment mentions a 7619rev.b instead of a 7519rev.b. However, I don't recollect any 7619's. I think that might be a typo. The pictures in the threads and in #10831 (superceded by #10836) only have 7519's, unless I missed one.

I tried this patch on my 7519 0x44 board. I'm not sure it's lighter but I would say it's still "blurry". I think the blurriness is easier to see on the weather demo: https://learn.adafruit.com/magtag-weather.

Here are a couple of pictures
First is original MagTag top, with a 0x44 7519 display below, both running 10.2.0.
orig-top-10 2 0-bottom

Second is the same boards, but the bottom is running a modified version of this PR that applies your VCOM14 change to both 0x44 and 0xca.
orig-top-VCOM14-bottom

@mikeysklar
Copy link
Copy Markdown
Author

mikeysklar commented May 9, 2026

Thanks for testing Dan on the ILI and SSD1680 0x44 variant.

I find this PR is only marginally better than the CircuitPython defaults. Not nearly as crisp as the orig SSD1680 or ILI0373.

I did discover the display has an OTP register which holds the recommended VCOM value and went with that.

// VCOM=0x14 (-1.0V) confirmed by reading the panel's OTP register (cmd 0x2D, byte 1 = 0x14).

Just to make sure I also did a brute-force version with a webcam and let claude cycle through other VCOM / border / etc. settings just to see if I could find something better.


IMG_0309


In terms of panel ribbon labels the FC-7619rev.b was the 0x44 you patched in February.


Panel                    | User ID byte 0 | colstart | Approx. era                  | CP fix
-------------------------|----------------|----------|------------------------------|----------------
IL0373                   | 0xff           | N/A      | 2020 – mid 2025              | always worked
FPC-A005 20.06.15 TRX    | 0x00           | 0        | Mid 2025 (first SSD1680)     | always worked
FPC-7519rev.b            | 0x44           | 8        | early 2026                   | fixed in 10.1.3
FPC-7519rev.b            | 0xca           | 8        | Spring 2026 – present        | this PR

@dhalbert
Copy link
Copy Markdown
Collaborator

dhalbert commented May 9, 2026

Aha, so you have a board with a "7619" ribbon cable. I have not seen one of these in person or in photos.

@mikeysklar
Copy link
Copy Markdown
Author

I only have two MagTags.

Both SSD1680 based:

  1. FPC-A005
  2. FPC-7519rev.b

I don't know if the label FPC-7619rev.b even truly exists, but that is what is the original board.c before I started mucking with it this week.

Regardless of ribbon label there are 0x44 and 0xca variants. Both require the coloffset=8 and have some blur / contrast needs.

@dhalbert
Copy link
Copy Markdown
Collaborator

dhalbert commented May 9, 2026

I don't know if the label FPC-7619rev.b even truly exists, but that is what is the original board.c before I started mucking with it this week.

I think that is just a typo that should be fixed. I think they are all 7519's.

There is something about the newer panels that is apparently not as good as the older ones. The gray cloud is nice and uniform on the old displays, and speckled on the new ones. This is not a photo artificact; it is how it looks:
new image vs old
image

@bablokb
Copy link
Copy Markdown

bablokb commented May 9, 2026

Have you tried changing the repeat count value? I do this in my board.c for the Pimoroni Badger2350 which also uses a SSD1680. The repeat count has an effect on contrast and also on update speed (it basically changes the number of times the display "flashes" during update). The implementation allows the user to change this at runtime.

During development, I tried all kinds of waveforms: from the Adafruit-driver, from Wasveshare and from Pimoroni. It seems like VCOM is not the only thing to take into account.

@mikeysklar
Copy link
Copy Markdown
Author

mikeysklar commented May 9, 2026

@dhalbert - that is a good comparison with the clouds. I'm going to try a few more settings and complex patterns. I have some test code that allows me to quickly drop in different settings without full rebuilds.

@bablokb - good point about repeat count. Testing various other parameters now.

RP - Repeat Period
TP - Timing
FR - frame rate
XON = all-gates-on

IMG_0313

@mikeysklar
Copy link
Copy Markdown
Author

mikeysklar commented May 9, 2026

Made some good progress with test patterns and weather example has improved. It is more crisp and the contrast is close. Still some speckle noise.

Thoughts?

test build used for these examples:

adafruit_magtag_2.9_grayscale-fpc7519-vcom24-g2sr04.uf2.zip

test pattern

IMG_0329 (1)



weather example:

IMG_0330

Made changes to support both 0x44 and 0xca with these settings. I've only tested on 0xca.

Before After
VCOM 0x14 0x24
G2 Frames 2 1
G2 SR2 0x05 0x04

Terminology / Changes in this round:

LUT — Waveform table voltage pulses to apply to each pixel per refresh cycle.

VCOM — Common electrode bias voltage; higher value = softer drive = lighter output. Raised from 0x140x24 to reduce over-drive and suppress speckle in gray areas.

G2 — Final settle phase of the LUT that sharpens blacks after the main refresh. Shortened from 2 frames → 1 frame to reduce differential drive between adjacent pixels.

G2 SR2 — Bitmask controlling which pixel transition types get driven during G2. Narrowed from 0x05 (white→black + white→white) → 0x04 (white→black only), so the settle phase only acts on pixels actually transitioning to black, eliminating speckle in dithered gray regions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants