"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.
This controller accepts commands over SPI. While the basics are documented by the manufacturer, several commands and parameters are poorly or not documented.
|00||1||Panel Setting||Parameter bits:
|01||4||Power Setting||First parameter bits:
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.|
|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:
|60||1||Unknown||Undocumented; affects update region. Parameter:
|61||3||Resolution Setting||Tells the controller the resolution of the display.
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.|
Although the manual states that partial refresh is not supported, it is in fact possible to achieve in a limited fashion:
- Issue command 0x61 (Resolution Setting) to change the vertical resolution to something less than 200 pixels.
- Issue commands 0x10/0x13 and send pixel data for the number of rows you specified.
- 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?
The waveform LUT data is provided by the manufacturer and not documented. By changing this data it's possible to improve the refresh.
- 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
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.