GDEW0154Z04

From Exploitee.rs

"Although the information we release has been verified and shown to work to the best our knowledge, we cant be held accountable for bricked devices or roots gone wrong."

GDEW0154Z04 is the controller for the Waveshare 1.54inch ePaper display module. This display module can be found for ~$30 online and is ideal for projects that require very little power consumption and infrequent updates. It features a black layer and a red layer.

Command Set

This controller accepts commands over SPI. While the basics are documented by the manufacturer, several commands and parameters are poorly or not documented.


Command Parameter bytes Description Notes
00 1 Panel Setting Parameter bits:
  • 0x80: Unknown, set in documentation.
  • 0x40: Unknown, set in documentation.
  • 0x20: Unknown, unset in documentation.
  • 0x10: If set, disables the red layer. This makes refreshes twice as fast, but can leave a red tint. It's possible to set this bit after drawing on the red layer; any unrefreshed pixels will remain red.
  • 0x08: If set, flips the image horizontally.
  • 0x04: If set, rotates the image 180 degrees.
  • 0x02: If unset, the display will not refresh.
  • 0x01: If unset, the display will not power on. (Image remains, but does not respond to commands.)
01 4 Power Setting First parameter bits:
  • 0x04: Unknown; if unset, the display seems to not work correctly.
  • 0x02: Same as 0x01?
  • 0x01: If set, use internal generation circuit for +VDH; if unset, use external source. (There does not seem to be any way to provide the external source with this module.)

Second parameter: unknown; documentation says it should always be zero.

Third parameter: Positive voltage for red LUT. Range 2.4 to 8.0V, step 0.2V. High 3 bits unused.

Fourth parameter: Negative voltage for red LUT. Range -2.4 to -8.0V, step 0.2V. High 3 bits unused.

02 0 Power Off Turn off logic. BUSY line will go low. Image remains on screen.
03 1 Gate Voltage
04 0 Power On Turn on logic.
06 3 Booster Soft Start Unknown use; possibly not supported by this controller.

Each parameter byte is a drive strength. The manual states that all should be zero, but in its example code uses values 0x07, 0x06, 0x05, and states that bits 3 and 4 are used as well.

0C 3 Soft Start Possibly same as 0x06 for a different controller.
10 varies Start Transmission (Black) Issue this command, then send data for black pixels.
11 ? RAM Data Entry Mode Possibly not supported by this controller.
12 0 Refresh Refreshes the display. Takes ~8 seconds (or 4 if red layer is disabled).
13 varies Start Transmission (Red) Issue this command, then send data for red pixels.
20 15 Upload Waveform (Black layer VCOM) Parameters are the waveform LUT data.
21 15 Upload Waveform (White)
22 15 Upload Waveform (Black)
23 15 Upload Waveform (G1) Unknown what G1 refers to. Doesn't seem to do anything.
24 15 Upload Waveform (G2) Unknown what G2 refers to.
25 15 Upload Waveform (Red layer VCOM)
26 15 Upload Waveform (Red layer white)
27 15 Upload Waveform (Red)
2C 1 VCOMVol Unknown. Possibly meant for another controller.
30 1 PLL Control Parameter bits 0-2 are N, 3-5 are M.

Manual suggests value 0x39 for temperatures >= 30, 0x2A otherwise. (But doesn't specify Celsius or Fahrenheit, and there's no way to read out the temperature with this module.) Changing these values can make the display refresh very slowly. I haven't found any value that makes it faster.

3A 1 Dummy Line Apparently sets the number of extra lines transferred but not shown. May be for another controller.
3B 1 Gate Time Unknown, maybe for another controller.
3C 1 Border Unknown, maybe for another controller.
40 0 Temperature Sensor Command (TSC) Returns 2-byte temperature over DOUT. However, this module does not expose DOUT, so this is not useful.
41 1 Temperature Sensor Setting Parameter: 0x80=use external sensor, 0x00=internal. (No way to connect external sensor to this module.)
42 3 TSW (Temperature Sensor Write?)
43 2 TSR (Temperature Sensor Read?)
44 2 Set RAM Area X Unknown, maybe for another controller.
45 4 Set RAM Area Y
4E 1 Set RAM Pointer X
4F 2 Set RAM Pointer Y
50 1 VCOMM & Data Interval Setting Parameter bits:
  • 0x10: If set, inverts the display (swaps black/white).
  • 0x0F: Unknown; mentioned in manual but not explained.
60 1 Unknown Undocumented; affects update region. Parameter:
  • 00 to 17: Updates normally.
  • 18: Blanks most pixels; updates the border; updates the display very faintly.
  • 19 to FF: Updates border only.
