olikraus 8 سال پیش
والد
کامیت
9ffb649af9
34فایلهای تغییر یافته به همراه529 افزوده شده و 375 حذف شده
  1. 1 0
      examples/full_buffer/FPS/FPS.ino
  2. 1 0
      examples/full_buffer/GraphicsTest/GraphicsTest.ino
  3. 1 0
      examples/full_buffer/HelloWorld/HelloWorld.ino
  4. 1 0
      examples/full_buffer/PrintUTF8/PrintUTF8.ino
  5. 1 0
      examples/full_buffer/SelectionList/SelectionList.ino
  6. 1 0
      examples/full_buffer/U8g2Logo/U8g2Logo.ino
  7. 1 0
      examples/page_buffer/Chinese/Chinese.ino
  8. 1 0
      examples/page_buffer/Clock/Clock.ino
  9. 1 0
      examples/page_buffer/ContrastTest/ContrastTest.ino
  10. 1 0
      examples/page_buffer/DirectAccess/DirectAccess.ino
  11. 1 0
      examples/page_buffer/ExtUTF8/ExtUTF8.ino
  12. 1 0
      examples/page_buffer/FPS/FPS.ino
  13. 1 0
      examples/page_buffer/FlipMode/FlipMode.ino
  14. 2 1
      examples/page_buffer/GraphicsTest/GraphicsTest.ino
  15. 1 0
      examples/page_buffer/HelloWorld/HelloWorld.ino
  16. 1 0
      examples/page_buffer/Japanese/Japanese.ino
  17. 1 0
      examples/page_buffer/Korean/Korean.ino
  18. 7 2
      examples/page_buffer/PowerSaveTest/PowerSaveTest.ino
  19. 1 0
      examples/page_buffer/PrintHelloWorld/PrintHelloWorld.ino
  20. 1 0
      examples/page_buffer/PrintUTF8/PrintUTF8.ino
  21. 1 0
      examples/page_buffer/ScrollingText/ScrollingText.ino
  22. 2 1
      examples/page_buffer/SelectionList/SelectionList.ino
  23. 2 1
      examples/page_buffer/U8g2Logo/U8g2Logo.ino
  24. 1 0
      examples/page_buffer/XBM/XBM.ino
  25. 1 0
      examples/page_buffer/XORTest/XORTest.ino
  26. 2 1
      extras/ChangeLog
  27. 1 1
      library.properties
  28. 72 0
      src/U8g2lib.h
  29. 24 0
      src/U8x8lib.h
  30. 3 0
      src/clib/u8g2.h
  31. 24 0
      src/clib/u8g2_d_setup.c
  32. 2 0
      src/clib/u8x8.h
  33. 10 0
      src/clib/u8x8_cad.c
  34. 357 368
      src/clib/u8x8_d_il3820_296x128.c

+ 1 - 0
examples/full_buffer/FPS/FPS.ino

@@ -271,6 +271,7 @@
 //U8G2_SSD1606_172X72_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 // End of constructor list
 

+ 1 - 0
examples/full_buffer/GraphicsTest/GraphicsTest.ino

@@ -155,6 +155,7 @@
 //U8G2_SSD1606_172X72_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 // End of constructor list
 

+ 1 - 0
examples/full_buffer/HelloWorld/HelloWorld.ino

@@ -154,6 +154,7 @@
 //U8G2_SSD1606_172X72_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 // End of constructor list
 

+ 1 - 0
examples/full_buffer/PrintUTF8/PrintUTF8.ino

@@ -157,6 +157,7 @@
 //U8G2_SSD1606_172X72_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 // End of constructor list
 

+ 1 - 0
examples/full_buffer/SelectionList/SelectionList.ino

@@ -154,6 +154,7 @@
 //U8G2_SSD1606_172X72_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 // End of constructor list
 

+ 1 - 0
examples/full_buffer/U8g2Logo/U8g2Logo.ino

@@ -155,6 +155,7 @@
 //U8G2_SSD1606_172X72_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 // End of constructor list
 

+ 1 - 0
examples/page_buffer/Chinese/Chinese.ino

@@ -157,6 +157,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/Clock/Clock.ino

@@ -159,6 +159,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/ContrastTest/ContrastTest.ino

@@ -156,6 +156,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/DirectAccess/DirectAccess.ino

@@ -160,6 +160,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/ExtUTF8/ExtUTF8.ino

@@ -156,6 +156,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/FPS/FPS.ino

@@ -335,6 +335,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/FlipMode/FlipMode.ino

@@ -151,6 +151,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 2 - 1
examples/page_buffer/GraphicsTest/GraphicsTest.ino

@@ -155,7 +155,8 @@
 //U8G2_UC1611_EA_DOGXL240_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);   // SW SPI, Due DOGXL240 Test Board
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
-U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/HelloWorld/HelloWorld.ino

@@ -156,6 +156,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/Japanese/Japanese.ino

@@ -157,6 +157,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/Korean/Korean.ino

@@ -157,6 +157,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 7 - 2
examples/page_buffer/PowerSaveTest/PowerSaveTest.ino

@@ -150,6 +150,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 
@@ -175,8 +176,12 @@ void draw(const char *s)
 
 void loop(void) {
   u8g2.setPowerSave(0);
-  draw("power on");
+  draw("power on / x");
   u8g2.setPowerSave(1);
-  draw("power off");
+  draw("power off / x");
+  u8g2.setPowerSave(0);
+  draw("power on / +");
+  u8g2.setPowerSave(1);
+  draw("power off / +");
 }
 

+ 1 - 0
examples/page_buffer/PrintHelloWorld/PrintHelloWorld.ino

@@ -157,6 +157,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/PrintUTF8/PrintUTF8.ino

@@ -157,6 +157,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/ScrollingText/ScrollingText.ino

@@ -160,6 +160,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 2 - 1
examples/page_buffer/SelectionList/SelectionList.ino

@@ -58,7 +58,7 @@
 //U8G2_SSD1306_128X64_NONAME_1_8080 u8g2(U8G2_R0, 13, 11, 2, 3, 4, 5, 6, A4, /*enable=*/ 7, /*cs=*/ 10, /*dc=*/ 9, /*reset=*/ 8);
 //U8G2_SSD1306_128X64_VCOMH0_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// same as the NONAME variant, but maximizes setContrast() range
 //U8G2_SH1106_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
-U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
+//U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
 //U8G2_SH1106_128X64_VCOMH0_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// same as the NONAME variant, but maximizes setContrast() range
 //U8G2_SSD1306_128X32_UNIVISION_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 21, /* data=*/ 20, /* reset=*/ U8X8_PIN_NONE);   // Adafruit Feather M0 Basic Proto + FeatherWing OLED
 //U8G2_SSD1306_128X32_UNIVISION_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // Adafruit Feather ESP8266/32u4 Boards + FeatherWing OLED
@@ -146,6 +146,7 @@ U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 2 - 1
examples/page_buffer/U8g2Logo/U8g2Logo.ino

@@ -154,7 +154,8 @@
 //U8G2_UC1611_EA_DOGXL240_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);   // SW SPI, Due DOGXL240 Test Board
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
-U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/XBM/XBM.ino

@@ -160,6 +160,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 1 - 0
examples/page_buffer/XORTest/XORTest.ino

