From 04e4eb35beb00d8c68d7d909087c051df9d0f62c Mon Sep 17 00:00:00 2001
From: DrDitto <DrDitto@users.noreply.github.com>
Date: Wed, 25 Sep 2019 17:41:04 -0600
Subject: [PATCH] MKS_MINI, FYSETC RGB, backlight (#15334)

---
 Marlin/src/Marlin.cpp                         |  10 +-
 .../lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp |  27 ++-
 Marlin/src/lcd/dogm/ultralcd_DOGM.cpp         |   8 +-
 Marlin/src/lcd/dogm/ultralcd_DOGM.h           | 190 ++++++++++++------
 Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h     |   1 -
 5 files changed, 154 insertions(+), 82 deletions(-)

diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp
index 46a6aa61ce..8be6a345b0 100644
--- a/Marlin/src/Marlin.cpp
+++ b/Marlin/src/Marlin.cpp
@@ -974,6 +974,12 @@ void setup() {
 
   // UI must be initialized before EEPROM
   // (because EEPROM code calls the UI).
+
+  // Set up LEDs early
+  #if HAS_COLOR_LEDS
+    leds.setup();
+  #endif
+
   ui.init();
   ui.reset_status();
 
@@ -1068,10 +1074,6 @@ void setup() {
     OUT_WRITE(STAT_LED_BLUE_PIN, LOW); // OFF
   #endif
 
-  #if HAS_COLOR_LEDS
-    leds.setup();
-  #endif
-
   #if HAS_CASE_LIGHT
     #if DISABLED(CASE_LIGHT_USE_NEOPIXEL)
       if (PWM_PIN(CASE_LIGHT_PIN)) SET_PWM(CASE_LIGHT_PIN); else SET_OUTPUT(CASE_LIGHT_PIN);
diff --git a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp
index 1dfb6be762..5a1326daf9 100644
--- a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp
+++ b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp
@@ -170,32 +170,45 @@ uint8_t u8g_dev_uc1701_mini12864_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m
     case U8G_DEV_MSG_INIT:
       u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS);
       u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_init_seq);
+      #if ENABLED(MKS_MINI_12864)
+        u8g_Delay(5);
+      #endif
       break;
 
     case U8G_DEV_MSG_STOP: break;
 
     case U8G_DEV_MSG_PAGE_NEXT: {
       u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
-
       u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start);
-      u8g_WriteByte(u8g, dev, 0x0B0 | (2*pb->p.page)); /* select current page */
-      u8g_SetAddress(u8g, dev, 1);           /* data mode */
+      #if ENABLED(MKS_MINI_12864)
+        u8g_Delay(5);
+      #endif
+      u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page)); /* select current page */
+      u8g_SetAddress(u8g, dev, 1); /* data mode */
       u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf);
       u8g_SetChipSelect(u8g, dev, 0);
-
       u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start);
-      u8g_WriteByte(u8g, dev, 0x0B0 | (2*pb->p.page+1)); /* select current page */
-      u8g_SetAddress(u8g, dev, 1);           /* data mode */
+      #if ENABLED(MKS_MINI_12864)
+        u8g_Delay(5);
+      #endif
+      u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page + 1)); /* select current page */
+      u8g_SetAddress(u8g, dev, 1); /* data mode */
       u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width);
       u8g_SetChipSelect(u8g, dev, 0);
     } break;
 
     case U8G_DEV_MSG_CONTRAST:
       u8g_SetChipSelect(u8g, dev, 1);
-      u8g_SetAddress(u8g, dev, 0);          /* instruction mode */
+      #if ENABLED(MKS_MINI_12864)
+        u8g_Delay(5);
+      #endif
+      u8g_SetAddress(u8g, dev, 0); /* instruction mode */
       u8g_WriteByte(u8g, dev, 0x081);
       u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2);
       u8g_SetChipSelect(u8g, dev, 0);
+      #if ENABLED(MKS_MINI_12864)
+        u8g_Delay(5);
+      #endif
       return 1;
   }
   return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg);
diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp
index 3d48243adf..02c9532349 100644
--- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp
+++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp
@@ -21,7 +21,7 @@
  */
 
 /**
- * ultralcd_DOGM.cpp
+ * lcd/dogm/ultralcd_DOGM.h
  *
  * Implementation of the LCD display routines for a DOGM128 graphic display.
  * by STB for ErikZalm/Marlin. Common LCD 128x64 pixel graphic displays.
@@ -30,9 +30,9 @@
  * License: http://opensource.org/licenses/BSD-3-Clause
  *
  * With the use of:
- * u8glib by Oliver Kraus
- * https://github.com/olikraus/U8glib_Arduino
- * License: http://opensource.org/licenses/BSD-3-Clause
+ *  u8glib by Oliver Kraus
+ *  https://github.com/olikraus/U8glib_Arduino
+ *  License: http://opensource.org/licenses/BSD-3-Clause
  */
 
 #include "../../inc/MarlinConfigPre.h"
diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h
index 4ccbcbe8b2..e8d1b8a1e3 100644
--- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h
+++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h
@@ -22,7 +22,7 @@
 #pragma once
 
 /**
- * ultralcd_DOGM.h
+ * lcd/dogm/ultralcd_DOGM.h
  */
 
 #include "../../inc/MarlinConfigPre.h"
@@ -30,7 +30,8 @@
 #include <U8glib.h>
 #include "HAL_LCD_class_defines.h"
 
-// LCD selection
+//#define ALTERNATIVE_LCD
+
 #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD)
   #define U8G_CLASS U8GLIB_ST7920_128X64_4X
   #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN)
@@ -40,102 +41,159 @@
   #endif
 
 #elif ENABLED(U8GLIB_ST7920)
+
   // RepRap Discount Full Graphics Smart Controller
+
   #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN)
-    #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL
-    #define U8G_PARAM LCD_PINS_RS // 2 stripes, HW SPI (shared with SD card, on AVR does not use standard LCD adapter)
+    #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL               // 2 stripes, HW SPI (Shared with SD card. Non-standard LCD adapter on AVR.)
+    #define U8G_PARAM LCD_PINS_RS
   #else
-    //#define U8G_CLASS U8GLIB_ST7920_128X64_4X
-    //#define U8G_PARAM LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS     // Original u8glib device. 2 stripes, SW SPI
-    #define U8G_CLASS U8GLIB_ST7920_128X64_RRD
-    #define U8G_PARAM LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS       // Number of stripes can be adjusted in ultralcd_st7920_u8glib_rrd.h with PAGE_HEIGHT
-                                                                      // AVR version ignores these pin settings
-                                                                      // HAL version uses these pin settings
+    #if ENABLED(ALTERNATIVE_LCD)
+      #define U8G_CLASS U8GLIB_ST7920_128X64_4X                 // 2 stripes, SW SPI (Original u8glib device)
+    #else
+      #define U8G_CLASS U8GLIB_ST7920_128X64_RRD                // Adjust stripes with PAGE_HEIGHT in ultralcd_st7920_u8glib_rrd.h
+    #endif
+    #define U8G_PARAM LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS // AVR version ignores these pin settings
+                                                                // HAL version uses these pin settings
   #endif
 
 #elif ENABLED(CARTESIO_UI)
-  // The CartesioUI display
-  //#define U8G_CLASS U8GLIB_DOGM128_2X
-  //#define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0   // 4 stripes
-  #define U8G_CLASS U8GLIB_DOGM128_2X
-  #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                              // 4 stripes
+
+  // CartesioUI LCD
+
+  #if ENABLED(ALTERNATIVE_LCD)
+    #define U8G_CLASS U8GLIB_DOGM128_2X                         // 4 stripes
+    #define FORCE_SOFT_SPI                                      // SW-SPI
+  #else
+    #define U8G_CLASS U8GLIB_DOGM128_2X                         // 4 stripes (HW-SPI)
+  #endif
 
 #elif ENABLED(U8GLIB_LM6059_AF)
+
   // Based on the Adafruit ST7565 (http://www.adafruit.com/products/250)
-  //#define U8G_CLASS U8GLIB_LM6059
-  //#define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // 8 stripes
-  #define U8G_CLASS U8GLIB_LM6059_2X
-  #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                              // 4 stripes
+
+  #if ENABLED(ALTERNATIVE_LCD)
+    #define U8G_CLASS U8GLIB_LM6059                             // 8 stripes (HW-SPI)
+  #else
+    #define U8G_CLASS U8GLIB_LM6059_2X                          // 4 stripes (HW-SPI)
+  #endif
 
 #elif ENABLED(U8GLIB_ST7565_64128N)