61 3 Resolution Setting Tells the controller the resolution of the display.
  • First parameter: vertical size.
  • Second parameter: horizontal size (high byte).
  • Third parameter: horizontal size (low byte).

This can be changed after drawing, allowing to refresh only some rows.

71 0 Get Status Useless, since no DOUT line.
80 1 Unknown Undocumented. If parameter bit 0x01 is set, the module shuts down immediately. (Will not respond to commands until powered on again.)
82 1 VCM_DC Setting Parameter: VCOM value (0 to -3.0V, step 0.1V). Anything beyond -3.0 is clamped to -3.0.
F0 1 Booster Source Voltage Unknown, maybe for different controller.


Partial Refresh

Although the manual states that partial refresh is not supported, it is in fact possible to achieve in a limited fashion:

  1. Issue command 0x61 (Resolution Setting) to change the vertical resolution to something less than 200 pixels.
  2. Issue commands 0x10/0x13 and send pixel data for the number of rows you specified.
  3. Issue command 0x12 to refresh.

Result: Only the number of rows specified in step 1 are refreshed; the others remain unchanged.

Probably a true partial refresh could be achieved if some command were found to set the number of columns and first row/column. (Changing horizontal resolution only distorts the image; it will still refresh the entire row.)

In addition, you can use command 0x00 to toggle the 180 degree rotation. The partial refresh will still affect the "top" N rows, so this allows you to refresh only the "bottom" N rows, with the caveat that you must rotate the image data you send.

You can also turn off the red layer (using command 0x00) and issue a partial refresh; the refreshed rows' red layer will go blank, but the remaining rows are unaffected. This allows for faster refreshing (only 4 seconds instead of 8) if you don't need any red pixels in those rows.

Command 0x60 may be interesting for this as well?


Alternate Waveforms

The waveform LUT data is provided by the manufacturer and not documented. By changing this data it's possible to improve the refresh.

Original waveforms:

  • VCOM B/W: 0x0E, 0x14, 0x01, 0x0A, 0x06, 0x04, 0x0A, 0x0A, 0x0F, 0x03, 0x03, 0x0C, 0x06, 0x0A, 0x00
  • White: 0x0E, 0x14, 0x01, 0x0A, 0x46, 0x04, 0x8A, 0x4A, 0x0F, 0x83, 0x43, 0x0C, 0x86, 0x0A, 0x04
  • Black: 0x0E, 0x14, 0x01, 0x8A, 0x06, 0x04, 0x8A, 0x4A, 0x0F, 0x83, 0x43, 0x0C, 0x06, 0x4A, 0x04
  • G1: 0x8E, 0x94, 0x01, 0x8A, 0x06, 0x04, 0x8A, 0x4A, 0x0F, 0x83, 0x43, 0x0C, 0x06, 0x0A, 0x04
  • G2: 0x8E, 0x94, 0x01, 0x8A, 0x06, 0x04, 0x8A, 0x4A, 0x0F, 0x83, 0x43, 0x0C, 0x06, 0x0A, 0x04
  • VCOM Red: 0x03, 0x1D, 0x01, 0x01, 0x08, 0x23, 0x37, 0x37, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  • Red 0: 0x83, 0x5D, 0x01, 0x81, 0x48, 0x23, 0x77, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  • Red 1: 0x03, 0x1D, 0x01, 0x01, 0x08, 0x23, 0x37, 0x37, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

Modified:

These were created by the highly scientific method of lowering high-looking numbers. The result is much smoother (fade out and back in) without annoying flicker, but does leave some ghost images, so it may be best to switch back to the originals and issue a full refresh periodically. I have no idea if using these for a long time might damage the display!

  • White: 0x00, 0x14, 0x01, 0x0A, 0x06, 0x04, 0x8A, 0x0A, 0x0F, 0x03, 0x03, 0x0C, 0x06, 0x0A, 0x00
  • Black: 0x0E, 0x00, 0x01, 0x00, 0x06, 0x04, 0x8A, 0x0A, 0x0F, 0x03, 0x03, 0x0C, 0x06, 0x4A, 0x04
  • Red 0: 0x00, 0x50, 0x01, 0x81, 0x48, 0x23, 0x77, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  • Others same as original.

By changing the last two digits of the Black waveform, the display will appear very faint; maybe a pseudo-grayscale can be achieved?

Online discussion suggests that each byte is four two-bit values, for the pixel transitions 11, 10, 01, 00.


By not uploading G1 or G2 at all, or by setting them to all 0x00 or all 0xFF, the refresh is a bit faster. Other values can make it extremely slow. There doesn't seem to be any change to the display quality.