@@ -160,6 +160,7 @@
 //U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);		// eInk/ePaper Display
 //U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// eInk/ePaper Display
 //U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
+//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);	// ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
 
 
 

+ 2 - 1
extras/ChangeLog

@@ -129,4 +129,5 @@ https://github.com/olikraus/u8g2 ChangeLog
   * Support for SED1520/SBN1661 (issue 324)
  2017-xx-xx	v2.17.x   olikraus@gmail.com
   * Additional _m_  and _h_ symbol fonts (issue 335)
-  * Added parallel interfaces for several UC16xx devices (issue 339)   
+  * Added parallel interfaces for several UC16xx devices (issue 339)
+  * Support for IL3820, WaveShare 2.9" e-paper (issues 318 & 347)

+ 1 - 1
library.properties

@@ -1,5 +1,5 @@
 name=U8g2
-version=2.17.9
+version=2.17.10
 author=oliver <olikraus@gmail.com>
 maintainer=oliver <olikraus@gmail.com>
 sentence=Monochrome LCD, OLED and eInk Library. Display controller: SSD1305, SSD1306, SSD1309, SSD1322, SSD1325, SSD1327, SSD1329, SSD1606, SSD1607, SH1106, T6963, RA8835, LC7981, PCD8544, PCF8812, UC1604, UC1608, UC1610, UC1611, UC1701, ST7565, ST7567, ST7588, NT7534, IST3020, ST7920, LD7032, KS0108, SED1520, SBN1661, MAX7219. Interfaces: I2C, SPI, Parallel.

+ 72 - 0
src/U8g2lib.h

@@ -6025,6 +6025,30 @@ class U8G2_IL3820_296X128_1_3W_SW_SPI : public U8G2 {
     u8x8_SetPin_3Wire_SW_SPI(getU8x8(), clock, data, cs, reset);
   }
 };