-  // The MaKrPanel, Mini Viki, Viki 2.0 & AZSMZ 12864 ST7565 controller
+
+  // MaKrPanel, Mini Viki, Viki 2.0, AZSMZ 12864 ST7565 controller
+
   #define SMART_RAMPS (MB(RAMPS_SMART_EFB) || MB(RAMPS_SMART_EEB) || MB(RAMPS_SMART_EFF) || MB(RAMPS_SMART_EEF) || MB(RAMPS_SMART_SF))
-  #if DOGLCD_SCK == SCK_PIN && DOGLCD_MOSI == MOSI_PIN && !SMART_RAMPS
-    #define U8G_CLASS U8GLIB_64128N_2X_HAL
-    #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // using HW-SPI
-  #else
-    #define U8G_CLASS U8GLIB_64128N_2X_HAL
-    #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0   // using SW-SPI
+  #define U8G_CLASS U8GLIB_64128N_2X_HAL                        // 4 stripes (HW-SPI)
+  #if SMART_RAMPS || DOGLCD_SCK != SCK_PIN || DOGLCD_MOSI != MOSI_PIN
+    #define FORCE_SOFT_SPI                                      // SW-SPI
   #endif
 
 #elif ENABLED(MKS_12864OLED_SSD1306)
+
   // MKS 128x64 (SSD1306) OLED I2C LCD
-  #define U8G_CLASS U8GLIB_SSD1306_128X64
-  #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0     // 8 stripes
-  //#define U8G_CLASS U8GLIB_SSD1306_128X64_2X
-  //#define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0   // 4 stripes
+
+  #define FORCE_SOFT_SPI                                        // SW-SPI
+
+  #if ENABLED(ALTERNATIVE_LCD)
+    #define U8G_CLASS U8GLIB_SSD1306_128X64_2X                  // 4 stripes
+  #else
+    #define U8G_CLASS U8GLIB_SSD1306_128X64                     // 8 stripes
+  #endif
 
 #elif ENABLED(U8GLIB_SSD1306)
-  // Generic support for SSD1306 OLED I2C LCDs
-  //#define U8G_CLASS U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE
-  //#define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST)           // 4 stripes
-  #define U8G_CLASS U8GLIB_SSD1306_128X64_2X
-  #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST)             // 4 stripes
+
+  // Generic SSD1306 OLED I2C LCD
+
+  #if ENABLED(ALTERNATIVE_LCD)
+    #define U8G_CLASS U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE       // 4 stripes
+  #else
+    #define U8G_CLASS U8GLIB_SSD1306_128X64_2X                  // 4 stripes
+  #endif
+  #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST)
 
 #elif ENABLED(MKS_12864OLED)
+
   // MKS 128x64 (SH1106) OLED I2C LCD
-  #define U8G_CLASS U8GLIB_SH1106_128X64
-  #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0     // 8 stripes
-  //#define U8G_CLASS U8GLIB_SH1106_128X64_2X
-  //#define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0   // 4 stripes
-#elif ENABLED(U8GLIB_SH1106)
-  // Generic support for SH1106 OLED I2C LCDs
-  //#define U8G_CLASS U8GLIB_SH1106_128X64_2X_I2C_2_WIRE
-  //#define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST)           // 4 stripes
-  #define U8G_CLASS U8GLIB_SH1106_128X64_2X
-  #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST)             // 4 stripes
-#elif ENABLED(U8GLIB_SSD1309)
-  // Generic support for SSD1309 OLED I2C LCDs
-  #define U8G_CLASS U8GLIB_SSD1309_128X64
-  #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST)
-#elif ENABLED(MINIPANEL)
-  // MINIPanel display
-  //#define U8G_CLASS U8GLIB_MINI12864
-  //#define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // 8 stripes
-  #define U8G_CLASS U8GLIB_MINI12864_2X
-  #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                              // 8 stripes
-#elif ENABLED(FYSETC_MINI_12864)
-  // The FYSETC_MINI_12864 display
-  #define U8G_CLASS U8GLIB_MINI12864_2X_HAL
-  #if ENABLED(FORCE_SOFT_SPI)
-    #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0   // 4 stripes SW-SPI
+
+  #define FORCE_SOFT_SPI                                        // SW-SPI
+
+  #if ENABLED(ALTERNATIVE_LCD)
+    #define U8G_CLASS U8GLIB_SH1106_128X64_2X                   // 4 stripes
   #else
