color wave12i48BR 1304x984 B|R - martinberlin/cale-idf GitHub Wiki

  • Size: 1304 * 984, 12.48 inches Colors: B/W/RED
  • Manufacturer: Waveshare (Added electronics/ESP32 support) / Good Display (GDEW1248Z95 epaper)
  • Controller: IL0326
  • Status: Implemented and tested. Merged in master, coming in new CalEPD release>=0.9.8
  • Partial update: Color epapers from Goodisplay do not support partial update
  • Requires: An ESP32 board with PSRAM like ESP-WROVER B: Check details
  • Out of stock: Please be aware that currently Waveshare has this epaper model marked as not available due materials shortage. This epapers are manufactured by GOOD DISPLAY, Waveshare just designed a PCB and case, so you can use an ESP32 to drive them.

Using it in your Firmware

// Waveshare/Goodisplay 12.48" Color version
#include "wave12i48BR.h" // Only to use with Edp4Spi IO
Epd4Spi io;
Wave12I48RB display(io);

void app_main()
   display.println("This is BLACK");
   display.println("This is RED");

Merged in master

As I don't own one of this Red/Black epapers this is being developed and tested in Issue 22 with the help of Xeijin

First try looked like this, after realizing I was updating only the red buffer: 12.48 epaper Reb/Black

After some days of teamwork with Xeijin we added the pixel buffers in the ESP32 PSRAM and finally after many corrections 12.48 epaper success

SPI commands specification

Commands guide PDF is here for the GDEW1248Z95 3 color epaper (Page 9: Command table)

There it specifies the commands to initialize data transfer:

0x10 is DTM1, White/Black Data

0x13 is DTM2, White/Red Data

DRAM challenge

The goal now is to save the two array buffers (Red/Black) in PSRAM. The buffer calculation formula, same as for all other epapers, is the following:


1304*984/8 = 160392 bytes

    uint8_t _buffer_black[WAVE12I48_BUFFER_SIZE];
    uint8_t _buffer_red[WAVE12I48_BUFFER_SIZE];

This will simply not work. To test it, we add the array in the header declaration, and build:

cale-epd.elf section `.dram0.bss' will not fit in region `dram0_0_seg'
             DRAM segment data does not fit.

That's right. It's impossible to fit 320 Kb in ESP32 DRAM. We should declare both of this pixel buffers in the PSRAM directly. Update after assigning both buffers directly in PSRAM on the class. Also updated the method drawPixel so it supports red and the update so it sends the buffer.

    uint8_t* _buffer_black = (uint8_t*)heap_caps_malloc(WAVE12I48_BUFFER_SIZE, MALLOC_CAP_SPIRAM);
    uint8_t* _buffer_red = (uint8_t*)heap_caps_malloc(WAVE12I48_BUFFER_SIZE, MALLOC_CAP_SPIRAM);

I wanted to thank Espressif/arduino-esp32 Gitter channel for the guidance on how to initialize this array buffers directly in PSRAM. This is the way to go to handle bigger screens than 800*480 and it just opens a world of possibilities otherwise you are always limited to the DRAM capacity of the ESP32. Like this, having at least 2 Megabytes of RAM available, much bigger screens could be handled.