+class U8G2_IL3820_V2_296X128_1_4W_SW_SPI : public U8G2 {
+  public: U8G2_IL3820_V2_296X128_1_4W_SW_SPI(const u8g2_cb_t *rotation, uint8_t clock, uint8_t data, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
+    u8g2_Setup_il3820_v2_296x128_1(&u8g2, rotation, u8x8_byte_arduino_4wire_sw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_4Wire_SW_SPI(getU8x8(), clock, data, cs, dc, reset);
+  }
+};
+class U8G2_IL3820_V2_296X128_1_4W_HW_SPI : public U8G2 {
+  public: U8G2_IL3820_V2_296X128_1_4W_HW_SPI(const u8g2_cb_t *rotation, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
+    u8g2_Setup_il3820_v2_296x128_1(&u8g2, rotation, u8x8_byte_arduino_hw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_4Wire_HW_SPI(getU8x8(), cs, dc, reset);
+  }
+};
+class U8G2_IL3820_V2_296X128_1_2ND_4W_HW_SPI : public U8G2 {
+  public: U8G2_IL3820_V2_296X128_1_2ND_4W_HW_SPI(const u8g2_cb_t *rotation, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
+    u8g2_Setup_il3820_v2_296x128_1(&u8g2, rotation, u8x8_byte_arduino_2nd_hw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_4Wire_HW_SPI(getU8x8(), cs, dc, reset);
+  }
+};
+class U8G2_IL3820_V2_296X128_1_3W_SW_SPI : public U8G2 {
+  public: U8G2_IL3820_V2_296X128_1_3W_SW_SPI(const u8g2_cb_t *rotation, uint8_t clock, uint8_t data, uint8_t cs, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
+    u8g2_Setup_il3820_v2_296x128_1(&u8g2, rotation, u8x8_byte_3wire_sw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_3Wire_SW_SPI(getU8x8(), clock, data, cs, reset);
+  }
+};
 class U8G2_IL3820_296X128_2_4W_SW_SPI : public U8G2 {
   public: U8G2_IL3820_296X128_2_4W_SW_SPI(const u8g2_cb_t *rotation, uint8_t clock, uint8_t data, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
     u8g2_Setup_il3820_296x128_2(&u8g2, rotation, u8x8_byte_arduino_4wire_sw_spi, u8x8_gpio_and_delay_arduino);
@@ -6049,6 +6073,30 @@ class U8G2_IL3820_296X128_2_3W_SW_SPI : public U8G2 {
     u8x8_SetPin_3Wire_SW_SPI(getU8x8(), clock, data, cs, reset);
   }
 };
+class U8G2_IL3820_V2_296X128_2_4W_SW_SPI : public U8G2 {
+  public: U8G2_IL3820_V2_296X128_2_4W_SW_SPI(const u8g2_cb_t *rotation, uint8_t clock, uint8_t data, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
+    u8g2_Setup_il3820_v2_296x128_2(&u8g2, rotation, u8x8_byte_arduino_4wire_sw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_4Wire_SW_SPI(getU8x8(), clock, data, cs, dc, reset);
+  }
+};
+class U8G2_IL3820_V2_296X128_2_4W_HW_SPI : public U8G2 {
+  public: U8G2_IL3820_V2_296X128_2_4W_HW_SPI(const u8g2_cb_t *rotation, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
+    u8g2_Setup_il3820_v2_296x128_2(&u8g2, rotation, u8x8_byte_arduino_hw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_4Wire_HW_SPI(getU8x8(), cs, dc, reset);
+  }
+};
+class U8G2_IL3820_V2_296X128_2_2ND_4W_HW_SPI : public U8G2 {
+  public: U8G2_IL3820_V2_296X128_2_2ND_4W_HW_SPI(const u8g2_cb_t *rotation, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
+    u8g2_Setup_il3820_v2_296x128_2(&u8g2, rotation, u8x8_byte_arduino_2nd_hw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_4Wire_HW_SPI(getU8x8(), cs, dc, reset);
+  }
+};
+class U8G2_IL3820_V2_296X128_2_3W_SW_SPI : public U8G2 {
+  public: U8G2_IL3820_V2_296X128_2_3W_SW_SPI(const u8g2_cb_t *rotation, uint8_t clock, uint8_t data, uint8_t cs, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
+    u8g2_Setup_il3820_v2_296x128_2(&u8g2, rotation, u8x8_byte_3wire_sw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_3Wire_SW_SPI(getU8x8(), clock, data, cs, reset);
+  }
+};
 class U8G2_IL3820_296X128_F_4W_SW_SPI : public U8G2 {
   public: U8G2_IL3820_296X128_F_4W_SW_SPI(const u8g2_cb_t *rotation, uint8_t clock, uint8_t data, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
     u8g2_Setup_il3820_296x128_f(&u8g2, rotation, u8x8_byte_arduino_4wire_sw_spi, u8x8_gpio_and_delay_arduino);
@@ -6073,6 +6121,30 @@ class U8G2_IL3820_296X128_F_3W_SW_SPI : public U8G2 {
     u8x8_SetPin_3Wire_SW_SPI(getU8x8(), clock, data, cs, reset);
   }
 };
+class U8G2_IL3820_V2_296X128_F_4W_SW_SPI : public U8G2 {
+  public: U8G2_IL3820_V2_296X128_F_4W_SW_SPI(const u8g2_cb_t *rotation, uint8_t clock, uint8_t data, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
+    u8g2_Setup_il3820_v2_296x128_f(&u8g2, rotation, u8x8_byte_arduino_4wire_sw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_4Wire_SW_SPI(getU8x8(), clock, data, cs, dc, reset);
+  }
+};
+class U8G2_IL3820_V2_296X128_F_4W_HW_SPI : public U8G2 {
+  public: U8G2_IL3820_V2_296X128_F_4W_HW_SPI(const u8g2_cb_t *rotation, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
+    u8g2_Setup_il3820_v2_296x128_f(&u8g2, rotation, u8x8_byte_arduino_hw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_4Wire_HW_SPI(getU8x8(), cs, dc, reset);
+  }
+};
+class U8G2_IL3820_V2_296X128_F_2ND_4W_HW_SPI : public U8G2 {
+  public: U8G2_IL3820_V2_296X128_F_2ND_4W_HW_SPI(const u8g2_cb_t *rotation, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
+    u8g2_Setup_il3820_v2_296x128_f(&u8g2, rotation, u8x8_byte_arduino_2nd_hw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_4Wire_HW_SPI(getU8x8(), cs, dc, reset);
+  }
+};
+class U8G2_IL3820_V2_296X128_F_3W_SW_SPI : public U8G2 {
+  public: U8G2_IL3820_V2_296X128_F_3W_SW_SPI(const u8g2_cb_t *rotation, uint8_t clock, uint8_t data, uint8_t cs, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
+    u8g2_Setup_il3820_v2_296x128_f(&u8g2, rotation, u8x8_byte_3wire_sw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_3Wire_SW_SPI(getU8x8(), clock, data, cs, reset);
+  }
+};
 class U8G2_SED1330_240X128_1_6800 : public U8G2 {
   public: U8G2_SED1330_240X128_1_6800(const u8g2_cb_t *rotation, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7, uint8_t enable, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
     u8g2_Setup_sed1330_240x128_1(&u8g2, rotation, u8x8_byte_8bit_6800mode, u8x8_gpio_and_delay_arduino);

+ 24 - 0
src/U8x8lib.h

@@ -2190,6 +2190,30 @@ class U8X8_IL3820_296X128_3W_SW_SPI : public U8X8 {
     u8x8_SetPin_3Wire_SW_SPI(getU8x8(), clock, data, cs, reset);
   }
 };
+class U8X8_IL3820_V2_296X128_4W_SW_SPI : public U8X8 {
+  public: U8X8_IL3820_V2_296X128_4W_SW_SPI(uint8_t clock, uint8_t data, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8X8() {
+    u8x8_Setup(getU8x8(), u8x8_d_il3820_v2_296x128, u8x8_cad_011, u8x8_byte_arduino_4wire_sw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_4Wire_SW_SPI(getU8x8(), clock, data, cs, dc, reset);
+  }
+};
+class U8X8_IL3820_V2_296X128_4W_HW_SPI : public U8X8 {
+  public: U8X8_IL3820_V2_296X128_4W_HW_SPI(uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8X8() {
+    u8x8_Setup(getU8x8(), u8x8_d_il3820_v2_296x128, u8x8_cad_011, u8x8_byte_arduino_hw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_4Wire_HW_SPI(getU8x8(), cs, dc, reset);
+  }
+};
+class U8X8_IL3820_V2_296X128_2ND_4W_HW_SPI : public U8X8 {
+  public: U8X8_IL3820_V2_296X128_2ND_4W_HW_SPI(uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8X8() {
+    u8x8_Setup(getU8x8(), u8x8_d_il3820_v2_296x128, u8x8_cad_011, u8x8_byte_arduino_2nd_hw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_4Wire_HW_SPI(getU8x8(), cs, dc, reset);
+  }
+};
+class U8X8_IL3820_V2_296X128_3W_SW_SPI : public U8X8 {
+  public: U8X8_IL3820_V2_296X128_3W_SW_SPI(uint8_t clock, uint8_t data, uint8_t cs, uint8_t reset = U8X8_PIN_NONE) : U8X8() {
+    u8x8_Setup(getU8x8(), u8x8_d_il3820_v2_296x128, u8x8_cad_011, u8x8_byte_3wire_sw_spi, u8x8_gpio_and_delay_arduino);
+    u8x8_SetPin_3Wire_SW_SPI(getU8x8(), clock, data, cs, reset);
+  }
+};
 class U8X8_SED1330_240X128_6800 : public U8X8 {
   public: U8X8_SED1330_240X128_6800(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7, uint8_t enable, uint8_t cs, uint8_t dc, uint8_t reset = U8X8_PIN_NONE) : U8X8() {
     u8x8_Setup(getU8x8(), u8x8_d_sed1330_240x128, u8x8_cad_100, u8x8_byte_8bit_6800mode, u8x8_gpio_and_delay_arduino);

+ 3 - 0
src/clib/u8g2.h

@@ -801,8 +801,11 @@ void u8g2_Setup_ssd1607_200x200_1(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_
 void u8g2_Setup_ssd1607_200x200_2(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);
 void u8g2_Setup_ssd1607_200x200_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);
 void u8g2_Setup_il3820_296x128_1(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);
+void u8g2_Setup_il3820_v2_296x128_1(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);
 void u8g2_Setup_il3820_296x128_2(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);
+void u8g2_Setup_il3820_v2_296x128_2(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);
 void u8g2_Setup_il3820_296x128_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);
+void u8g2_Setup_il3820_v2_296x128_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);
 void u8g2_Setup_sed1330_240x128_1(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);
 void u8g2_Setup_sed1330_240x128_2(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);
 void u8g2_Setup_sed1330_240x128_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);

+ 24 - 0
src/clib/u8g2_d_setup.c

@@ -2245,6 +2245,14 @@ void u8g2_Setup_il3820_296x128_1(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_m
   buf = u8g2_m_il3820_37_1(&tile_buf_height);
   u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);
 }
+void u8g2_Setup_il3820_v2_296x128_1(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
+{
+  uint8_t tile_buf_height;
+  uint8_t *buf;
+  u8g2_SetupDisplay(u8g2, u8x8_d_il3820_v2_296x128, u8x8_cad_011, byte_cb, gpio_and_delay_cb);
+  buf = u8g2_m_il3820_37_1(&tile_buf_height);
+  u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);
+}
 /* il3820 2 */
 void u8g2_Setup_il3820_296x128_2(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
 {
@@ -2254,6 +2262,14 @@ void u8g2_Setup_il3820_296x128_2(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_m
   buf = u8g2_m_il3820_37_2(&tile_buf_height);
   u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);
 }
+void u8g2_Setup_il3820_v2_296x128_2(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
+{
+  uint8_t tile_buf_height;
+  uint8_t *buf;
+  u8g2_SetupDisplay(u8g2, u8x8_d_il3820_v2_296x128, u8x8_cad_011, byte_cb, gpio_and_delay_cb);
+  buf = u8g2_m_il3820_37_2(&tile_buf_height);
+  u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);
+}
 /* il3820 f */
 void u8g2_Setup_il3820_296x128_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
 {
@@ -2263,6 +2279,14 @@ void u8g2_Setup_il3820_296x128_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_m
   buf = u8g2_m_il3820_37_f(&tile_buf_height);
   u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);
 }
+void u8g2_Setup_il3820_v2_296x128_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
+{
+  uint8_t tile_buf_height;
+  uint8_t *buf;
+  u8g2_SetupDisplay(u8g2, u8x8_d_il3820_v2_296x128, u8x8_cad_011, byte_cb, gpio_and_delay_cb);
+  buf = u8g2_m_il3820_37_f(&tile_buf_height);
+  u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);
+}
 /* sed1330 */
 /* sed1330 1 */
 void u8g2_Setup_sed1330_240x128_1(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)

+ 2 - 0
src/clib/u8x8.h

@@ -552,6 +552,7 @@ void u8x8_ClearLine(u8x8_t *u8x8, uint8_t line);
 
 uint8_t u8x8_cad_SendCmd(u8x8_t *u8x8, uint8_t cmd) U8X8_NOINLINE;
 uint8_t u8x8_cad_SendArg(u8x8_t *u8x8, uint8_t arg) U8X8_NOINLINE;
+uint8_t u8x8_cad_SendMultipleArg(u8x8_t *u8x8, uint8_t cnt, uint8_t arg) U8X8_NOINLINE;
 uint8_t u8x8_cad_SendData(u8x8_t *u8x8, uint8_t cnt, uint8_t *data) U8X8_NOINLINE;
 uint8_t u8x8_cad_StartTransfer(u8x8_t *u8x8) U8X8_NOINLINE;
 uint8_t u8x8_cad_EndTransfer(u8x8_t *u8x8) U8X8_NOINLINE;
@@ -802,6 +803,7 @@ uint8_t u8x8_d_pcf8812_96x65(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *a
 uint8_t u8x8_d_ssd1606_172x72(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
 uint8_t u8x8_d_ssd1607_200x200(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
 uint8_t u8x8_d_il3820_296x128(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
+uint8_t u8x8_d_il3820_v2_296x128(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
 uint8_t u8x8_d_lc7981_160x80(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
 uint8_t u8x8_d_lc7981_160x160(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
 uint8_t u8x8_d_lc7981_240x128(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);

+ 10 - 0
src/clib/u8x8_cad.c

@@ -95,6 +95,16 @@ uint8_t u8x8_cad_SendArg(u8x8_t *u8x8, uint8_t arg)
   return u8x8->cad_cb(u8x8, U8X8_MSG_CAD_SEND_ARG, arg, NULL);
 }
 
+uint8_t u8x8_cad_SendMultipleArg(u8x8_t *u8x8, uint8_t cnt, uint8_t arg)
+{
+  while( cnt > 0 )
+  {
+    u8x8->cad_cb(u8x8, U8X8_MSG_CAD_SEND_ARG, arg, NULL);
+    cnt--;
+  }
+  return 1;
+}
+
 uint8_t u8x8_cad_SendData(u8x8_t *u8x8, uint8_t cnt, uint8_t *data)
 {
   return u8x8->cad_cb(u8x8, U8X8_MSG_CAD_SEND_DATA, cnt, data);

+ 357 - 368
src/clib/u8x8_d_il3820_296x128.c

@@ -47,302 +47,81 @@
     bit 1:	Disable Charge Pump
     bit 0:	Disable Clock
     
-    Disable Charge Pump and Clock require about 267ms
-    Enable Charge Pump and Clock require about 10ms
+    Disable Charge Pump and Clock require about 10ms
+    Enable Charge Pump and Clock require about 100 to 300ms
 
   Notes:
     - Introduced a refresh display message, which copies RAM to display
-    - Charge pump and clock are only enabled for the transfer RAM to display
+    - Charge pump is always enabled. Charge pump can be enabled/disabled via power save message
     - U8x8 will not really work because of the two buffers in the SSD1606, however U8g2 should be ok.
 
-*/
-
+  LUT for the 296x128 device (IL3820)
+  LUT (cmd: 0x032 has 30 bytes)
+  section 6.8 of the datasheet mentions 256 bits = 32 bytes for the LUT
+  chapter 7 tells 30 bytes
 
-#include "u8x8.h"
+  according to section 6.8:
+  20 bytes waveform
+  10 bytes timing
+  1 byte named as VSH/VSL
+  1 empty byte
+  according to the command table, the lut has 240 bits (=30 bytes * 8 bits)
 
 
-#define L(a,b,c,d) (((a)<<6)|((b)<<4)|((c)<<2)|(d))
+  LUT / Refresh time
+    total_refresh_time = (refresh_lines + dummy_lines*2)*TGate*TS_Sum/f_OSC
 
+    f_OSC=1MHz (according to the datasheets)
+    refreh_lines = 296 (for the waveshare display, 0x045 cmd)
+    dummy_lines = 22 (for the upcoming u8g2 code, 0x03a cmd)
+    TGate = 62 (POR default, 0x03b cmd)
+    TS_Sum: Sum of all TS entries of the second part of the LUT
+    f_OSC: 1MHz according to the datasheet.
 
-/* http://www.waveshare.com/wiki/File:2.9inch_e-Paper_Module_code.7z */
-static const uint8_t u8x8_d_il3820_296x128_init_seq[] = {
-    
-  U8X8_START_TRANSFER(),             	/* enable chip, delay is part of the transfer start */
-  
-  
-  
+    so we have
 
-  U8X8_CA(0x10, 0x00),	/* Deep Sleep mode Control: Disable */
-  U8X8_C(0x01),
-  U8X8_A(295 % 256), U8X8_A(295/256), U8X8_A(0),
-  
-  
-  
+    total_refresh_time = 21080*TS_Sum/1000000 = 21ms * TS_Sum
 
-  
-  /* according to the command table, the lut has 240 bits (=30 bytes * 8 bits) */
-  
-  /* Waveform part of the LUT (20 bytes) */
-  /* bit 7/6: 1 - 1 transition */
-  /* bit 5/4: 1 - 0 transition */
-  /* bit 3/2: 0 - 1 transition */
-  /* bit 1/0: 0 - 0 transition */
-  /* 	00 – VSS */
-  /* 	01 – VSH */
-  /* 	10 – VSL */
-  /* 	11 – NA */
-  
-/*
-LUT for the 296x128 device (IL3820)
-LUT (cmd: 0x032 has 30 bytes)
-section 6.8 of the datasheet mentions 256 bits = 32 bytes for the LUT
-chapter 7 tells 30 bytes
 
-according to section 6.8:
-20 bytes waveform
-10 bytes timing
-1 byte named as VSH/VSL
-1 empty byte
+  This file includes two devices:
+    u8x8_d_il3820_296x128		--> includes LUT which is probably from the WaveShare 2.9 Vendor
+    u8x8_d_il3820_v2_296x128		--> includes LUT which was optimized for faster speed and lesser flicker
 
 */
-/*
-  static unsigned char LUTDefault_full[] = 
-  0x32,
-  0x02,0x02,0x01,0x11,0x12,  0x12,0x22,0x22,0x66,0x69,
-  0x69,0x59,0x58,0x99,0x99,  0x88,0x00,0x00,0x00,0x00,
-  0xF8,0xB4,0x13,0x51,0x35,  0x51,0x51,0x19,0x01,0x00, 0x00};
-  static unsigned char LUTDefault_part[] = {
-  0x32,
-  0x10,0x18,0x18,0x08,0x18,  0x18,0x08,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,
-  0x00,0x13,0x14,0x44,0x12,  0x00,0x00,0x00,0x00,0x00,0x00};
-*/
-
-/*
-0x00, 0x40, 0x04, 0xa6, 0xa8, 
-0x65, 0x19, 0xaa, 0x98, 0x11, 
-0x11, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 
-
-0x20, 0x26, 0x26, 0x26, 0xff, 
-0x0f, 0x00, 0x00, 0x00, 0x00
-
-71 ticks, 1440 ms
-
-
-0x00, 0x88, 0x88, 0x88, 0x98, 
-0x99, 0x99, 0x99, 0x11, 0x11, 
-0x11, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 
-
-0x20, 0x26, 0x26, 0x26, 0xff, 
-0x0f, 0x00, 0x00, 0x00, 0x00
-71 ticks, 1440 ms
-
-*/  
-#ifdef OLD
-  
-  U8X8_C(0x32),	/* write LUT register*/
-  /* original values */
-  U8X8_A(0x00),
-  U8X8_A(0x88),
-  U8X8_A(0x88),
-  U8X8_A(0x88),  
-  U8X8_A(0x98),
-  
-  U8X8_A(0x99),
-  U8X8_A(0x99),
-  U8X8_A(0x99),
-  U8X8_A(0x11),  
-  U8X8_A(0x11),
-  
-  U8X8_A(0x11),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  
-  /* Timing part of the LUT, 20 Phases with 4 bit each: 10 bytes */
-  U8X8_A(0x20),
-  U8X8_A(0x26),
-  U8X8_A(0x26),
-  U8X8_A(0x26),
-  U8X8_A(0xff),
-  U8X8_A(0x0f),
-  
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-#endif
-  
-/*
-0x50, 0xAA, 0x55, 0xAA, 0x11, 	0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 	0x00, 0x00, 0x00, 0x00, 0x00, 
-0xFF, 0xFF, 0x1F, 0x00, 0x00, 		0x00, 0x00, 0x00, 0x00, 0x00
-measured 1582 ms
-*/
-  U8X8_C(0x32),	/* write LUT register*/
-  /* original values */
-  U8X8_A(0x50),
-  U8X8_A(0xaa),
-  U8X8_A(0x55),
-  U8X8_A(0xaa),  
-  U8X8_A(0x11),
-  
-  U8X8_A(0x11),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),  
-  U8X8_A(0x00),
-  
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  
-  /* Timing part of the LUT, 20 Phases with 4 bit each: 10 bytes */
-  U8X8_A(0xff),
-  U8X8_A(0xff),
-  U8X8_A(0x3f),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-  U8X8_A(0x00),
-
-#ifdef OLD
-  /* take the values from the 200x200 SSD1607 device, this looks better */
-  U8X8_C(0x32),	/* write LUT register*/
-
-  /* original values, L-macro */
-  U8X8_A(L(0,0,0,2)), // 0x02
-  U8X8_A(L(0,0,0,2)), // 0x02
-  U8X8_A(L(0,0,0,1)), // 0x01
-  U8X8_A(L(0,1,0,1)), // 0x11
-  U8X8_A(L(0,1,0,2)), // 0x12
-  U8X8_A(L(0,1,0,2)), // 0x12
-  U8X8_A(L(0,2,0,2)), // 0x22
-  U8X8_A(L(0,2,0,2)), // 0x22
-  U8X8_A(L(1,2,1,2)), // 0x66
-  U8X8_A(L(1,2,2,1)), // 0x69
-  U8X8_A(L(1,2,2,1)), // 0x69
-  U8X8_A(L(1,1,2,1)), // 0x59
-  U8X8_A(L(1,1,2,0)), // 0x58
-  U8X8_A(L(2,1,2,1)), // 0x99
-  U8X8_A(L(2,1,2,1)), // 0x99
-  U8X8_A(L(2,0,2,0)), // 0x88
-  U8X8_A(L(0,0,0,0)), // 0x00
-  U8X8_A(L(0,0,0,0)), // 0x00
-  U8X8_A(L(0,0,0,0)), // 0x00
-  U8X8_A(L(0,0,0,0)), // 0x00
-
-  /* Timing part of the LUT, 20 Phases with 4 bit each: 10 bytes */
-  U8X8_A(0xF8),
-  U8X8_A(0xB4),
-  U8X8_A(0x13),
-  U8X8_A(0x51),
-  U8X8_A(0x35),
-  U8X8_A(0x51),
-  U8X8_A(0x51),
-  U8X8_A(0x19),
-  U8X8_A(0x01),
-  U8X8_A(0x00),
-
-#endif
-
-  U8X8_CA(0x03, 0x00), 	/* Gate Driving voltage: 15V (lowest value)*/
-  U8X8_CA(0x04, 0x0a), 	/* Source Driving voltage: 15V (mid value and POR)*/
   
-  //U8X8_CA(0x22, 0xc0),	/* display update seq. option: enable clk, enable CP, .... todo: this is never activated */
-
-  //U8X8_CA(0x0b, 7),	/* Set Delay of gate and source non overlap period, POR = 7 */
-  U8X8_CA(0x2c, 0xa8),	/* write vcom value*/
-  U8X8_CA(0x3a, 0x16),	/* dummy lines POR=22 (0x016) */
-  U8X8_CA(0x3b, 0x08),	/* gate time POR=0x08*/
-  U8X8_CA(0x3c, 0x33),	/* select boarder waveform */
-  U8X8_CA(0x22, 0xc4),	/* display update seq. option: clk -> CP -> LUT -> initial display -> pattern display */
-
-
-  U8X8_CA(0x11, 0x07),	/* Define data entry mode, x&y inc, x first*/
-
-  U8X8_CAA(0x44, 0, 29),	/* RAM x start & end, 32*4=128 */
-  U8X8_CAAAA(0x45, 0, 0, 295&255, 295>>8),	/* RAM y start & end, 0..295 */
+/* Waveform part of the LUT (20 bytes) */
+/* bit 7/6: 1 - 1 transition */
+/* bit 5/4: 1 - 0 transition */
+/* bit 3/2: 0 - 1 transition */
+/* bit 1/0: 0 - 0 transition */
+/* 	00 – VSS */
+/* 	01 – VSH */
+/* 	10 – VSL */
+/* 	11 – NA */
   
-  U8X8_CA(0x4e, 0),	/* set x pos, 0..29? */
-  U8X8_CAA(0x4f, 0, 0),	/* set y pos, 0...320??? */
-
-
-  U8X8_END_TRANSFER(),             	/* disable chip */
-  U8X8_END()             			/* end of sequence */
-};
-
-
-/*
-total_refresh_time = (refresh_lines + dummy_lines*2)*TGate*TS_Sum/f_OSC
-
-f_OSC=1MHz (according to the datasheets)
-refreh_lines = 296 (for the waveshare display, 0x045 cmd)
-dummy_lines = 22 (for the upcoming u8g2 code, 0x03a cmd)
-TGate = 62 (POR default, 0x03b cmd)
-TS_Sum: Sum of all TS entries of the second part of the LUT
-f_OSC: 1MHz according to the datasheet.
-
-so we have
 
-total_refresh_time = 21080*TS_Sum/1000000 = 21ms * TS_Sum
-*/
-
-static const uint8_t u8x8_d_il3820_to_display_seq[] = {
+#include "u8x8.h"
 
+/*=================================================*/
+/* common code for all devices */
 
-  U8X8_START_TRANSFER(),             	/* enable chip, delay is part of the transfer start */
-  
-  U8X8_CA(0x22, 0xc4),	/* display update seq. option: clk -> CP -> LUT -> initial display -> pattern display */
-  U8X8_C(0x20),	/* execute sequence */
-  
-  U8X8_DLY(250),	/* delay for 1620ms. The current sequence takes 1582ms */
-  U8X8_DLY(250),
-  U8X8_DLY(250),
-  U8X8_DLY(250),
-  
-  U8X8_DLY(250),
-  U8X8_DLY(250),
-  U8X8_DLY(120),
- 
-  // 6 sep2017: removed the following code, i think the 0x020 exec cmd is missing
-  //U8X8_CA(0x22, 0x03),	/* disable clock and charge pump */
-  //U8X8_DLY(250),
-  //U8X8_DLY(250),
-  //U8X8_DLY(100),  
-  
-  U8X8_END_TRANSFER(),             	/* disable chip */
-  U8X8_END()             			/* end of sequence */
-};
 
 static const uint8_t u8x8_d_il3820_296x128_powersave0_seq[] = {
   U8X8_START_TRANSFER(),             	/* enable chip, delay is part of the transfer start */
+  U8X8_CA(0x22, 0xc0),			/* enable clock and charge pump */
+  U8X8_C(0x20),				/* execute sequence */  
+  U8X8_DLY(200),				/* according to my measures it may take up to 150ms */
+  U8X8_DLY(100),				/* but it might take longer */
   U8X8_END_TRANSFER(),             	/* disable chip */
   U8X8_END()             			/* end of sequence */
 };
 
 static const uint8_t u8x8_d_il3820_296x128_powersave1_seq[] = {
-  U8X8_START_TRANSFER(),             	/* enable chip, delay is part of the transfer start */
+  U8X8_START_TRANSFER(),             	/* enable chip, delay is part of the transfer start */  
+  /* disable clock and charge pump only, deep sleep is not entered, because we will loose RAM content */
+  U8X8_CA(0x22, 0x02),			/* only disable charge pump, HW reset seems to be required if the clock is disabled */
+  U8X8_C(0x20),				/* execute sequence */  
+  U8X8_DLY(20),
   U8X8_END_TRANSFER(),             	/* disable chip */
   U8X8_END()             			/* end of sequence */
 };
@@ -360,6 +139,31 @@ static const uint8_t u8x8_d_il3820_296x128_flip1_seq[] = {
 };
 
 
+static const u8x8_display_info_t u8x8_il3820_296x128_display_info =
+{
+  /* chip_enable_level = */ 0,
+  /* chip_disable_level = */ 1,
+  
+  /* post_chip_enable_wait_ns = */ 120,
+  /* pre_chip_disable_wait_ns = */ 60,
+  /* reset_pulse_width_ms = */ 100, 	
+  /* post_reset_wait_ms = */ 100, 
+  /* sda_setup_time_ns = */ 50,		/* IL3820 */
+  /* sck_pulse_width_ns = */ 125,	/* IL3820: 125ns, clock cycle = 250ns */
+  /* sck_clock_hz = */ 4000000UL,	/* since Arduino 1.6.0, the SPI bus speed in Hz. Should be  1000000000/sck_pulse_width_ns */
+  /* spi_mode = */ 2,		/* active high, rising edge */
+  /* i2c_bus_clock_100kHz = */ 4,
+  /* data_setup_time_ns = */ 40,
+  /* write_pulse_width_ns = */ 150,	
+  /* tile_width = */ 37,		/* 37*8 = 296 */
+  /* tile_hight = */ 16,		/* 16*8 = 128 */	
+  /* default_x_offset = */ 0,
+  /* flipmode_x_offset = */ 0,
+  /* pixel_width = */ 296,
+  /* pixel_height = */ 128
+};
+
+
 static uint8_t *u8x8_convert_tile_for_il3820(uint8_t *t)
 {
   uint8_t i;
@@ -385,30 +189,13 @@ static void u8x8_d_il3820_draw_tile(u8x8_t *u8x8, uint8_t arg_int, void *arg_ptr
   page --;
   page -= (((u8x8_tile_t *)arg_ptr)->y_pos);
   
-  //page = (((u8x8_tile_t *)arg_ptr)->y_pos);
-
   x = ((u8x8_tile_t *)arg_ptr)->x_pos;
   x *= 8;
   x += u8x8->x_offset;
 
-  
-
-  //u8x8_cad_SendCmd(u8x8, 0x00f );	/* scan start */
-  //u8x8_cad_SendArg(u8x8, 0);
-
   //u8x8_cad_SendCmd(u8x8, 0x011 );	/* cursor increment mode */
   //u8x8_cad_SendArg(u8x8, 7);
 
-  //u8x8_cad_SendCmd(u8x8, 0x045 );	/* window start column */
-  //u8x8_cad_SendArg(u8x8, 0);
-  //u8x8_cad_SendArg(u8x8, 0);
-  //u8x8_cad_SendArg(u8x8, (296-1)&255);		/* end of display */
-  //u8x8_cad_SendArg(u8x8, (296-1)>>8);
-
-  //u8x8_cad_SendCmd(u8x8, 0x044 );	/* window end page */
-  //u8x8_cad_SendArg(u8x8, page);
-  //u8x8_cad_SendArg(u8x8, page+1);
-
   u8x8_cad_SendCmd(u8x8, 0x04f );	/* set cursor column */
   u8x8_cad_SendArg(u8x8, x&255);
   u8x8_cad_SendArg(u8x8, x>>8);
@@ -437,82 +224,178 @@ static void u8x8_d_il3820_draw_tile(u8x8_t *u8x8, uint8_t arg_int, void *arg_ptr
 }
 
 
-static uint8_t u8x8_d_il3820_296x128_generic(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
+
+static const uint8_t u8x8_d_il3820_exec_1000dly_seq[] = {
+  // assumes, that the start transfer has happend
+  U8X8_CA(0x22, 0x04),	/* display update seq. option: pattern display */
+  U8X8_C(0x20),	/* execute sequence */
+  U8X8_DLY(250),
+  U8X8_DLY(250),
+  U8X8_DLY(250),
+  U8X8_DLY(250),
+  U8X8_END_TRANSFER(),             	/* disable chip */
+  U8X8_END()             			/* end of sequence */
+};
+
+static void u8x8_d_il3820_first_init(u8x8_t *u8x8)
+{
+      u8x8_ClearDisplay(u8x8);
+  
+      u8x8_cad_StartTransfer(u8x8);
+      u8x8_cad_SendCmd(u8x8, 0x032);		// program update sequence
+      u8x8_cad_SendMultipleArg(u8x8, 8, 0x055);		// all black
+      u8x8_cad_SendMultipleArg(u8x8, 12, 0x0aa);		// all white
+      u8x8_cad_SendMultipleArg(u8x8, 10, 0x022);		// 830ms
+      u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_exec_1000dly_seq);
+  
+}
+
+#ifdef OBSOLETE
+static void u8x8_d_il3820_second_init(u8x8_t *u8x8)
+{
+      u8x8_ClearDisplay(u8x8);
+  
+      u8x8_cad_StartTransfer(u8x8);
+      u8x8_cad_SendCmd(u8x8, 0x032);		// program update sequence
+      u8x8_cad_SendMultipleArg(u8x8, 20, 0x000);		// do nothing
+      u8x8_cad_SendMultipleArg(u8x8, 10, 0x011);		// 414ms dly
+      /* reuse sequence from above, ok some time is wasted here, */
+      /* delay could be lesser */
+      u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_exec_1000dly_seq);  
+}
+#endif
+
+
+/*=================================================*/
+/* first version, LUT from WaveShare */
+
+
+/* http://www.waveshare.com/wiki/File:2.9inch_e-Paper_Module_code.7z */
+static const uint8_t u8x8_d_il3820_296x128_init_seq[] = {
+    
+  U8X8_START_TRANSFER(),             	/* enable chip, delay is part of the transfer start */
+
+  U8X8_CA(0x10, 0x00),	/* Deep Sleep mode Control: Disable */
+  U8X8_C(0x01),
+  U8X8_A(295 % 256), U8X8_A(295/256), U8X8_A(0),
+  
+  
+  U8X8_CA(0x03, 0x00), 	/* Gate Driving voltage: 15V (lowest value)*/
+  U8X8_CA(0x04, 0x0a), 	/* Source Driving voltage: 15V (mid value and POR)*/
+  
+  //U8X8_CA(0x22, 0xc0),	/* display update seq. option: enable clk, enable CP, .... todo: this is never activated */
+
+  //U8X8_CA(0x0b, 7),	/* Set Delay of gate and source non overlap period, POR = 7 */
+  U8X8_CA(0x2c, 0xa8),	/* write vcom value*/
+  U8X8_CA(0x3a, 0x16),	/* dummy lines POR=22 (0x016) */
+  U8X8_CA(0x3b, 0x08),	/* gate time POR=0x08*/
+  U8X8_CA(0x3c, 0x33),	/* select boarder waveform */
+  //U8X8_CA(0x22, 0xc4),	/* display update seq. option: clk -> CP -> LUT -> initial display -> pattern display */
+
+
+  U8X8_CA(0x11, 0x07),	/* Define data entry mode, x&y inc, x first*/
+
+  U8X8_CAA(0x44, 0, 29),	/* RAM x start & end, 32*4=128 */
+  U8X8_CAAAA(0x45, 0, 0, 295&255, 295>>8),	/* RAM y start & end, 0..295 */
+  
+  //U8X8_CA(0x4e, 0),	/* set x pos, 0..29? */
+  //U8X8_CAA(0x4f, 0, 0),	/* set y pos, 0...320??? */
+
+
+  U8X8_END_TRANSFER(),             	/* disable chip */
+  U8X8_END()             			/* end of sequence */
+};
+
+
+static const uint8_t u8x8_d_il3820_to_display_seq[] = {
+  U8X8_START_TRANSFER(),             	/* enable chip, delay is part of the transfer start */
+/*
+0x50, 0xAA, 0x55, 0xAA, 0x11, 	0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 	0x00, 0x00, 0x00, 0x00, 0x00, 
+0xFF, 0xFF, 0x1F, 0x00, 0x00, 		0x00, 0x00, 0x00, 0x00, 0x00
+measured 1582 ms
+*/
+  U8X8_C(0x32),	/* write LUT register*/
+  /* original values */
+  U8X8_A(0x50),
+  U8X8_A(0xaa),
+  U8X8_A(0x55),
+  U8X8_A(0xaa),  
+  U8X8_A(0x11),
+  
+  U8X8_A(0x11),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),  
+  U8X8_A(0x00),
+  
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  
+  /* Timing part of the LUT, 20 Phases with 4 bit each: 10 bytes */
+  U8X8_A(0xff),
+  U8X8_A(0xff),
+  U8X8_A(0x3f),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+
+  U8X8_CA(0x22, 0x04),	/* display update seq. option: pattern display, assumes clk and charge pump are enabled  */
+  U8X8_C(0x20),	/* execute sequence */
+  
+  U8X8_DLY(250),	/* delay for 1620ms. The current sequence takes 1582ms */
+  U8X8_DLY(250),
+  U8X8_DLY(250),
+  U8X8_DLY(250),
+  
+  U8X8_DLY(250),
+  U8X8_DLY(250),
+  U8X8_DLY(120),
+   
+  U8X8_END_TRANSFER(),             	/* disable chip */
+  U8X8_END()             			/* end of sequence */
+};
+
+
+uint8_t u8x8_d_il3820_296x128(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
 {
   switch(msg)
   {
-    /* handled by the calling function
     case U8X8_MSG_DISPLAY_SETUP_MEMORY:
       u8x8_d_helper_display_setup_memory(u8x8, &u8x8_il3820_296x128_display_info);
       break;
-    */
     case U8X8_MSG_DISPLAY_INIT:
 
       u8x8_d_helper_display_init(u8x8);
       u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_296x128_init_seq);    
 
-      //u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_to_display_seq);    
-      //for(;;)
-	//;
-    
-#ifdef NOT_USED
-      /* STRATEGY FOR SSD1606 */
-      /* special code for the SSD1606... */
-      /* ensure that the initial buffer is clear and all eInk is set to white */
-      /* this is done here, because the LUT will be of that kind, that it uses the previous color */
-      /* make everything black */
-      u8x8_FillDisplay(u8x8);		
-      /* write content to the display */
-      u8x8_RefreshDisplay(u8x8);
-      /* now make everything clear */
-      u8x8_FillDisplay(u8x8);		
-      /* write content to the display */
-      u8x8_RefreshDisplay(u8x8);
-      /* now make everything clear */
-      u8x8_ClearDisplay(u8x8);		
-      /* write content to the display */
-      u8x8_RefreshDisplay(u8x8);
-#endif
+      u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_296x128_powersave0_seq);
+      u8x8_d_il3820_first_init(u8x8);
 
-      u8x8_ClearDisplay(u8x8);		
-      /* write content to the display */
-      u8x8_RefreshDisplay(u8x8);
-      /* another update to ensure, that the buffers are cleared */
-      u8x8_ClearDisplay(u8x8);		
-      /* write content to the display */
-      u8x8_RefreshDisplay(u8x8);
+      /* usually the DISPLAY_INIT message leaves the display in power save state */
+      /* however this is not done for e-paper devices, see: */
+      /* https://github.com/olikraus/u8g2/wiki/internal#powersave-mode */
     
       break;
     case U8X8_MSG_DISPLAY_SET_POWER_SAVE:
-/*
       if ( arg_int == 0 )
 	u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_296x128_powersave0_seq);
       else
 	u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_296x128_powersave1_seq);
-*/
       break;
-    case U8X8_MSG_DISPLAY_SET_FLIP_MODE:
-/*
-      if ( arg_int == 0 )
-      {
-	u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_296x128_flip0_seq);
-	u8x8->x_offset = u8x8->display_info->default_x_offset;
-      }
-      else
-      {
-	u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_296x128_flip1_seq);
-	u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
-      }
-*/
-      break;
-#ifdef U8X8_WITH_SET_CONTRAST
-/*
-    case U8X8_MSG_DISPLAY_SET_CONTRAST:
-      u8x8_cad_StartTransfer(u8x8);
-      u8x8_cad_EndTransfer(u8x8);
-*/
-      break;
-#endif
     case U8X8_MSG_DISPLAY_DRAW_TILE:
       u8x8_d_il3820_draw_tile(u8x8, arg_int, arg_ptr);
       break;
@@ -525,39 +408,145 @@ static uint8_t u8x8_d_il3820_296x128_generic(u8x8_t *u8x8, uint8_t msg, uint8_t
   return 1;
 }
 
+/*=================================================*/
+/* second version for the IL3820 display */
 
-static const u8x8_display_info_t u8x8_il3820_296x128_display_info =
-{
-  /* chip_enable_level = */ 0,
-  /* chip_disable_level = */ 1,
+
+/* http://www.waveshare.com/wiki/File:2.9inch_e-Paper_Module_code.7z */
+static const uint8_t u8x8_d_il3820_v2_296x128_init_seq[] = {
+    
+  U8X8_START_TRANSFER(),             	/* enable chip, delay is part of the transfer start */
+
+  // U8X8_CA(0x10, 0x00),	/* Deep Sleep mode Control: POR: Normal mode */
+  U8X8_C(0x01),
+  U8X8_A(295 % 256), U8X8_A(295/256), U8X8_A(0),
   
-  /* post_chip_enable_wait_ns = */ 120,
-  /* pre_chip_disable_wait_ns = */ 60,
-  /* reset_pulse_width_ms = */ 100, 	
-  /* post_reset_wait_ms = */ 100, 
-  /* sda_setup_time_ns = */ 50,		/* IL3820 */
-  /* sck_pulse_width_ns = */ 125,	/* IL3820: 125ns, clock cycle = 250ns */
-  /* sck_clock_hz = */ 4000000UL,	/* since Arduino 1.6.0, the SPI bus speed in Hz. Should be  1000000000/sck_pulse_width_ns */
-  /* spi_mode = */ 2,		/* active high, rising edge */
-  /* i2c_bus_clock_100kHz = */ 4,
-  /* data_setup_time_ns = */ 40,
-  /* write_pulse_width_ns = */ 150,	
-  /* tile_width = */ 37,		/* 37*8 = 296 */
-  /* tile_hight = */ 16,		/* 16*8 = 128 */	
-  /* default_x_offset = */ 0,
-  /* flipmode_x_offset = */ 0,
-  /* pixel_width = */ 296,
-  /* pixel_height = */ 128
+  /* the driving voltagesmust not be that high, in order to aviod level change after */
+  /* some seconds (which happens with 0xea */
+  U8X8_CA(0x03, 0x75), 	/* Gate Driving voltage: +/-15V =0x00 POR (+22/-20V) = 0x0ea*/
+  U8X8_CA(0x04, 0x0a), 	/* Source Driving voltage:  (POR=0x0a=15V), max=0x0e*/
+  
+  U8X8_CA(0x0b, 7),	/* Set Delay of gate and source non overlap period, POR = 7 */
+  U8X8_CA(0x2c, 0xa8),	/* write vcom value*/
+  U8X8_CA(0x3a, 0x16),	/* dummy lines POR=22 (0x016) */
+  U8X8_CA(0x3b, 0x08),	/* gate time POR=0x08*/
+  U8X8_CA(0x3c, 0x33),	/* select boarder waveform */
+
+  U8X8_CA(0x11, 0x07),	/* Define data entry mode, x&y inc, x first*/
+  U8X8_CAA(0x44, 0, 29),	/* RAM x start & end, 32*4=128 */
+  U8X8_CAAAA(0x45, 0, 0, 295&255, 295>>8),	/* RAM y start & end, 0..295 */
+  
+  U8X8_END_TRANSFER(),             	/* disable chip */
+  U8X8_END()             			/* end of sequence */
 };
 
-uint8_t u8x8_d_il3820_296x128(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
+
+static const uint8_t u8x8_d_il3820_v2_to_display_seq[] = {
+  U8X8_START_TRANSFER(),             	/* enable chip, delay is part of the transfer start */
+
+/*
+0xaa, 0x09, 0x09, 0x19, 0x19, 
+0x11, 0x11, 0x11, 0x11, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 
+
+0x75, 0x77, 0x77, 0x77, 0x07, 
+0x00, 0x00, 0x00, 0x00, 0x00
+measured 1240 ms
+*/
+  U8X8_C(0x32),	/* write LUT register*/
+  /* https://github.com/olikraus/u8g2/issues/347 */
+  U8X8_A(0xaa),
+  U8X8_A(0x09),
+  U8X8_A(0x09),
+  U8X8_A(0x19),  
+  U8X8_A(0x19),
+  
+  U8X8_A(0x11),
+  U8X8_A(0x11),
+  U8X8_A(0x11),
+  U8X8_A(0x11),  
+  U8X8_A(0x00),
+  
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  
+  /* Timing part of the LUT, 20 Phases with 4 bit each: 10 bytes */
+  U8X8_A(0x75),
+  U8X8_A(0x77),
+  U8X8_A(0x77),
+  U8X8_A(0x77),
+  U8X8_A(0x07),
+  
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  U8X8_A(0x00),
+  
+  U8X8_CA(0x22, 0x04),	/* display update seq. option: pattern display */
+  U8X8_C(0x20),	/* execute sequence */
+  
+  U8X8_DLY(250),	/* delay for 1300ms. The current sequence takes 1240ms */
+  U8X8_DLY(250),
+  U8X8_DLY(250),
+  U8X8_DLY(250),
+  
+  U8X8_DLY(250),
+  U8X8_DLY(50),
+ 
+  U8X8_END_TRANSFER(),             	/* disable chip */
+  U8X8_END()             			/* end of sequence */
+};
+
+uint8_t u8x8_d_il3820_v2_296x128(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
 {
-    if ( msg == U8X8_MSG_DISPLAY_SETUP_MEMORY )
-    {
+  switch(msg)
+  {
+    case U8X8_MSG_DISPLAY_SETUP_MEMORY:
       u8x8_d_helper_display_setup_memory(u8x8, &u8x8_il3820_296x128_display_info);
-      return 1;
-    }
-    return u8x8_d_il3820_296x128_generic(u8x8, msg, arg_int, arg_ptr);
+      break;    
+    case U8X8_MSG_DISPLAY_INIT:
+
+      u8x8_d_helper_display_init(u8x8);
+    
+      u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_v2_296x128_init_seq);    
+
+      u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_296x128_powersave0_seq);
+      u8x8_d_il3820_first_init(u8x8);
+      /* u8x8_d_il3820_second_init(u8x8); */  /* not required, u8g2.begin() will also clear the display once more */
+          
+      /* usually the DISPLAY_INIT message leaves the display in power save state */
+      /* however this is not done for e-paper devices, see: */
+      /* https://github.com/olikraus/u8g2/wiki/internal#powersave-mode */
+    
+      break;
+    case U8X8_MSG_DISPLAY_SET_POWER_SAVE:
+      if ( arg_int == 0 )
+	u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_296x128_powersave0_seq);
+      else
+	u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_296x128_powersave1_seq);
+      break;
+    case U8X8_MSG_DISPLAY_DRAW_TILE:
+      u8x8_d_il3820_draw_tile(u8x8, arg_int, arg_ptr);
+      break;
+    case U8X8_MSG_DISPLAY_REFRESH:
+      u8x8_cad_SendSequence(u8x8, u8x8_d_il3820_v2_to_display_seq);
+      break;
+    default:
+      return 0;
+  }
+  return 1;
 }
 
 
+