-    #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // 4 stripes HW-SPI
+    #define U8G_CLASS U8GLIB_SH1106_128X64                      // 8 stripes
   #endif
+
+#elif ENABLED(U8GLIB_SH1106)
+
+  // Generic SH1106 OLED I2C LCD
+
+  #if ENABLED(ALTERNATIVE_LCD)
+    #define U8G_CLASS U8GLIB_SH1106_128X64_2X_I2C_2_WIRE        // 4 stripes
+  #else
+    #define U8G_CLASS U8GLIB_SH1106_128X64_2X                   // 4 stripes
+  #endif
+  #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST)       // I2C
+
+#elif ENABLED(U8GLIB_SSD1309)
+
+  // Generic support for SSD1309 OLED I2C LCDs
+
+  #define U8G_CLASS U8GLIB_SSD1309_128X64
+  #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST)       // I2C
+
+#elif ENABLED(FYSETC_MINI_12864)
+
+  // The FYSETC Mini 12864 display
+
+  #define U8G_CLASS U8GLIB_MINI12864_2X_HAL                     // 4 stripes
+
+#elif ENABLED(MKS_MINI_12864)
+
+  // The MKS_MINI_12864 V1/V2 aren't exact copies of the MiniPanel.
+  // Panel management is in u8g_dev_uc1701_mini12864_HAL.cpp with
+  // extra delays added to remove glitches seen with fast MCUs.
+
+  #define U8G_CLASS U8GLIB_MINI12864_2X_HAL                     // 8 stripes (HW-SPI)
+
+#elif ENABLED(MINIPANEL)
+
+  #if ENABLED(ALTERNATIVE_LCD)
+    #define U8G_CLASS U8GLIB_MINI12864
+  #else
+    #define U8G_CLASS U8GLIB_MINI12864_2X                       // 8 stripes (HW-SPI)
+  #endif
+
 #elif ENABLED(U8GLIB_SH1106_EINSTART)
+
   // Connected via motherboard header
+
   #define U8G_CLASS U8GLIB_SH1106_128X64
   #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS
+
 #elif ENABLED(FSMC_GRAPHICAL_TFT)
+
   // Unspecified 320x240 TFT pre-initialized by built-in bootloader
+
   #define U8G_CLASS U8GLIB_TFT_320X240_UPSCALE_FROM_128X64
   #define U8G_PARAM FSMC_CS_PIN, FSMC_RS_PIN
+
 #else
-  // for regular DOGM128 display with HW-SPI
-  //#define U8G_CLASS U8GLIB_DOGM128
-  //#define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // HW-SPI Com: CS, A0  // 8 stripes
-  #define U8G_CLASS U8GLIB_DOGM128_2X
-  #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                              // HW-SPI Com: CS, A0 // 4 stripes
+
+  #if ENABLED(ALTERNATIVE_LCD)
+    #define U8G_CLASS U8GLIB_DOGM128                            // 8 stripes (HW-SPI)
+  #else
+    #define U8G_CLASS U8GLIB_DOGM128_2X                         // 4 stripes (HW-SPI)
+  #endif
+
+#endif
+
+// Use HW-SPI if no other option is specified
+#ifndef U8G_PARAM
+  #if ENABLED(FORCE_SOFT_SPI)
+    #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0 // SW-SPI
+  #else
+    #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                      // HW-SPI
+  #endif
 #endif
 
 #ifndef LCD_PIXEL_WIDTH
diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h
index 137952fd67..36b558ec19 100644
--- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h
+++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h
@@ -217,7 +217,6 @@
       #define DOGLCD_A0    P0_16
       #define DOGLCD_SCK   P0_07
       #define DOGLCD_MOSI  P1_20
-      #define FORCE_SOFT_SPI
 
       #define LCD_BACKLIGHT_PIN -1