From e5bc9d31cc87be5c7ef2bd3cd70c2599f76d2bd7 Mon Sep 17 00:00:00 2001
From: Victor Oliveira <rhapsodyv@gmail.com>
Date: Wed, 1 Jul 2020 03:30:24 -0300
Subject: [PATCH] Add TFT_LVGL_UI support (#18438)

---
 Marlin/Configuration.h                        |    7 +-
 .../STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp  |    2 +-
 Marlin/src/MarlinCore.cpp                     |    9 +-
 Marlin/src/feature/touch/xpt2046.cpp          |   56 +-
 ...8g_dev_tft_320x240_upscale_from_128x64.cpp |    2 +-
 Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp    |    4 +-
 .../src/lcd/extui/lib/mks_ui/draw_about.cpp   |   27 +-
 .../extui/lib/mks_ui/draw_change_speed.cpp    |   12 +-
 .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp  |   12 +-
 .../extui/lib/mks_ui/draw_error_message.cpp   |    4 +-
 .../lcd/extui/lib/mks_ui/draw_extrusion.cpp   |    4 +-
 Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp  |    4 +-
 Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp |    8 +-
 .../lcd/extui/lib/mks_ui/draw_language.cpp    |   12 +-
 .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp  |    4 +-
 .../lcd/extui/lib/mks_ui/draw_move_motor.cpp  |    4 +-
 .../lcd/extui/lib/mks_ui/draw_opration.cpp    |   12 +-
 .../extui/lib/mks_ui/draw_pause_message.cpp   |    4 +-
 .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp |    4 +-
 .../lcd/extui/lib/mks_ui/draw_print_file.cpp  |   86 +-
 .../lcd/extui/lib/mks_ui/draw_printing.cpp    |   10 +-
 .../lcd/extui/lib/mks_ui/draw_ready_print.cpp |    6 +-
 Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp  |   48 +-
 Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp |    4 +-
 Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp   |  119 +-
 Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h     |    9 +-
 .../lcd/extui/lib/mks_ui/gb2312_puhui16.cpp   |    8 +-
 .../extui/lib/mks_ui/mks_hardware_test.cpp    |    7 +-
 .../src/lcd/extui/lib/mks_ui/pic_manager.cpp  |  827 +++++------
 Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h |  125 +-
 .../lcd/extui/lib/mks_ui/printer_opration.cpp |    4 +-
 Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp  |    6 +-
 .../lib/mks_ui/tft_lvgl_configuration.cpp     | 1294 ++++++++---------
 .../extui/lib/mks_ui/tft_multi_language.cpp   |    4 +-
 Marlin/src/pins/pins.h                        |    4 +-
 Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h     |   65 +
 Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h     |   65 +
 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h |    2 +-
 platformio.ini                                |   19 +-
 39 files changed, 1515 insertions(+), 1388 deletions(-)

diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 6daedf8156..ac32add6b9 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -2135,9 +2135,12 @@
 //#define FSMC_GRAPHICAL_TFT
 
 //
-// TFT Little VGL UI
+// TFT LVGL UI
 //
-//#define TFT_LITTLE_VGL_UI
+// Default MKS icons and fonts: https://git.io/JJvzK
+// Copy mks_pic and mks_font folders to the root of your SD
+//
+//#define TFT_LVGL_UI
 
 //=============================================================================
 //============================  Other Controllers  ============================
diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp
index cc26a003d1..d61723e269 100644
--- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp
+++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp
@@ -291,7 +291,7 @@ uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) {
   return uint32_t(data);
 }
 
-#if ENABLED(LCD_USE_DMA_FSMC)
+#ifdef LCD_USE_DMA_FSMC
 
 void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) {
   while (count > 0) {
diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp
index 1334b9506b..976edfe7ce 100644
--- a/Marlin/src/MarlinCore.cpp
+++ b/Marlin/src/MarlinCore.cpp
@@ -59,7 +59,7 @@
 #include "gcode/parser.h"
 #include "gcode/queue.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
   #include "lvgl.h"
   #include "lcd/extui/lib/mks_ui/tft_lvgl_configuration.h"
   #include "lcd/extui/lib/mks_ui/draw_ui.h"
@@ -743,7 +743,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
   // Direct Stepping
   TERN_(DIRECT_STEPPING, page_manager.write_responses());
 
-  #if ENABLED(TFT_LITTLE_VGL_UI)
+  #if ENABLED(TFT_LVGL_UI)
     LV_TASK_HANDLER();
   #endif
 }
@@ -1180,7 +1180,8 @@ void setup() {
     SETUP_RUN(page_manager.init());
   #endif
 
-  #if ENABLED(TFT_LITTLE_VGL_UI)
+  #if ENABLED(TFT_LVGL_UI)
+    if (!card.isMounted()) SETUP_RUN(card.mount()); // Mount SD to load graphics and fonts
     SETUP_RUN(tft_lvgl_init());
   #endif
 
@@ -1216,7 +1217,7 @@ void loop() {
 
     endstops.event_handler();
 
-    TERN_(TFT_LITTLE_VGL_UI, printer_state_polling());
+    TERN_(TFT_LVGL_UI, printer_state_polling());
 
   } while (ENABLED(__AVR__)); // Loop forever on slower (AVR) boards
 }
diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/feature/touch/xpt2046.cpp
index 463034d96b..9c84e4d95c 100644
--- a/Marlin/src/feature/touch/xpt2046.cpp
+++ b/Marlin/src/feature/touch/xpt2046.cpp
@@ -101,39 +101,41 @@ void XPT2046::init() {
 #include "../../lcd/ultralcd.h" // For EN_C bit mask
 
 uint8_t XPT2046::read_buttons() {
-  int16_t tsoffsets[4] = { 0 };
-
-  if (tsoffsets[0] + tsoffsets[1] == 0) {
-    // Not yet set, so use defines as fallback...
-    tsoffsets[0] = XPT2046_X_CALIBRATION;
-    tsoffsets[1] = XPT2046_X_OFFSET;
-    tsoffsets[2] = XPT2046_Y_CALIBRATION;
-    tsoffsets[3] = XPT2046_Y_OFFSET;
-  }
+  #ifdef HAS_SPI_LCD
+    int16_t tsoffsets[4] = { 0 };
+
+    if (tsoffsets[0] + tsoffsets[1] == 0) {
+      // Not yet set, so use defines as fallback...
+      tsoffsets[0] = XPT2046_X_CALIBRATION;
+      tsoffsets[1] = XPT2046_X_OFFSET;
+      tsoffsets[2] = XPT2046_Y_CALIBRATION;
+      tsoffsets[3] = XPT2046_Y_OFFSET;
+    }
 
-  // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible.
+    // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible.
 
-  if (!isTouched()) return 0;
-  const uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1],
-                 y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3];
-  if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read.
+    if (!isTouched()) return 0;
+    const uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1],
+                  y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3];
+    if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read.
 
-  // Touch within the button area simulates an encoder button
-  if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT)
-    return WITHIN(x,  14,  77) ? EN_D
-         : WITHIN(x,  90, 153) ? EN_A
-         : WITHIN(x, 166, 229) ? EN_B
-         : WITHIN(x, 242, 305) ? EN_C
-         : 0;
+    // Touch within the button area simulates an encoder button
+    if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT)
+      return WITHIN(x,  14,  77) ? EN_D
+          : WITHIN(x,  90, 153) ? EN_A
+          : WITHIN(x, 166, 229) ? EN_B
+          : WITHIN(x, 242, 305) ? EN_C
+          : 0;
 
-  if (x > TOUCH_SCREEN_WIDTH || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT)) return 0;
+    if (x > TOUCH_SCREEN_WIDTH || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT)) return 0;
 
-  // Column and row above BUTTON_AREA_TOP
-  int8_t col = (x - (SCREEN_START_LEFT)) * (LCD_WIDTH) / (TOUCHABLE_X_WIDTH),
-         row = (y - (SCREEN_START_TOP)) * (LCD_HEIGHT) / (TOUCHABLE_Y_HEIGHT);
+    // Column and row above BUTTON_AREA_TOP
+    int8_t col = (x - (SCREEN_START_LEFT)) * (LCD_WIDTH) / (TOUCHABLE_X_WIDTH),
+          row = (y - (SCREEN_START_TOP)) * (LCD_HEIGHT) / (TOUCHABLE_Y_HEIGHT);
 
-  // Send the touch to the UI (which will simulate the encoder wheel)
-  MarlinUI::screen_click(row, col, x, y);
+    // Send the touch to the UI (which will simulate the encoder wheel)
+    MarlinUI::screen_click(row, col, x, y);
+  #endif
   return 0;
 }
 
diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp
index 20fd44f580..0f602246b4 100644
--- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp
+++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp
@@ -64,7 +64,7 @@
 
 #include <string.h>
 
-#if ENABLED(LCD_USE_DMA_FSMC)
+#ifdef LCD_USE_DMA_FSMC
   extern void LCD_IO_WriteReg(uint16_t Reg);
   extern void LCD_IO_WriteData(uint16_t RegValue);
   extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length);
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp
index 21ed3f999c..2ad14357a1 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp
@@ -22,7 +22,7 @@
 #include "../../../../inc/MarlinConfigPre.h"
 
 #if 1 // ENABLED(SPI_FLASH)
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include <SPI.h>
 #include "../../../../inc/MarlinConfig.h"
@@ -391,5 +391,5 @@ void ext_FLASH::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16
 
 void ext_FLASH::lv_pic_read(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) {SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size);}
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
 #endif // 1 ... SPI_FLASH
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp
index 8193563e41..a65bf818ec 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "lv_conf.h"
 #include "draw_ui.h"
@@ -99,29 +99,28 @@ void lv_draw_about(void) {
 
   fw_version = lv_label_create(scr, NULL);
   lv_obj_set_style(fw_version, &tft_style_lable_rel);
-  lv_label_set_text(fw_version, "Version: V_2.0.5.3");
+  lv_label_set_text(fw_version, SHORT_BUILD_VERSION);
   lv_obj_align(fw_version, NULL, LV_ALIGN_CENTER, 0, -60);
 
   fw_type = lv_label_create(scr, NULL);
   lv_obj_set_style(fw_type, &tft_style_lable_rel);
-  #if (MOTHERBOARD == BOARD_MKS_ROBIN_PRO)
-    lv_label_set_text(fw_type, "Firmware: Robin_Pro35");
-  #elif (MOTHERBOARD == BOARD_MKS_ROBIN_NANO)
-    lv_label_set_text(fw_type, "Firmware: Robin_Nano35");
-  #endif
+  lv_label_set_text(fw_type,
+    #if MB(MKS_ROBIN_PRO)
+      "Firmware: Robin_Pro35"
+    #elif MB(MKS_ROBIN_NANO)
+      "Firmware: Robin_Nano35"
+    #else
+      CUSTOM_MACHINE_NAME
+    #endif
+  );
   lv_obj_align(fw_type, NULL, LV_ALIGN_CENTER, 0, -20);
 
   board = lv_label_create(scr, NULL);
   lv_obj_set_style(board, &tft_style_lable_rel);
-  #if (MOTHERBOARD == BOARD_MKS_ROBIN_PRO)
-    lv_label_set_text(board, "Board: MKS Robin pro");
-  #elif (MOTHERBOARD == BOARD_MKS_ROBIN_NANO)
-    lv_label_set_text(board, "Board: MKS Robin nano");
-  #endif
-
+  lv_label_set_text(board, "Board: " BOARD_INFO_NAME);
   lv_obj_align(board, NULL, LV_ALIGN_CENTER, 0, 20);
 }
 
 void lv_clear_about() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp
index 6d44ecb71c..864b5781b4 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "lv_conf.h"
 #include "draw_ui.h"
@@ -310,13 +310,13 @@ void disp_print_speed() {
 void disp_speed_type() {
   switch (speedType) {
     case 1:
-      lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_Extruct_speed_sel.bin", 0);
-      lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_Mov_speed.bin", 0);
+      lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_extruct_sel.bin", 0);
+      lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_mov_changespeed.bin", 0);
       break;
 
     default:
-      lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_Extruct_speed.bin", 0);
-      lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_Mov_speed_sel.bin", 0);
+      lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_Extruct.bin", 0);
+      lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_mov_sel.bin", 0);
       break;
   }
   lv_obj_refresh_ext_draw_pad(buttonExt);
@@ -333,4 +333,4 @@ void disp_speed_type() {
 
 void lv_clear_change_speed() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp
index 5620af8c99..c87df26b1d 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp
@@ -26,7 +26,7 @@
 
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "lv_conf.h"
 #include "draw_ui.h"
@@ -61,7 +61,9 @@ static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) {
   }
   else if (event == LV_EVENT_RELEASED) {
     if (DialogType == DIALOG_TYPE_PRINT_FILE) {
-      preview_gcode_prehandle(list_file.file_name[sel_id]);
+      #if HAS_GCODE_PREVIEW
+        preview_gcode_prehandle(list_file.file_name[sel_id]);
+      #endif
       reset_print_time();
       start_print_time();
 
@@ -202,7 +204,7 @@ void lv_draw_dialog(uint8_t type) {
   style_btn_rel.body.shadow.type = LV_SHADOW_BOTTOM;
   style_btn_rel.body.radius = LV_RADIUS_CIRCLE;
   style_btn_rel.text.color = lv_color_hex3(0xDEF);
-  style_btn_rel.text.font = &gb2312_puhui32;
+  style_btn_rel.text.font = &lv_font_roboto_22;
 
   static lv_style_t style_btn_pr;                                    // A variable to store the pressed style
   lv_style_copy(&style_btn_pr, &style_btn_rel);                      // Initialize from the released style
@@ -211,7 +213,7 @@ void lv_draw_dialog(uint8_t type) {
   style_btn_pr.body.grad_color = lv_color_hex3(0x24A);
   style_btn_pr.body.shadow.width = 2;
   style_btn_pr.text.color = lv_color_hex3(0xBCD);
-  style_btn_pr.text.font = &gb2312_puhui32;
+  style_btn_pr.text.font = &lv_font_roboto_22;
 
   lv_obj_t * labelDialog = lv_label_create(scr, NULL);
   lv_obj_set_style(labelDialog, &tft_style_lable_rel);
@@ -340,4 +342,4 @@ void lv_draw_dialog(uint8_t type) {
 
 void lv_clear_dialog() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp
index de57804c2d..6c7a73d8cf 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "lv_conf.h"
 #include "draw_ui.h"
@@ -81,4 +81,4 @@ void lv_draw_error_message(PGM_P const msg) {
 
 void lv_clear_error_message() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp
index 14d7ed0410..a8290d39fe 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "lv_conf.h"
 #include "draw_ui.h"
@@ -375,4 +375,4 @@ void disp_ext_step() {
 
 void lv_clear_extrusion() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp
index d5bf62ab3e..0d907fea3d 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "../../../../MarlinCore.h"
 #include "lv_conf.h"
@@ -244,4 +244,4 @@ void disp_fan_value() {
 
 void lv_clear_fan() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp
index 79f550afef..87c9a35105 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "../../../../MarlinCore.h"
 #include "draw_ready_print.h"
@@ -190,13 +190,13 @@ void lv_draw_home(void) {
     lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_PR, &tft_style_lable_pre);
     lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_REL, &tft_style_lable_rel);
 
-    lv_obj_set_event_cb_mks(buttonOffAll, event_handler, ID_H_OFF_ALL, "bmp_Motor_off.bin", 0);
+    lv_obj_set_event_cb_mks(buttonOffAll, event_handler, ID_H_OFF_ALL, "bmp_manual_off.bin", 0);
     lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_REL, &bmp_pic);
     lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_PR, &bmp_pic);
     lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_PR, &tft_style_lable_pre);
     lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_REL, &tft_style_lable_rel);
 
-    lv_obj_set_event_cb_mks(buttonOffXY, event_handler, ID_H_OFF_XY, "bmp_Motor_off.bin", 0);
+    lv_obj_set_event_cb_mks(buttonOffXY, event_handler, ID_H_OFF_XY, "bmp_manual_off.bin", 0);
     lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_REL, &bmp_pic);
     lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_PR, &bmp_pic);
     lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_PR, &tft_style_lable_pre);
@@ -280,4 +280,4 @@ void lv_draw_home(void) {
 
 void lv_clear_home() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp
index c5c77e8985..1237c12bbe 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "lv_conf.h"
 #include "draw_ui.h"
@@ -61,7 +61,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) {
       }
       else if (event == LV_EVENT_RELEASED) {
         disp_language(gCfgItems.language, UNSELECTED);
-        lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_Simple_cn_sel.bin", 0);
+        lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_simplified_cn_sel.bin", 0);
         gCfgItems.language = LANG_SIMPLE_CHINESE;
         gCfg_to_spiFlah();
         disp_language_init();
@@ -73,7 +73,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) {
       }
       else if (event == LV_EVENT_RELEASED) {
         disp_language(gCfgItems.language, UNSELECTED);
-        lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_Tradition_cn_sel.bin", 0);
+        lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_traditional_cn_sel.bin", 0);
         gCfgItems.language = LANG_COMPLEX_CHINESE;
         gCfg_to_spiFlah();
         disp_language_init();
@@ -258,14 +258,14 @@ void lv_draw_language(void) {
   buttonBack = lv_imgbtn_create(scr, NULL);
 
 
-  lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_Simple_cn.bin", 0);
+  lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_simplified_cn.bin", 0);
   lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, &bmp_pic);
   lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, &bmp_pic);
   lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_PR, &tft_style_lable_pre);
   lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_REL, &tft_style_lable_rel);
   lv_obj_clear_protect(buttonCN, LV_PROTECT_FOLLOW);
   #if 1
-    lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_Tradition_cn.bin", 0);
+    lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_traditional_cn.bin", 0);
     lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, &bmp_pic);
     lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, &bmp_pic);
     lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_PR, &tft_style_lable_pre);
@@ -367,4 +367,4 @@ void lv_draw_language(void) {
 
 void lv_clear_language() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp
index b97483ec9d..d4e6fa81cb 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "../../../../MarlinCore.h"
 #include "lv_conf.h"
@@ -281,4 +281,4 @@ void lv_draw_manualLevel(void) {
 
 void lv_clear_manualLevel() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp
index 71d5d7427a..ed5af48b90 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "../../../../MarlinCore.h"
 #include "lv_conf.h"
@@ -326,4 +326,4 @@ void disp_move_dist() {
 
 void lv_clear_move_motor() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp
index 483de3fcc8..1fbaf056e2 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "lv_conf.h"
 #include "draw_ui.h"
@@ -116,7 +116,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) {
       else if (event == LV_EVENT_RELEASED) {
         if (gCfgItems.finish_power_off == 1) {
           gCfgItems.finish_power_off = 0;
-          lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_Mamual.bin", 0);
+          lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_manual_off.bin", 0); //dindt find bmp_Mamual...
           lv_label_set_text(label_PowerOff, printing_more_menu.manual);
           lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
           lv_obj_refresh_ext_draw_pad(label_PowerOff);
@@ -124,7 +124,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) {
         }
         else {
           gCfgItems.finish_power_off = 1;
-          lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_Auto.bin", 0);
+          lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_auto_off.bin", 0);
           lv_label_set_text(label_PowerOff, printing_more_menu.auto_close);
           lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
           lv_obj_refresh_ext_draw_pad(label_PowerOff);
@@ -218,9 +218,9 @@ void lv_draw_opration(void) {
       lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_lable_rel);
     }
     if (gCfgItems.finish_power_off == 1)
-      lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_Auto.bin", 0);
+      lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_auto_off.bin", 0);
     else
-      lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_Mamual.bin", 0);
+      lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_manual_off.bin", 0);
     lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, &bmp_pic);
     lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, &bmp_pic);
     lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_PR, &tft_style_lable_pre);
@@ -319,4 +319,4 @@ void lv_draw_opration(void) {
 
 void lv_clear_opration() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp
index cf477ec104..f66c2bde99 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if BOTH(TFT_LITTLE_VGL_UI, ADVANCED_PAUSE_FEATURE)
+#if BOTH(TFT_LVGL_UI, ADVANCED_PAUSE_FEATURE)
 
 #include "draw_ui.h"
 #include "lv_conf.h"
@@ -52,4 +52,4 @@ void lv_draw_pause_message(const PauseMessage msg) {
   }
 }
 
-#endif // TFT_LITTLE_VGL_UI && ADVANCED_PAUSE_FEATURE
+#endif // TFT_LVGL_UI && ADVANCED_PAUSE_FEATURE
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp
index beea30018c..27d011e000 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "lv_conf.h"
 #include "draw_ui.h"
@@ -389,4 +389,4 @@ void disp_step_heat() {
 
 void lv_clear_preHeat() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp
index cc9fa0e04d..e8647aaa37 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "../../../../MarlinCore.h"
 #include "lv_conf.h"
@@ -324,7 +324,7 @@ void disp_gcode_icon(uint8_t file_num) {
     lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_PR, &tft_style_lable_pre);
     lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_REL, &tft_style_lable_rel);
 
-    lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, "bmp_Back.bin", 0);
+    lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, "bmp_Return.bin", 0);
     lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic_117x92);
     lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic_117x92);
     lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
@@ -445,21 +445,9 @@ void disp_gcode_icon(uint8_t file_num) {
 
 void lv_open_gcode_file(char *path) {
   #if ENABLED(SDSUPPORT)
-    //uint32_t read;
-    uint32_t *ps4;
-    int pre_sread_cnt;
     char *cur_name;
-
     cur_name = strrchr(path, '/');
-
     card.openFileRead(cur_name);
-    card.read(public_buf, 512);
-    ps4 = (uint32_t *)strstr((char *)public_buf, ";simage:");
-
-    if (ps4) {
-      pre_sread_cnt = (uint32_t)ps4 - (uint32_t)((uint32_t *)(&public_buf[0]));
-      card.setIndex(pre_sread_cnt + 8);
-    }
   #endif
 }
 
@@ -480,30 +468,64 @@ int ascii2dec_test(char *ascii) {
   return result;
 }
 
-void lv_gcode_file_read(uint8_t *data_buf) {
-  #if ENABLED(SDSUPPORT)
-    uint16_t i = 0, j = 0, k = 0;
-    //uint32_t read;
-    uint16_t row_1 = 0;
+void lv_gcode_file_read(uint8_t *data_buf)
+{
+	#if ENABLED (SDSUPPORT)
+    uint16_t i=0,j=0,k=0;
+    uint16_t row_1=0;
+    bool ignore_start = true;
     char temp_test[200];
+    volatile uint16_t *p_index;
+
+    memset(public_buf, 0, 200);
 
-    while (1) {
-      card.read(temp_test, 200);
-      for (i = 0; i < 200;) {
-        public_buf[row_1 * 200 + 100 * k + j] = (char)(ascii2dec_test(&temp_test[i]) << 4 | ascii2dec_test(&temp_test[i + 1]));
+    while(card.isFileOpen())
+    {
+      if (ignore_start) card.read(temp_test, 8); //line start -> ignore
+      card.read(temp_test, 200); //data
+      //\r;;gimage: we got the bit img, so stop here
+      if (temp_test[1] == ';') {
+        card.closefile();
+        break;
+      }
+      for(i=0;i<200;) {
+        public_buf[row_1*200+100*k+j] = (char)(ascii2dec_test(&temp_test[i])<<4|ascii2dec_test(&temp_test[i+1]));
         j++;
-        i += 2;
+        i+=2;
       }
-      k++;
-      j = 0;
-      if (k >= 2) {
-        k = 0;
-        card.read(temp_test, 9);
+
+      uint16_t c = card.get();
+      //check if we have more data or finished the line (CR)
+      if (c == '\r') {
         break;
       }
+      card.setIndex(card.getIndex());
+      k++;
+      j=0;
+      ignore_start = false;
     }
-    memcpy(data_buf, public_buf, 200);
-  #endif
+    #if ENABLED(SPI_GRAPHICAL_TFT)
+      for(i=0;i<200;)
+      {
+        p_index = (uint16_t *)(&public_buf[i]);
+
+            //Color = (*p_index >> 8);
+        //*p_index = Color | ((*p_index & 0xff) << 8);
+        i+=2;
+        if(*p_index == 0x0000)*p_index=LV_COLOR_BACKGROUND.full;
+      }
+    #else
+      for(i=0;i<200;)
+      {
+        p_index = (uint16_t *)(&public_buf[i]);
+        //Color = (*p_index >> 8);
+        //*p_index = Color | ((*p_index & 0xff) << 8);
+        i+=2;
+        if(*p_index == 0x0000)*p_index=LV_COLOR_BACKGROUND.full; // 0x18C3; //
+      }
+    #endif
+    memcpy(data_buf,public_buf,200);
+	#endif
 }
 
 void lv_close_gcode_file() {TERN_(SDSUPPORT, card.closefile());}
@@ -592,4 +614,4 @@ void cutFileName(char *path, int len, int bytePerLine,  char *outStr) {
 
 void lv_clear_print_file() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp
index 6580cc9e43..e15de7021f 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "lv_conf.h"
 #include "draw_ui.h"
@@ -308,13 +308,13 @@ void lv_draw_printing(void) {
       lv_label_set_text(labelPause, printing_menu.pause);
     else
       lv_label_set_text(labelPause, printing_menu.resume);
-    lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0);
+    lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 20, 0);
 
     lv_label_set_text(labelStop, printing_menu.stop);
-    lv_obj_align(labelStop, buttonStop, LV_ALIGN_CENTER, 30, 0);
+    lv_obj_align(labelStop, buttonStop, LV_ALIGN_CENTER, 20, 0);
 
     lv_label_set_text(labelOperat, printing_menu.option);
-    lv_obj_align(labelOperat, buttonOperat, LV_ALIGN_CENTER, 30, 0);
+    lv_obj_align(labelOperat, buttonOperat, LV_ALIGN_CENTER, 20, 0);
   }
 
   lv_style_copy(&lv_bar_style_indic, &lv_style_pretty_color);
@@ -440,4 +440,4 @@ void setProBarRate() {
 
 void lv_clear_printing() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp
index a3708ef3cc..1551705704 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "draw_ready_print.h"
 #include "draw_tool.h"
@@ -260,7 +260,7 @@ void lv_draw_ready_print(void) {
     buttonTool = lv_imgbtn_create(scr, NULL);
     buttonSet = lv_imgbtn_create(scr, NULL);
 
-    lv_obj_set_event_cb_mks(buttonPrint, event_handler, ID_PRINT, "bmp_Print.bin", 0);
+    lv_obj_set_event_cb_mks(buttonPrint, event_handler, ID_PRINT, "bmp_printing.bin", 0);
     //lv_imgbtn_set_src_mks(buttonPrint, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_printing.bin");
     lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_REL, &bmp_pic);
     lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_PR, &bmp_pic);
@@ -316,4 +316,4 @@ void lv_draw_ready_print(void) {
 
 void lv_clear_ready_print() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp
index e41e943e8c..45354def65 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "../../../../MarlinCore.h"
 #include "draw_ready_print.h"
@@ -33,6 +33,7 @@
 //#include "../lvgl/src/lv_core/lv_refr.h"
 #include "draw_ui.h"
 #include "../../../../gcode/queue.h"
+#include "pic_manager.h"
 
 static lv_obj_t * scr;
 
@@ -110,7 +111,10 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) {
 
 void lv_draw_set(void) {
   lv_obj_t *buttonFan, *buttonAbout;
-  lv_obj_t *buMotorOff, *buttonLanguage, *buttonBack;
+  lv_obj_t *buMotorOff, *buttonBack;
+  #if HAS_LANG_SELECT_SCREEN
+    lv_obj_t *buttonLanguage;
+  #endif
 
   if (disp_state_stack._disp_state[disp_state_stack._disp_index] != SET_UI) {
     disp_state_stack._disp_index++;
@@ -141,7 +145,9 @@ void lv_draw_set(void) {
   buttonAbout = lv_imgbtn_create(scr, NULL);
   //buttonContinue = lv_imgbtn_create(scr, NULL);
   buMotorOff = lv_imgbtn_create(scr, NULL);
-  buttonLanguage = lv_imgbtn_create(scr, NULL);
+  #if HAS_LANG_SELECT_SCREEN
+    buttonLanguage = lv_imgbtn_create(scr, NULL);
+  #endif
   buttonBack = lv_imgbtn_create(scr, NULL);
 
 
@@ -170,20 +176,22 @@ void lv_draw_set(void) {
     //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_PR, &tft_style_lable_pre);
     //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_REL, &tft_style_lable_rel);
     #if HAS_SUICIDE
-      lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_Mamual.bin", 0);
+      lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_manual_off.bin", 0);
     #else
-      lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_Motor_off.bin", 0);
+      lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_manual_off.bin", 0);
     #endif
     lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, &bmp_pic);
     lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, &bmp_pic);
     lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_PR, &tft_style_lable_pre);
     lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_REL, &tft_style_lable_rel);
 
-    lv_obj_set_event_cb_mks(buttonLanguage, event_handler, ID_S_LANGUAGE, "bmp_Language.bin", 0);
-    lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_REL, &bmp_pic);
-    lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_PR, &bmp_pic);
-    lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_PR, &tft_style_lable_pre);
-    lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_REL, &tft_style_lable_rel);
+    #if HAS_LANG_SELECT_SCREEN
+      lv_obj_set_event_cb_mks(buttonLanguage, event_handler, ID_S_LANGUAGE, "bmp_Language.bin", 0);
+      lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_REL, &bmp_pic);
+      lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_PR, &bmp_pic);
+      lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_PR, &tft_style_lable_pre);
+      lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_REL, &tft_style_lable_rel);
+    #endif
 
     lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_S_RETURN, "bmp_Return.bin", 0);
     lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
@@ -205,7 +213,9 @@ void lv_draw_set(void) {
   lv_obj_set_pos(buttonAbout, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight);
   //lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight);
   lv_obj_set_pos(buMotorOff, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
-  lv_obj_set_pos(buttonLanguage, INTERVAL_V, titleHeight);
+  #if HAS_LANG_SELECT_SCREEN
+    lv_obj_set_pos(buttonLanguage, INTERVAL_V, titleHeight);
+  #endif
   lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4,  BTN_Y_PIXEL + INTERVAL_H + titleHeight);
 
   /*Create a label on the Image button*/
@@ -214,7 +224,9 @@ void lv_draw_set(void) {
   lv_btn_set_layout(buttonAbout, LV_LAYOUT_OFF);
   //lv_btn_set_layout(buttonContinue, LV_LAYOUT_OFF);
   lv_btn_set_layout(buMotorOff, LV_LAYOUT_OFF);
-  lv_btn_set_layout(buttonLanguage, LV_LAYOUT_OFF);
+  #if HAS_LANG_SELECT_SCREEN
+    lv_btn_set_layout(buttonLanguage, LV_LAYOUT_OFF);
+  #endif
   lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
 
   //lv_obj_t * labelWifi= lv_label_create(buttonWifi, NULL);
@@ -222,7 +234,9 @@ void lv_draw_set(void) {
   lv_obj_t * label_About = lv_label_create(buttonAbout, NULL);
   //lv_obj_t * label_Continue = lv_label_create(buttonContinue, NULL);
   lv_obj_t * label_MotorOff = lv_label_create(buMotorOff, NULL);
-  lv_obj_t * label_Language = lv_label_create(buttonLanguage, NULL);
+  #if HAS_LANG_SELECT_SCREEN
+    lv_obj_t * label_Language = lv_label_create(buttonLanguage, NULL);
+  #endif
   lv_obj_t * label_Back = lv_label_create(buttonBack, NULL);
 
 
@@ -245,8 +259,10 @@ void lv_draw_set(void) {
     #endif
     lv_obj_align(label_MotorOff, buMotorOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
 
-    lv_label_set_text(label_Language, set_menu.language);
-    lv_obj_align(label_Language, buttonLanguage, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+    #if HAS_LANG_SELECT_SCREEN
+      lv_label_set_text(label_Language, set_menu.language);
+      lv_obj_align(label_Language, buttonLanguage, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+    #endif
 
     lv_label_set_text(label_Back, common_menu.text_back);
     lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
@@ -255,4 +271,4 @@ void lv_draw_set(void) {
 
 void lv_clear_set() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp
index dc87ec5717..d980d4c08d 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "lv_conf.h"
 #include "draw_ui.h"
@@ -267,4 +267,4 @@ void lv_draw_tool(void) {
 
 void lv_clear_tool() { lv_obj_del(scr); }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp
index c8df85203e..52e83204e9 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp
@@ -21,11 +21,10 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "W25Qxx.h"
 #include "tft_lvgl_configuration.h"
-#include "pic_manager.h"
 
 #include <SPI.h>
 
@@ -38,6 +37,8 @@
 #include "../../../../module/motion.h"
 #include "../../../../module/planner.h"
 
+#include "pic_manager.h"
+
 #if ENABLED(POWER_LOSS_RECOVERY)
   #include "../../../../feature/powerloss.h"
 #endif
@@ -73,7 +74,33 @@ extern void LCD_IO_WriteData(uint16_t RegValue);
 
 void gCfgItems_init() {
   gCfgItems.multiple_language = MULTI_LANGUAGE_ENABLE;
-  gCfgItems.language = LANG_ENGLISH;
+  #if 1 //LCD_LANGUAGE == en
+    gCfgItems.language = LANG_ENGLISH;
+  #elif LCD_LANGUAGE == zh_CN
+    gCfgItems.language = LANG_SIMPLE_CHINESE;
+  #elif LCD_LANGUAGE == zh_TW
+    gCfgItems.language = LANG_COMPLEX_CHINESE;
+  #elif LCD_LANGUAGE == jp_kana
+    gCfgItems.language = LANG_JAPAN;
+  #elif LCD_LANGUAGE == de
+    gCfgItems.language = LANG_GERMAN;
+  #elif LCD_LANGUAGE == fr
+    gCfgItems.language = LANG_FRENCH;
+  #elif LCD_LANGUAGE == ru
+    gCfgItems.language = LANG_RUSSIAN;
+  #elif LCD_LANGUAGE == ko_KR
+    gCfgItems.language = LANG_KOREAN;
+  #elif LCD_LANGUAGE == tr
+    gCfgItems.language = LANG_TURKISH;
+  #elif LCD_LANGUAGE == es
+    gCfgItems.language = LANG_SPANISH;
+  #elif LCD_LANGUAGE == el
+    gCfgItems.language = LANG_GREEK;
+  #elif LCD_LANGUAGE == it
+    gCfgItems.language = LANG_ITALY;
+  #elif LCD_LANGUAGE == pt
+    gCfgItems.language = LANG_PORTUGUESE;
+  #endif
   gCfgItems.leveling_mode = 0;
   gCfgItems.from_flash_pic = 0;
   gCfgItems.curFilesize = 0;
@@ -139,8 +166,13 @@ void tft_style_init() {
   tft_style_lable_rel.body.grad_color = LV_COLOR_BACKGROUND;
   tft_style_lable_rel.text.color = LV_COLOR_TEXT;
   tft_style_lable_rel.text.sel_color = LV_COLOR_TEXT;
-  tft_style_lable_pre.text.font = &gb2312_puhui32;
-  tft_style_lable_rel.text.font = &gb2312_puhui32;
+  #if HAS_SPI_FLASH_FONT
+    tft_style_lable_pre.text.font = &gb2312_puhui32;
+    tft_style_lable_rel.text.font = &gb2312_puhui32;
+  #else
+    tft_style_lable_pre.text.font = LV_FONT_DEFAULT;
+    tft_style_lable_rel.text.font = LV_FONT_DEFAULT;
+  #endif
   tft_style_lable_pre.line.width = 0;
   tft_style_lable_rel.line.width = 0;
   tft_style_lable_pre.text.letter_space = 0;
@@ -325,6 +357,9 @@ char *creat_title_text() {
   return public_buf_m;
 }
 
+#if HAS_GCODE_PREVIEW
+uint32_t gPicturePreviewStart = 0;
+
 void preview_gcode_prehandle(char *path) {
   #if ENABLED(SDSUPPORT)
     //uint8_t re;
@@ -333,6 +368,7 @@ void preview_gcode_prehandle(char *path) {
     uint32_t *p1;
     char *cur_name;
 
+    gPicturePreviewStart = 0;
     cur_name = strrchr(path, '/');
     card.openFileRead(cur_name);
     card.read(public_buf, 512);
@@ -369,7 +405,24 @@ void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) {
     cur_name = strrchr(path, '/');
     card.openFileRead(cur_name);
 
-    card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8);
+    if (gPicturePreviewStart <= 0) {
+      while (1) {
+        uint32_t br = card.read(public_buf, 400);
+        uint32_t* p1 = (uint32_t *)strstr((char *)public_buf, ";gimage:");
+        if (p1) {
+          gPicturePreviewStart += (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0]));
+          break;
+        }
+        else {
+          gPicturePreviewStart += br;
+        }
+        if (br < 400) break;
+      }
+    }
+
+    // SERIAL_ECHOLNPAIR("gPicturePreviewStart: ", gPicturePreviewStart, " PREVIEW_LITTLE_PIC_SIZE: ", PREVIEW_LITTLE_PIC_SIZE);
+
+    card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8);
     #if ENABLED(SPI_GRAPHICAL_TFT)
       SPI_TFT.spi_init(SPI_FULL_SPEED);
       //SPI_TFT.SetCursor(0,0);
@@ -417,14 +470,16 @@ void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) {
     #else
       for (i = 0; i < 400;) {
         p_index = (uint16_t *)(&bmp_public_buf[i]);
-        //if (*p_index == 0x0000)*p_index=gCfgItems.preview_bk_color;
+        if (*p_index == 0x0000)*p_index=LV_COLOR_BACKGROUND.full; //gCfgItems.preview_bk_color;
         LCD_IO_WriteData(*p_index);
         i += 2;
       }
     #endif
-    W25QXX.init(SPI_QUARTER_SPEED);
-    if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096);
-    W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400);
+    #if HAS_BAK_VIEW_IN_FLASH
+      W25QXX.init(SPI_QUARTER_SPEED);
+      if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096);
+      W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400);
+    #endif
     row++;
     if (row >= 200) {
       size = 809;
@@ -489,15 +544,19 @@ void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) {
   int x_off = 0, y_off = 0;
   int _y;
   uint16_t *p_index;
-  int i, j;
-  uint16_t temp_p, Color;
+  int i;
+  uint16_t temp_p;
 
   for (index = 0; index < 10; index++) { // 200*200
-    if (sel == 1) flash_view_Read(bmp_public_buf, 8000); //20k
-    //memset(bmp_public_buf,0x1f,8000);
-    else
+    #if HAS_BAK_VIEW_IN_FLASH
+      if (sel == 1) flash_view_Read(bmp_public_buf, 8000); //20k
       //memset(bmp_public_buf,0x1f,8000);
-      default_view_Read(bmp_public_buf, 8000); //20k
+      else
+        //memset(bmp_public_buf,0x1f,8000);
+        default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); //20k
+    #else
+      default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); //20k
+    #endif
 
     i = 0;
     #if ENABLED(SPI_GRAPHICAL_TFT)
@@ -534,6 +593,7 @@ void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) {
           else {
             p_index = (uint16_t *)(&bmp_public_buf[i]);
           }
+          if (*p_index == 0x0000)*p_index=LV_COLOR_BACKGROUND.full; //gCfgItems.preview_bk_color;
           LCD_IO_WriteData(*p_index);
           i += 2;
         }
@@ -547,15 +607,20 @@ void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) {
 
 void disp_pre_gcode(int xpos_pixel, int ypos_pixel) {
   if (gcode_preview_over == 1) gcode_preview(list_file.file_name[sel_id], xpos_pixel, ypos_pixel);
-  if (flash_preview_begin == 1) {
-    flash_preview_begin = 0;
-    Draw_default_preview(xpos_pixel, ypos_pixel, 1);
-  }
-  if (default_preview_flg == 1) {
-    Draw_default_preview(xpos_pixel, ypos_pixel, 0);
-    default_preview_flg = 0;
-  }
+  #if HAS_BAK_VIEW_IN_FLASH
+    if (flash_preview_begin == 1) {
+      flash_preview_begin = 0;
+      Draw_default_preview(xpos_pixel, ypos_pixel, 1);
+    }
+  #endif
+  #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH
+    if (default_preview_flg == 1) {
+      Draw_default_preview(xpos_pixel, ypos_pixel, 0);
+      default_preview_flg = 0;
+    }
+  #endif
 }
+#endif
 
 void print_time_run() {
   static uint8_t lastSec = 0;
@@ -1175,9 +1240,11 @@ void LV_TASK_HANDLER() {
   //lv_tick_inc(1);
   lv_task_handler();
   TERN_(MKS_TEST, mks_test());
-  disp_pre_gcode(2, 36);
+  #if HAS_GCODE_PREVIEW
+    disp_pre_gcode(2, 36);
+  #endif
   GUI_RefreshPage();
   //sd_detection();
 }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h
index 796c94ab2d..924c131018 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h
@@ -28,6 +28,11 @@ extern "C" { /* C-declarations for C++ */
 #include <stdint.h>
 #include <string.h>
 #include "lvgl.h"
+
+//the colors of the last MKS Ui
+#undef LV_COLOR_BACKGROUND
+#define LV_COLOR_BACKGROUND LV_COLOR_MAKE(0x1A, 0x1A, 0x1A) //LV_COLOR_MAKE(0x00, 0x00, 0x00)
+
 #include "tft_multi_language.h"
 #include "draw_ready_print.h"
 #include "draw_language.h"
@@ -214,7 +219,9 @@ extern void tft_style_init();
 extern char *creat_title_text(void);
 extern void preview_gcode_prehandle(char *path);
 extern void update_spi_flash();
-extern void disp_pre_gcode(int xpos_pixel, int ypos_pixel);
+#if HAS_GCODE_PREVIEW
+  extern void disp_pre_gcode(int xpos_pixel, int ypos_pixel);
+#endif
 extern void GUI_RefreshPage();
 extern void clear_cur_ui();
 extern void draw_return_ui();
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp
index 39fb836b60..312229a16c 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp
@@ -21,12 +21,14 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "../../../../MarlinCore.h"
 #include "lvgl.h"
 #include "pic_manager.h"
 
+#if HAS_SPI_FLASH_FONT
+
 typedef struct {
   uint16_t min;
   uint16_t max;
@@ -108,4 +110,6 @@ void init_gb2312_font() {
   gb2312_puhui32.base_line = 0;
 }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // HAS_SPI_FLASH_FONT
+
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp
index 08ce13c8aa..913b67ab25 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp
@@ -21,19 +21,20 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "tft_lvgl_configuration.h"
 #include "lvgl.h"
 #include "draw_ready_print.h"
 #include "W25Qxx.h"
-#include "pic_manager.h"
 #include "mks_hardware_test.h"
 
 #include "../../../../MarlinCore.h"
 #include "../../../../module/temperature.h"
 #include "../../../../feature/touch/xpt2046.h"
 
+#include "pic_manager.h"
+
 #if ENABLED(MKS_TEST)
 
   extern uint8_t curent_disp_ui;
@@ -591,4 +592,4 @@ void disp_font_update() {
   disp_string(120, 150, "FONT Updating...", 0xFFFF, 0x0000);
 }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp
index 85049ed3a1..4e9eee8929 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp
@@ -21,11 +21,10 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "../../../../MarlinCore.h"
 
-//#include "type_define.h"
 #include "string.h"
 
 #include "pic_manager.h"
@@ -34,10 +33,6 @@
 #include "draw_ready_print.h"
 #include "mks_hardware_test.h"
 
-//#include "gui.h"
-//#include "spi_flash.h"
-
-//uint8_t DMA_ERRO_FLAG;
 extern uint16_t DeviceCode;
 extern unsigned char bmp_public_buf[17 * 1024];
 
@@ -45,7 +40,158 @@ extern unsigned char bmp_public_buf[17 * 1024];
   extern char *createFilename(char * const buffer, const dir_t &p);
 #endif
 
-/*void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) {}*/
+static char assets[][30] = {
+  //homing screen
+  "bmp_Zero.bin",
+  "bmp_zeroX.bin",
+  "bmp_zeroY.bin",
+  "bmp_zeroZ.bin",
+  "bmp_manual_off.bin",
+
+  //tool screen
+  "bmp_PreHeat.bin",
+  "bmp_Extruct.bin",
+  "bmp_Mov.bin",
+  // "bmp_Zero.bin",
+  "bmp_Leveling.bin",
+
+  //fan screen
+  "bmp_Add.bin",
+  "bmp_Dec.bin",
+  "bmp_Speed255.bin",
+  "bmp_Speed127.bin",
+  "bmp_Speed0.bin",
+
+  //preheat screen
+  // "bmp_Add.bin",
+  // "bmp_Dec.bin",
+  "bmp_Speed0.bin",
+  // "bmp_Extru2.bin",
+  // "bmp_Extru1.bin",
+  "bmp_Bed.bin",
+  "bmp_Step1_degree.bin",
+  "bmp_Step5_degree.bin",
+  "bmp_Step10_degree.bin",
+
+  //extrusion screen
+  "bmp_In.bin",
+  "bmp_Out.bin",
+  "bmp_Extru1.bin",
+  #if EXTRUDERS > 1
+    "bmp_Extru2.bin",
+  #endif
+  "bmp_Speed_high.bin",
+  "bmp_Speed_slow.bin",
+  "bmp_Speed_normal.bin",
+  "bmp_Step1_mm.bin",
+  "bmp_Step5_mm.bin",
+  "bmp_Step10_mm.bin",
+
+  //select file screen
+  "bmp_pageUp.bin",
+  "bmp_pageDown.bin",
+  //"bmp_Back.bin", //TODO: why two back buttons? Why not just one? (return / back)
+  "bmp_Dir.bin",
+  "bmp_File.bin",
+
+  //move motor screen
+  //TODO: 6 equal icons, just in diffenct rotation... it may be optimized too
+  "bmp_xAdd.bin",
+  "bmp_xDec.bin",
+  "bmp_yAdd.bin",
+  "bmp_yDec.bin",
+  "bmp_zAdd.bin",
+  "bmp_zDec.bin",
+  "bmp_Step_move0_1.bin",
+  "bmp_Step_move1.bin",
+  "bmp_Step_move10.bin",
+
+  //operation screen
+  "bmp_auto_off.bin",
+  "bmp_Speed.bin",
+  //"bmp_Mamual.bin", //TODO: didn't find it.. changed to bmp_manual_off.bin
+  "bmp_Fan.bin",
+  //"bmp_PreHeat.bin",
+  //"bmp_Extruct.bin",
+  // "bmp_Mov.bin",
+
+  //change speed screen
+  "bmp_Step1_percent.bin",
+  "bmp_Step5_percent.bin",
+  "bmp_Step10_percent.bin",
+  "bmp_extruct_sel.bin",
+  "bmp_mov_changespeed.bin",
+  // "bmp_extrude_opr.bin", equal to "bmp_Extruct.bin"
+  "bmp_mov_sel.bin",
+
+  //printing screen
+  "bmp_Pause.bin",
+  "bmp_Resume.bin",
+  "bmp_Stop.bin",
+  "bmp_Ext1_state.bin",
+  #if EXTRUDERS > 1
+    "bmp_Ext2_state.bin",
+  #endif
+  "bmp_Bed_state.bin",
+  "bmp_Fan_state.bin",
+  "bmp_Time_state.bin",
+  "bmp_Zpos_state.bin",
+  "bmp_Operate.bin",
+
+  //manual leval screen (only if disabled auto level)
+  #if DISABLED(AUTO_BED_LEVELING_BILINEAR)
+    "bmp_Leveling1.bin",
+    "bmp_Leveling2.bin",
+    "bmp_Leveling3.bin",
+    "bmp_Leveling4.bin",
+    "bmp_Leveling5.bin",
+  #endif
+
+  //lang select screen
+  #if HAS_LANG_SELECT_SCREEN
+    "bmp_Language.bin",
+    "bmp_simplified_cn.bin",
+    "bmp_simplified_cn_sel.bin",
+    "bmp_traditional_cn.bin",
+    "bmp_traditional_cn_sel.bin",
+    "bmp_English.bin",
+    "bmp_English_sel.bin",
+    "bmp_Russian.bin",
+    "bmp_Russian_sel.bin",
+    "bmp_Spanish.bin",
+    "bmp_Spanish_sel.bin",
+    "bmp_French.bin",
+    "bmp_French_sel.bin",
+    "bmp_Italy.bin",
+    "bmp_Italy_sel.bin",
+  #endif //HAS_LANG_SELECT_SCREEN
+
+  //gcode preview
+  #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH
+    "bmp_preview.bin",
+  #endif
+
+  //settings screen
+  "bmp_About.bin",
+  //"bmp_Language.bin",
+  //"bmp_Fan.bin",
+  //"bmp_manual_off.bin",
+
+  //start screen
+  "bmp_printing.bin",
+  "bmp_Set.bin",
+  "bmp_Tool.bin",
+
+  //base icons
+  "bmp_Return.bin"
+};
+
+#if HAS_SPI_FLASH_FONT
+  static char fonts[][50] = {
+    "GBK16.bin",
+    "UNIGBK.bin",
+  };
+#endif
 
 uint32_t lv_get_pic_addr(uint8_t *Pname) {
   uint8_t Pic_cnt;
@@ -54,21 +200,22 @@ uint32_t lv_get_pic_addr(uint8_t *Pname) {
   uint32_t tmp_cnt = 0;
   uint32_t addr = 0;
 
+  #if ENABLED(MARLIN_DEV_MODE)
+    SERIAL_ECHOLNPAIR("Getting picture SPI Flash Address: ", (const char*)Pname);
+  #endif
+
   W25QXX.init(SPI_QUARTER_SPEED);
 
   W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1);
-  if (Pic_cnt == 0xff)
-    Pic_cnt = 0;
+  if (Pic_cnt == 0xFF) Pic_cnt = 0;
   for (i = 0; i < Pic_cnt; i++) {
     j = 0;
-    do
-    {
+    do {
       W25QXX.SPI_FLASH_BufferRead(&PIC.name[j], PIC_NAME_ADDR + tmp_cnt, 1);
       tmp_cnt++;
-    }while (PIC.name[j++] != '\0');
-
-    if ((strcmp((char*)Pname, (char*)PIC.name)) == 0) {
+    } while (PIC.name[j++] != '\0');
 
+    if ((strcasecmp((char*)Pname, (char*)PIC.name)) == 0) {
       if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761))
         addr = PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35;
       else
@@ -86,111 +233,40 @@ const char *bakPath = "bak_pic";
 const char *fontPath = "mks_font";
 const char *bakFont = "bak_font";
 
-#if 1
-
 void spiFlashErase_PIC() {
-  #if 1
-    volatile uint32_t pic_sectorcnt = 0;
-
-    //LCD_Clear(BACK_COLOR);
-    //LCD_DisplayString(90,80,"SPI Flash");
-    //LCD_DisplayString(120,90,"PIC Erasing...");
-    if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) {
-      //LCD_ShowString(180,100,200,24,24,"SPI Flash");
-      //LCD_ShowString(170,130,200,24,24,"PIC Erasing...");
-    }
-    else {
-      //LCD_ShowString(100,90,200,24,24,"SPI Flash");
-      //LCD_ShowString(100,120,200,24,24,"PIC Erasing...");
-    }
-    #if ENABLED(MKS_TEST)
-      for (pic_sectorcnt = 0; pic_sectorcnt < 2; pic_sectorcnt++)
-        W25QXX.SPI_FLASH_BlockErase(PICINFOADDR + pic_sectorcnt * 64 * 1024);
-
-    #else
-      for (pic_sectorcnt = 0; pic_sectorcnt < PIC_SIZE_xM * 1024 / 64; pic_sectorcnt++)
-        W25QXX.SPI_FLASH_BlockErase(PICINFOADDR + pic_sectorcnt * 64 * 1024);
-
-    #endif
-    /*
-    FLASH_Unlock();
-    spiFlashEraseFlag = SPI_FLASH_ERASE_FLAG_DATA;
-    FLASH_ProgramHalfWord(SPI_FLASH_ERASE_FLAG_ADDR,spiFlashEraseFlag);
-    FLASH_Lock();
-    */
-    #if 0
-      if (DeviceCode == 0x9488)
-        LCD_ShowString(170, 130, 200, 24, 24, "PIC Erase Done");
-      else
-        LCD_ShowString(100, 120, 200, 24, 24, "PIC Erase Done");
-
-    #endif
-    //spiFlashEraseFlag = 1;
-  #endif
+  volatile uint32_t pic_sectorcnt = 0;
+  for (pic_sectorcnt = 0; pic_sectorcnt < TERN(MKS_TEST, 2, PIC_SIZE_xM * 1024 / 64); pic_sectorcnt++)
+    W25QXX.SPI_FLASH_BlockErase(PICINFOADDR + pic_sectorcnt * 64 * 1024);
 }
 
-void spiFlashErase_FONT() {
-  volatile uint32_t Font_sectorcnt = 0;
-
-  //LCD_Clear(BACK_COLOR);
-  if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) {
-    //LCD_ShowString(180,100,200,24,24,"SPI Flash");
-    //LCD_ShowString(170,130,200,24,24,"FONT Erasing...");
+#if HAS_SPI_FLASH_FONT
+  void spiFlashErase_FONT() {
+    volatile uint32_t Font_sectorcnt = 0;
+    for (Font_sectorcnt = 0; Font_sectorcnt < FONT_SIZE_xM * 1024 / 64; Font_sectorcnt++)
+      W25QXX.SPI_FLASH_BlockErase(FONTINFOADDR + Font_sectorcnt * 64 * 1024);
   }
-  else {
-    //LCD_ShowString(100,90,200,24,24,"SPI Flash");
-    //LCD_ShowString(90,120,200,24,24,"FONT Erasing...");
-  }
-
-  for (Font_sectorcnt = 0; Font_sectorcnt < FONT_SIZE_xM * 1024 / 64; Font_sectorcnt++)
-    W25QXX.SPI_FLASH_BlockErase(FONTINFOADDR + Font_sectorcnt * 64 * 1024);
-
-  /*
-  FLASH_Unlock();
-  spiFlashEraseFlag = SPI_FLASH_ERASE_FLAG_DATA;
-  FLASH_ProgramHalfWord(SPI_FLASH_ERASE_FLAG_ADDR,spiFlashEraseFlag);
-  FLASH_Lock();
-  */
-  #if 0
-    if (DeviceCode == 0x9488)
-      LCD_ShowString(170, 130, 200, 24, 24, "FONT Erase Done");
-    else
-      LCD_ShowString(90, 120, 200, 24, 24, "FONT Erase Done");
-    //LCD_DisplayString(120,90,"FONT Erase Done");
-  #endif
-  //spiFlashEraseFlag = 1;
-}
+#endif
 
 uint32_t LogoWrite_Addroffset = 0;
 
 uint8_t Pic_Logo_Write(uint8_t *LogoName, uint8_t *Logo_Wbuff, uint32_t LogoWriteSize) {
-  //uint16_t n;
-  uint32_t i;
-  uint8_t temp1;
-  static uint32_t logo_maxsize;
-
   if (LogoWriteSize <= 0) return 0;
 
   W25QXX.SPI_FLASH_BufferWrite(Logo_Wbuff, PIC_LOGO_ADDR + LogoWrite_Addroffset, LogoWriteSize);
 
-  for (i = 0; i < LogoWriteSize; i++) {
+  for (uint32_t i = 0; i < LogoWriteSize; i++) {
+    uint8_t temp1;
     W25QXX.SPI_FLASH_BufferRead(&temp1, PIC_LOGO_ADDR + LogoWrite_Addroffset + i, 1);
     if (*(Logo_Wbuff + i) != temp1) return 0;
   }
   LogoWrite_Addroffset += LogoWriteSize;
-  if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761))
-    logo_maxsize = LOGO_MAX_SIZE_TFT35;
-  else
-    logo_maxsize = LOGO_MAX_SIZE_TFT32;
-  if (LogoWrite_Addroffset >= logo_maxsize)
-    LogoWrite_Addroffset = 0;
+  const uint32_t logo_maxsize = DeviceCode == 0x9488 || DeviceCode == 0x5761 ? LOGO_MAX_SIZE_TFT35 : LOGO_MAX_SIZE_TFT32;
+  if (LogoWrite_Addroffset >= logo_maxsize) LogoWrite_Addroffset = 0;
   return 1;
 }
 
 uint32_t TitleLogoWrite_Addroffset = 0;
 uint8_t Pic_TitleLogo_Write(uint8_t *TitleLogoName, uint8_t *TitleLogo_Wbuff, uint32_t TitleLogoWriteSize) {
-  //uint32_t i;
-  //uint8_t temp1;
   if (TitleLogoWriteSize <= 0)
     return 0;
   if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761))
@@ -216,18 +292,11 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) {
   uint32_t Pic_SaveAddr;
   uint32_t Pic_SizeSaveAddr;
   uint32_t Pic_NameSaveAddr;
-  //uint8_t temp;
   uint8_t Pname_temp;
   uint32_t i, j;
   uint32_t name_len = 0;
   uint32_t SaveName_len = 0;
   union union32 size_tmp;
-  //union union32 size1;
-  //uint8_t Pn[PIC_NAME_MAX_LEN];
-  //uint8_t cnt_temp;
-  //uint16_t n0;
-  //uint32_t Name_saveAddr = 0;
-  //uint8_t pic_position;
 
   W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1);
 
@@ -266,386 +335,182 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) {
 
 uint8_t public_buf[512];
 
-//uint8_t public_buf_test[512];
-  #if ENABLED(SDSUPPORT)
-void UpdatePic() {
-  //int r;
-  //unsigned char *p;
-  //char rootPath[10]={0};
-  char *fn;
-  unsigned char logoFlag;
-  uint16_t pbr;
-  uint32_t pfileSize;
-  uint32_t Pic_Write_Addr;
-  /*----------------------------------*/
-
-  // FILINFO fno;
-  //DIR dir;
-  //char tmp[30];
-  #if 0//_USE_LFN
-    static char lfn[_MAX_LFN + 1];
-    finfo.lfname = lfn;
-    finfo.lfsize = sizeof(lfn);
-  #endif
-  //SdFile curDir;
-  //if (f_opendir(&dirs, picPath) == FR_OK)
-  //card.cd(picPath);
-
-  //const uint16_t fileCnt = card.get_num_Files();
-
-  //SdFile *curDir;
-  //SdFile dir;
-  //dir.open(picPath, O_READ);
-  //const char * const fname = card.diveToFile(true, curDir, picPath);
-  //if (!fname) return;
-
-  SdFile dir, root = card.getroot();
-  if (dir.open(&root, picPath, O_RDONLY)) {
-
-    disp_pic_update();
-    spiFlashErase_PIC();
-
-    dir_t d;
-    while (dir.readDir(&d, card.longFilename) > 0) {
-      #if 1
-        /*
-        if (power_det == 0) {
-          PW_DET_ON;
-          power_det=0;
-        }
-        SPI_FLASH_Init();
-        */
+#if ENABLED(SDSUPPORT)
 
-        //for (uint16_t i = 0; i < fileCnt; i++) {
-        //res = f_readdir(&dirs, &finfo);
-        //card.getfilename_sorted(i);
+  static void dosName2LongName(const char dosName[11], char* longName) {
+    uint8_t j = 0;
+    LOOP_L_N(i, 11) {
+      if (i == 8) longName[j++] = '.';
+      if (dosName[i] == '\0' || dosName[i] == ' ') continue;
+      longName[j++] = dosName[i];
+    }
+    longName[j] = '\0';
+  }
+
+  void UpdatePic() {
+    char *fn;
+    unsigned char logoFlag;
+    uint16_t pbr;
+    uint32_t pfileSize;
+    uint32_t totalSizeLoaded = 0;
+    uint32_t Pic_Write_Addr;
+
+    SdFile dir, root = card.getroot();
+    if (dir.open(&root, picPath, O_RDONLY)) {
+
+      disp_pic_update();
+      spiFlashErase_PIC();
+
+      dir_t d;
+      while (dir.readDir(&d, card.longFilename) > 0) {
+        // if we dont get a long name, but gets a short one, try it
+        if (card.longFilename[0] == 0 && d.name[0] != 0) {
+          dosName2LongName((const char*)d.name, card.longFilename);
+        }
 
         if (card.longFilename[0] == 0)
-          break;
-        /*if ( card.filename[0] == '.')
-        continue;
-      */
+          continue;
         if (card.longFilename[0] == '.')
           continue;
 
-        fn = card.longFilename;
+        uint8_t a = -1;
+        for(a = 0; a < COUNT(assets); a++) {
+          if (strcasecmp(assets[a], card.longFilename) == 0) {
+            break;
+          }
+        }
+        if (a < 0 || a >= COUNT(assets)) continue;
 
-        /*if ((finfo.lfname[0] == 0) || (finfo.lfname == 0))
-          fn = finfo.fname;
-        else
-          fn = finfo.lfname;*/
+        fn = assets[a];
+        char dosFilename[FILENAME_LENGTH];
+        createFilename(dosFilename, d);
 
-        /*   if (fno.fattrib & AM_DIR)
-        {
+        SdFile file;
+        if (!file.open(&dir, dosFilename, O_READ)) {
+          #if ENABLED(MARLIN_DEV_MODE)
+            SERIAL_ECHOLNPAIR("Error opening Asset: ", fn);
+          #endif
           continue;
         }
-        else */
-        //{
-        //if ((strstr(fn, ".gco")) || (strstr(fn, ".GCO")) || (fno.fattrib & AM_DIR))
-        if (strstr(fn, ".bin")) {
-          if (strstr(fn, "_logo"))
-            logoFlag = 1;
-          else if (strstr(fn, "_titlelogo"))
-            logoFlag = 2;
-          else if (strstr(fn, "_preview"))
-            logoFlag = 3;
-          else
-            logoFlag = 0;
-
-          //public_buf[0] = '\0';
-          //strcat(public_buf, picPath);
-          //strcat(public_buf, "/");
-          char dosFilename[FILENAME_LENGTH];
-          createFilename(dosFilename, d);
-          //strcat(public_buf, dosFilename);
-
-          SdFile file;
-          if (file.open(&dir, dosFilename, O_READ)) {
-            #if 1
-            /*LCD_Clear(BACK_COLOR);
-
-            if ((DeviceCode==0x9488)||(DeviceCode==0x5761)) {
-              LCD_ShowString(170,100,200,24,24,(u8 *)fn);
-              LCD_ShowString(180,130,200,24,24,"Updating...");
-            }
-            else {
-              LCD_ShowString(90,90,200,24,24,(u8 *)fn);
-              LCD_ShowString(90,120,200,24,24,"Updating...");
-            }
-            */
-            if (logoFlag == 1) {
-              while (1) {
-                pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
-                Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); //
-                if (pbr < BMP_WRITE_BUF_LEN) break;
-              }
-            }
-            else if (logoFlag == 2) {
-              while (1) {
-                pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
-                Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); //
-                if (pbr < BMP_WRITE_BUF_LEN) break;
-              }
-            }
-            else if (logoFlag == 3) {
-              while (1)
-              {
-                pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
-                default_view_Write(public_buf, pbr); //
-                if (pbr < BMP_WRITE_BUF_LEN) break;
-              }
-            }
-            else {
-              pfileSize = file.fileSize();
-              Pic_Write_Addr = Pic_Info_Write((uint8_t *)fn, pfileSize);
-              //uint32_t addr_test = Pic_Write_Addr;
-              //memset(bmp_public_buf, 0xff, BMP_WRITE_BUF_LEN);
-              while (1)
-              {
-                pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
-                W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr);
-                Pic_Write_Addr += pbr;
-                if (pbr < BMP_WRITE_BUF_LEN) break;
-              }
-              //W25QXX.SPI_FLASH_BufferRead(public_buf_test,addr_test,BMP_WRITE_BUF_LEN);
-            }
 
-            /*--------------read test--------------------*/
-            /*
-            BufferSet(picBuffer, 0xff, PICTURE_MAX_SIZE);
-            if (logoFlag == 0)
-            {
-              PicMsg_Init();
-              Pic_Read(fn,picBuffer);
-            }
-            else
-              Pic_Logo_Read(fn,picBuffer,PICTURE_MAX_SIZE);
-            */
-            /*--------------read test--------------------*/
-
-            file.close();
-            #endif
+        if (strstr(fn, "_logo"))
+          logoFlag = 1;
+        else if (strstr(fn, "_titlelogo"))
+          logoFlag = 2;
+        else if (strstr(fn, "_preview"))
+          logoFlag = 3;
+        else
+          logoFlag = 0;
+
+        pfileSize = file.fileSize();
+        totalSizeLoaded += pfileSize;
+        if (logoFlag == 1) {
+          while (1) {
+            pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
+            Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); //
+            if (pbr < BMP_WRITE_BUF_LEN)
+              break;
           }
-
         }
-        //}
-        //}
-        /*
-            LCD_Clear(LCD_COLOR_BLACK);
-            //LCD_ShowString(110,100,200,24,24,"Complete");
-            LCD_DisplayString(110,80,"Complete");
-            delay(0xfffff);
-        */
-        //r = f_chdir("/");
-        #if 1
-          //SdFile dir, root = card.getroot();
-          /*if (dir.open(&root, bakPath, O_RDONLY))
-      {
-        dir.remove();
-      }*/
-
-          //r = f_rename(picPath, bakPath);
-
-
-          //update_flag_ok = 1;
+        else if (logoFlag == 2) {
+          while (1) {
+            pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
+            Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); //
+            if (pbr < BMP_WRITE_BUF_LEN)
+              break;
+          }
+        }
+        else if (logoFlag == 3) {
+          while (1) {
+            pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
+            default_view_Write(public_buf, pbr); //
+            if (pbr < BMP_WRITE_BUF_LEN)
+              break;
+          }
+        }
+        else {
+          Pic_Write_Addr = Pic_Info_Write((uint8_t *)fn, pfileSize);
+          while (1) {
+            pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
+            W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr);
+            Pic_Write_Addr += pbr;
+            if (pbr < BMP_WRITE_BUF_LEN)
+              break;
+          }
+        }
+
+        #if ENABLED(MARLIN_DEV_MODE)
+          SERIAL_ECHOLNPAIR("Asset added: ", fn);
         #endif
-      #endif
+
+        file.close();
+      }
+      dir.rename(&root, bakPath);
     }
-    dir.rename(&root, bakPath);
+    dir.close();
+
+    #if ENABLED(MARLIN_DEV_MODE)
+      uint8_t pic_counter = 0;
+      W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1);
+      SERIAL_ECHOLNPAIR("Total assets loaded: ", pic_counter, ", Total size: ", totalSizeLoaded);
+    #endif
   }
-}
 
+  #if HAS_SPI_FLASH_FONT
 
-void spi_flash_read_test() {W25QXX.SPI_FLASH_BufferRead(public_buf, UNIGBK_FLASH_ADDR, BMP_WRITE_BUF_LEN);}
-
-void UpdateFont() {
-  //int r;
-  //unsigned char *p;
-  //char rootPath[10]={0};
-  char *fn;
-  //unsigned char logoFlag;
-  uint16_t pbr;
-  uint32_t flashaddr = 0;
-  //uint32_t pfileSize;
-  //uint32_t Pic_Write_Addr;
-  /*----------------------------------*/
-
-  // FILINFO fno;
-  //DIR dir;
-  //char tmp[30];
-  #if 0//_USE_LFN
-    static char lfn[_MAX_LFN + 1];
-    finfo.lfname = lfn;
-    finfo.lfsize = sizeof(lfn);
-  #endif
-  //SdFile curDir;
-  //if (f_opendir(&dirs, picPath) == FR_OK)
-  //card.cd(picPath);
-
-  //const uint16_t fileCnt = card.get_num_Files();
-
-  //SdFile *curDir;
-  //SdFile dir;
-  //dir.open(picPath, O_READ);
-  //const char * const fname = card.diveToFile(true, curDir, picPath);
-  //if (!fname) return;
-
-  SdFile dir, root = card.getroot();
-  if (dir.open(&root, fontPath, O_RDONLY)) {
-
-    disp_font_update();
-    spiFlashErase_FONT();
-
-    dir_t d;
-    while (dir.readDir(&d, card.longFilename) > 0)
-    {
-      #if 1
-        /*if (power_det == 0)
-        {
-          PW_DET_ON;
-          power_det=0;
-        }
-        SPI_FLASH_Init();*/
+    void spi_flash_read_test() { W25QXX.SPI_FLASH_BufferRead(public_buf, UNIGBK_FLASH_ADDR, BMP_WRITE_BUF_LEN); }
 
+    void UpdateFont() {
+      char *fn;
+      uint16_t pbr;
+      uint32_t flashaddr = 0;
 
-        //for (uint16_t i = 0; i < fileCnt; i++)
-        //{
-        //res = f_readdir(&dirs, &finfo);
-        //card.getfilename_sorted(i);
+      SdFile dir, root = card.getroot();
+      if (dir.open(&root, fontPath, O_RDONLY)) {
 
-        if (card.longFilename[0] == 0)
-          break;
-        /*if ( card.filename[0] == '.')
-        continue;
-      */
-        if (card.longFilename[0] == '.')
-          continue;
+        disp_font_update();
+        spiFlashErase_FONT();
 
-        fn = card.longFilename;
+        dir_t d;
+        while (dir.readDir(&d, card.longFilename) > 0) {
+          if (card.longFilename[0] == 0)
+            break;
 
-        /*if ((finfo.lfname[0] == 0) || (finfo.lfname == 0))
-          fn = finfo.fname;
-        else
-          fn = finfo.lfname;*/
+          if (card.longFilename[0] == '.')
+            continue;
+
+          fn = card.longFilename;
+
+          if (strstr(fn, ".bin")) {
+            char dosFilename[FILENAME_LENGTH];
+            createFilename(dosFilename, d);
+            //strcat(public_buf, dosFilename);
+
+            SdFile file;
+            if (file.open(&dir, dosFilename, O_READ)) {
 
-        /*   if (fno.fattrib & AM_DIR)
-        {
-        continue;
-        }
-        else */
-        //{
-        //if ((strstr(fn, ".gco")) || (strstr(fn, ".GCO")) || (fno.fattrib & AM_DIR))
-        if (strstr(fn, ".bin")) {
-          char dosFilename[FILENAME_LENGTH];
-          createFilename(dosFilename, d);
-          //strcat(public_buf, dosFilename);
-
-          SdFile file;
-          if (file.open(&dir, dosFilename, O_READ)) {
-
-            #if 1
-              /*LCD_Clear(BACK_COLOR);
-
-              if ((DeviceCode==0x9488)||(DeviceCode==0x5761))
-              {
-                LCD_ShowString(170,100,200,24,24,(u8 *)fn);
-                LCD_ShowString(180,130,200,24,24,"Updating...");
-              }
-              else
-              {
-                LCD_ShowString(90,90,200,24,24,(u8 *)fn);
-                LCD_ShowString(90,120,200,24,24,"Updating...");
-              }
-              */
               flashaddr = UNIGBK_FLASH_ADDR;
               pbr = 0;
-              while (1)
-              {
+              while (1) {
                 flashaddr += pbr;
                 pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
                 W25QXX.SPI_FLASH_BufferWrite(public_buf, flashaddr, pbr);
-                //W25QXX.SPI_FLASH_BufferRead(public_buf_test,flashaddr,pbr);
-                /*if (UNIGBKFlag == 1)
-                {
-                  fontrate = (uint16_t)(((float)(flashaddr - UNIGBK_FLASH_ADDR)/(float)(psrc.fsize))*100);
-                }
-                else
-                {
-                  fontrate = (uint16_t)(((float)(flashaddr - GBK_FLASH_ADDR)/(float)(psrc.fsize))*100);
-                }
-
-                if (fontrate > 99) fontrate=99;
-
-                if (fontrate < 10)
-                {
-                  fontString[0] = fontrate%10 + 0x30;
-                  fontString[1] = '%';
-                  fontString[2] = '\0';
-                }
-                else
-                {
-                  fontString[0] = fontrate/10 + 0x30;
-                  fontString[1] = fontrate%10 + 0x30;
-                  fontString[2] = '%';
-                  fontString[3] = '\0';
-                }*/
-                //LCD_DisplayString(140,130,fontString);
-                if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) {
-                  //LCD_ShowString(200,160,200,24,24,fontString);
-                }
-                else {
-                  //LCD_ShowString(140,150,200,24,24,fontString);
-                }
                 if (pbr < BMP_WRITE_BUF_LEN) break;
               }
-              /*--------------read test--------------------*/
-              /*
-              BufferSet(picBuffer, 0xff, PICTURE_MAX_SIZE);
-              if (logoFlag == 0)
-              {
-                PicMsg_Init();
-                Pic_Read(fn,picBuffer);
-              }
-              else
-                Pic_Logo_Read(fn,picBuffer,PICTURE_MAX_SIZE);
-              */
-              /*--------------read test--------------------*/
-
               file.close();
-            #endif
-          }
+            }
 
+          }
         }
-        //}
-        //}
-        /*
-            LCD_Clear(LCD_COLOR_BLACK);
-            //LCD_ShowString(110,100,200,24,24,"Complete");
-            LCD_DisplayString(110,80,"Complete");
-            delay(0xfffff);
-        */
-        //r = f_chdir("/");
-        #if 1
-          //SdFile dir, root = card.getroot();
-          /*if (dir.open(&root, bakPath, O_RDONLY))
-      {
-        dir.remove();
-      }*/
-          dir.rename(&root, bakFont);
-          //r = f_rename(picPath, bakPath);
-
-
-          //update_flag_ok = 1;
-        #endif
-      #endif
+
+        dir.rename(&root, bakFont);
+        dir.close();
+      }
     }
-  }
-}
-  #endif // SDSUPPORT
 
-#endif
+  #endif // HAS_SPI_FLASH_FONT
 
-#if 1
+#endif // SDSUPPORT
 
 void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) {
   uint8_t i, j;
@@ -653,30 +518,21 @@ void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) {
   uint32_t tmp_cnt = 0;
   PIC_MSG PIC;
 
-  //void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead);
-
   W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1);
   if (Pic_cnt == 0xff)
     Pic_cnt = 0;
 
   for (i = 0; i < Pic_cnt; i++) {
-    //pic name
     j = 0;
-    do
-    {
+    do {
       W25QXX.SPI_FLASH_BufferRead(&PIC.name[j], PIC_NAME_ADDR + tmp_cnt, 1);
       tmp_cnt++;
-    }while (PIC.name[j++] != '\0');
+    } while (PIC.name[j++] != '\0');
     //pic size
     W25QXX.SPI_FLASH_BufferRead(PIC.size.bytes, PIC_SIZE_ADDR + i * 4, 4);
 
     if ((strcmp((char*)Pname, (char*)PIC.name)) == 0) {
       W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35, PIC.size.dwords);
-      /*if (DMA_ERRO_FLAG)
-      {
-        DMA_ERRO_FLAG = 0;
-        SPI_FLASH_BufferRead((uint8_t *)P_Rbuff,PIC_DATA_ADDR+i*PER_PIC_MAX_SPACE,PIC.size.dwords);
-      }*/
       break;
     }
   }
@@ -685,41 +541,34 @@ void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) {
 void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) {
   W25QXX.init(SPI_QUARTER_SPEED);
   W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size);
-  /*if (DMA_ERRO_FLAG) {
-    DMA_ERRO_FLAG = 0;
-    SPI_FLASH_BufferRead((uint8_t *)P_Rbuff,addr,size);
-  }*/
-
 }
 
-void get_spi_flash_data(const char *rec_buf, int addr, int size) {
-  W25QXX.init(SPI_QUARTER_SPEED);
-  W25QXX.SPI_FLASH_BufferRead((uint8_t *)rec_buf, UNIGBK_FLASH_ADDR + addr, size);
-}
-
-#endif
-
-#if 1
-
-  uint32_t logo_addroffset = 0;
-  void Pic_Logo_Read(uint8_t *LogoName, uint8_t *Logo_Rbuff, uint32_t LogoReadsize) {
-    W25QXX.SPI_FLASH_BufferRead(Logo_Rbuff, PIC_LOGO_ADDR + logo_addroffset, LogoReadsize);
-    logo_addroffset += LogoReadsize;
-    if (logo_addroffset >= LOGO_MAX_SIZE_TFT35)
-      logo_addroffset = 0;
+#if HAS_SPI_FLASH_FONT
+  void get_spi_flash_data(const char *rec_buf, int addr, int size) {
+    W25QXX.init(SPI_QUARTER_SPEED);
+    W25QXX.SPI_FLASH_BufferRead((uint8_t *)rec_buf, UNIGBK_FLASH_ADDR + addr, size);
   }
+#endif
 
-  uint32_t default_view_addroffset = 0;
-  void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize) {
-    W25QXX.init(SPI_QUARTER_SPEED);
+uint32_t logo_addroffset = 0;
+void Pic_Logo_Read(uint8_t *LogoName, uint8_t *Logo_Rbuff, uint32_t LogoReadsize) {
+  W25QXX.SPI_FLASH_BufferRead(Logo_Rbuff, PIC_LOGO_ADDR + logo_addroffset, LogoReadsize);
+  logo_addroffset += LogoReadsize;
+  if (logo_addroffset >= LOGO_MAX_SIZE_TFT35)
+    logo_addroffset = 0;
+}
 
-    W25QXX.SPI_FLASH_BufferRead(default_view_Rbuff, DEFAULT_VIEW_ADDR_TFT35 + default_view_addroffset + 4, default_view_Readsize);
-    default_view_addroffset += default_view_Readsize;
-    if (default_view_addroffset >= DEFAULT_VIEW_MAX_SIZE)
-      default_view_addroffset = 0;
+uint32_t default_view_addroffset = 0;
+void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize) {
+  W25QXX.init(SPI_QUARTER_SPEED);
 
-  }
+  W25QXX.SPI_FLASH_BufferRead(default_view_Rbuff, DEFAULT_VIEW_ADDR_TFT35 + default_view_addroffset, default_view_Readsize);
+  default_view_addroffset += default_view_Readsize;
+  if (default_view_addroffset >= DEFAULT_VIEW_MAX_SIZE)
+    default_view_addroffset = 0;
+}
 
+#if HAS_BAK_VIEW_IN_FLASH
   uint32_t flash_view_addroffset = 0;
   void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize) {
     W25QXX.init(SPI_QUARTER_SPEED);
@@ -728,9 +577,7 @@ void get_spi_flash_data(const char *rec_buf, int addr, int size) {
     flash_view_addroffset += flash_view_Readsize;
     if (flash_view_addroffset >= FLASH_VIEW_MAX_SIZE)
       flash_view_addroffset = 0;
-
   }
-
 #endif
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h
index b307cc8dba..4176ee0230 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h
+++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h
@@ -29,21 +29,61 @@ extern "C" { /* C-declarations for C++ */
 #include <string.h>
 #include "lvgl.h"
 
-#if 1
+#include "../../inc/MarlinConfigPre.h"
 
-  #define PIC_MAX_CN           100    // Maximum number of pictures
-  #define PIC_NAME_MAX_LEN      50    // Picture name maximum length
+#ifndef HAS_SPI_FLASH_FONT
+  #define HAS_SPI_FLASH_FONT              0 //disabled until fix the font load code
+#endif
+#ifndef HAS_GCODE_PREVIEW
+  #define HAS_GCODE_PREVIEW               1
+#endif
+#ifndef HAS_LANG_SELECT_SCREEN
+  #define HAS_LANG_SELECT_SCREEN               0
+#endif
+#ifndef HAS_BAK_VIEW_IN_FLASH
+  #define HAS_BAK_VIEW_IN_FLASH               1
+#endif
+#ifndef HAS_GCODE_DEFAULT_VIEW_IN_FLASH
+  #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH               1
+#endif
+#ifndef SPI_FLASH_SIZE
+  #define SPI_FLASH_SIZE                  0x1000000 // 16MB
+#endif
 
-  #define LOGO_MAX_SIZE_TFT35             (300*1024)
-  #define LOGO_MAX_SIZE_TFT32             (150*1024)
-  #define TITLELOGO_MAX_SIZE              (150*1024) // Little logo maximum
-  #define DEFAULT_VIEW_MAX_SIZE           (200*200*2)
-  #define FLASH_VIEW_MAX_SIZE             (200*200*2)
+#define PIC_MAX_CN           100    // Maximum number of pictures
+#define PIC_NAME_MAX_LEN      50    // Picture name maximum length
 
-  #define PER_PIC_MAX_SPACE_TFT35         (32*1024)
-  #define PER_PIC_MAX_SPACE_TFT32         (16*1024)
-  #define PER_FONT_MAX_SPACE              (16*1024)
+#define LOGO_MAX_SIZE_TFT35             (300*1024)
+#define LOGO_MAX_SIZE_TFT32             (150*1024)
+#define TITLELOGO_MAX_SIZE              (150*1024) // Little logo maximum
+#define DEFAULT_VIEW_MAX_SIZE           (200*200*2)
+#define FLASH_VIEW_MAX_SIZE             (200*200*2)
 
+#define PER_PIC_MAX_SPACE_TFT35         (32*1024)
+#define PER_PIC_MAX_SPACE_TFT32         (16*1024)
+#define PER_FONT_MAX_SPACE              (16*1024)
+
+#if SPI_FLASH_SIZE == 0x200000
+  //pic
+  //Robin_pro pic addr
+  #define PIC_NAME_ADDR                   0x001000      // Pic information addr
+  #define PIC_SIZE_ADDR                   0x001800      // Pic size information addr
+  #define PIC_COUNTER_ADDR                0x002000      // Pic total number
+  #define PER_PIC_SAVE_ADDR               0x000000      // Storage address of each picture
+  #define PIC_LOGO_ADDR                   0x000000      // Logo addr
+  #define PIC_DATA_ADDR                   0x003000    //
+
+  // TFT35
+  #define DEFAULT_VIEW_ADDR_TFT35         0x1ea070
+  #define BAK_VIEW_ADDR_TFT35             (DEFAULT_VIEW_ADDR_TFT35+90*1024)
+  #define PIC_ICON_LOGO_ADDR_TFT35        (BAK_VIEW_ADDR_TFT35+80*1024)
+  #define PIC_DATA_ADDR_TFT35             0x003000 // (PIC_ICON_LOGO_ADDR_TFT35+350*1024) //0xC5800
+
+  #define PIC_DATA_ADDR_TFT32             0x00F000
+  #define PIC_ICON_LOGO_ADDR_TFT32        0x5D8000
+  #define PIC_OTHER_SIZE_ADDR_TFT32       0x5EE000
+
+#else
   //pic
   //Robin_pro pic addr
   #define PIC_NAME_ADDR                   0x003000      // Pic information addr
@@ -51,13 +91,13 @@ extern "C" { /* C-declarations for C++ */
   #define PIC_COUNTER_ADDR                0x008000      // Pic total number
   #define PER_PIC_SAVE_ADDR               0x009000      // Storage address of each picture
   #define PIC_LOGO_ADDR                   0x00A000      // Logo addr
-  //#define PIC_DATA_ADDR                   0x02F000    //
+  //#define PIC_DATA_ADDR                 0x02F000      //
 
   // TFT35
-  #define DEFAULT_VIEW_ADDR_TFT35                         0XC5800
-  #define BAK_VIEW_ADDR_TFT35                                             (DEFAULT_VIEW_ADDR_TFT35+90*1024)
-  #define PIC_ICON_LOGO_ADDR_TFT35            (BAK_VIEW_ADDR_TFT35+80*1024)
-  #define PIC_DATA_ADDR_TFT35                                             (PIC_ICON_LOGO_ADDR_TFT35+350*1024)//0XC5800
+  #define DEFAULT_VIEW_ADDR_TFT35         0xC5800
+  #define BAK_VIEW_ADDR_TFT35             (DEFAULT_VIEW_ADDR_TFT35+90*1024)
+  #define PIC_ICON_LOGO_ADDR_TFT35        (BAK_VIEW_ADDR_TFT35+80*1024)
+  #define PIC_DATA_ADDR_TFT35             (PIC_ICON_LOGO_ADDR_TFT35+350*1024) //0xC5800
 
   // TFT32
   #define PIC_DATA_ADDR_TFT32             0x02F000
@@ -69,48 +109,37 @@ extern "C" { /* C-declarations for C++ */
   #define UNIGBK_FLASH_ADDR              (FONTINFOADDR+4096) // 4*1024
   #define GBK_FLASH_ADDR                 (UNIGBK_FLASH_ADDR+180224) // 176*1024
 
-  // Flash flag
-  #define FLASH_INF_VALID_FLAG            0xAA558761
-  // SD card information first addr
-  #define VAR_INF_ADDR                    0x000000
-
-  union union32 {
-    uint8_t bytes[4];
-    uint32_t dwords;
-  };
-
-  // pic information
-  struct pic_msg {
-    uint8_t name[PIC_NAME_MAX_LEN];
-    union union32 size;
-  };
+#endif
 
-  typedef struct pic_msg PIC_MSG;
+// Flash flag
+#define FLASH_INF_VALID_FLAG            0xAA558761
+// SD card information first addr
+#define VAR_INF_ADDR                    0x000000
 
-  #define BMP_WRITE_BUF_LEN 512
+union union32 {
+  uint8_t bytes[4];
+  uint32_t dwords;
+};
 
-  #define PICINFOADDR   0
+// pic information
+struct pic_msg {
+  uint8_t name[PIC_NAME_MAX_LEN];
+  union union32 size;
+};
 
-  #define PIC_SIZE_xM   6
-  #define FONT_SIZE_xM  2
+typedef struct pic_msg PIC_MSG;
 
-  //extern void PicMsg_Init(void);
-  extern void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff);
-  //extern void bindBmpFileData(const uint8_t **pBuf, uint8_t *pName);
-  //extern void Pic_Logo_Read(uint8_t *LogoName,uint8_t *Logo_Rbuff,uint32_t LogoReadsize);
-  //extern void default_view_Read(uint8_t *default_view_Rbuff,uint32_t default_view_Readsize);
-  //extern void flash_view_Read(uint8_t *flash_view_Rbuff,uint32_t flash_view_Readsize);
+#define BMP_WRITE_BUF_LEN 512
 
-  //extern void lv_Pic_Read(uint8_t *Pname,uint8_t *P_Rbuff,uint32_t addr,uint32_t size);
-  extern void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size);
+#define PICINFOADDR   0
 
-#endif
+#define PIC_SIZE_xM   6
+#define FONT_SIZE_xM  2
 
+extern void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff);
+extern void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size);
 extern uint32_t lv_get_pic_addr(uint8_t *Pname);
-
 extern void get_spi_flash_data(const char *rec_buf, int offset, int size);
-//extern void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead);
-
 extern void spi_flash_read_test();
 extern void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize);
 extern void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize);
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp
index 584a009bad..ac876bb16a 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
   #include "../../../../MarlinCore.h"
 
@@ -215,4 +215,4 @@
     }
   }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp
index 25fd7082d9..7e782c3fef 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp
@@ -22,7 +22,7 @@
 
 #include "../../../../inc/MarlinConfig.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
   #if defined(ARDUINO_ARCH_STM32F1) && PIN_EXISTS(FSMC_CS) // FSMC on 100/144 pins SoCs
 
@@ -230,7 +230,7 @@
       return uint32_t(data);
     }
 
-    #if ENABLED(LCD_USE_DMA_FSMC)
+    #ifdef LCD_USE_DMA_FSMC
 
     void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) {
       while (count > 0) {
@@ -270,4 +270,4 @@
 
     #endif // LCD_USE_DMA_FSMC
   #endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp
index a34b1ff470..54c030f967 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp
@@ -27,765 +27,751 @@
 
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
-  #include "../../../../MarlinCore.h"
+#include "../../../../MarlinCore.h"
 
-  #include "tft_lvgl_configuration.h"
-  #include "lvgl.h"
-  #include "../../../../feature/touch/xpt2046.h"
-  #include "draw_ready_print.h"
-  #include "W25Qxx.h"
-  #include "pic_manager.h"
+#include "tft_lvgl_configuration.h"
+#include "lvgl.h"
+#include "../../../../feature/touch/xpt2046.h"
+#include "draw_ready_print.h"
+#include "W25Qxx.h"
+#include "pic_manager.h"
 
-  #include "mks_hardware_test.h"
-  #include "draw_ui.h"
+#include "mks_hardware_test.h"
+#include "draw_ui.h"
 
-  #if ENABLED(POWER_LOSS_RECOVERY)
-    #include "../../../../feature/powerloss.h"
-  #endif
-
-  #include <SPI.h>
-
-  #if ENABLED(SPI_GRAPHICAL_TFT)
-    #include "SPI_TFT.h"
-  #endif
+#if ENABLED(POWER_LOSS_RECOVERY)
+  #include "../../../../feature/powerloss.h"
+#endif
 
-//#include "../../Configuration.h"
-//#include "../../src/core/macros.h"
+#include <SPI.h>
 
-  extern void LCD_IO_Init(uint8_t cs, uint8_t rs);
-  extern void LCD_IO_WriteData(uint16_t RegValue);
-  extern void LCD_IO_WriteReg(uint16_t Reg);
+#if ENABLED(SPI_GRAPHICAL_TFT)
+  #include "SPI_TFT.h"
+#endif
 
-  extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count);
+extern void LCD_IO_Init(uint8_t cs, uint8_t rs);
+extern void LCD_IO_WriteData(uint16_t RegValue);
+extern void LCD_IO_WriteReg(uint16_t Reg);
+extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length);
+extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count);
 
+#if HAS_SPI_FLASH_FONT
   extern void init_gb2312_font();
+#endif
 
-  static lv_disp_buf_t disp_buf;
-//static lv_color_t buf[LV_HOR_RES_MAX * 18];
-//static lv_color_t buf[10*5];
-//extern lv_obj_t * scr;
-  #if ENABLED(SDSUPPORT)
-    extern void UpdatePic();
+static lv_disp_buf_t disp_buf;
+#if ENABLED(SDSUPPORT)
+  extern void UpdatePic();
+  #if HAS_SPI_FLASH_FONT
     extern void UpdateFont();
   #endif
-  uint16_t DeviceCode = 0x9488;
-  extern uint8_t sel_id;
+#endif
+uint16_t DeviceCode = 0x9488;
+extern uint8_t sel_id;
+
+#define SetCs
+#define ClrCs
+
+#define HDP  799 // Horizontal Display Period
+#define HT  1000 // Horizontal Total
+#define HPS   51 // LLINE Pulse Start Position
+#define LPS    3 // Horizontal Display Period Start Position
+#define HPW    8 // LLINE Pulse Width
+
+#define VDP  479 // Vertical Display Period
+#define VT   530 // Vertical Total
+#define VPS   24 // LFRAME Pulse Start Position
+#define FPS   23 // Vertical Display Period Start Positio
+#define VPW    3 // LFRAME Pulse Width
+
+#define MAX_HZ_POSX HDP+1
+#define MAX_HZ_POSY VDP+1
+
+extern uint8_t gcode_preview_over, flash_preview_begin, default_preview_flg;
+
+void SysTick_Callback() {
+  lv_tick_inc(1);
+  print_time_count();
+}
+
+void tft_set_cursor(uint16_t x, uint16_t y) {
+  LCD_IO_WriteReg(0x002A);
+  LCD_IO_WriteData(x >> 8);
+  LCD_IO_WriteData(x & 0x00FF);
+  LCD_IO_WriteData(x >> 8);
+  LCD_IO_WriteData(x & 0x00FF);
+  //ILI9488_WriteData(0x01);
+  //ILI9488_WriteData(0xDF);
+  LCD_IO_WriteReg(0x002B);
+  LCD_IO_WriteData(y >> 8);
+  LCD_IO_WriteData(y & 0x00FF);
+  LCD_IO_WriteData(y >> 8);
+  LCD_IO_WriteData(y & 0x00FF);
+  //ILI9488_WriteData(0x01);
+  //ILI9488_WriteData(0x3F);
+}
+
+void LCD_WriteRAM_Prepare(void) {
+  #if 0
+  if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x8989)) {
+    ClrCs
+    LCD->LCD_REG = R34;
+    SetCs
+  }
+  else {
+    LCD_WrtReg(0x002C);
+  }
+  #else
+    LCD_IO_WriteReg(0x002C);
+  #endif
+}
+
+void tft_set_point(uint16_t x, uint16_t y, uint16_t point) {
+  //if (DeviceCode == 0x9488) {
+  if ((x > 480) || (y > 320)) return;
+  //}
+  //**if ( (x>320)||(y>240) ) return;
+  tft_set_cursor(x, y); /*设置光标位置*/
+
+  LCD_WriteRAM_Prepare();   /* 开始写入GRAM*/
+  //LCD_WriteRAM(point);
+  LCD_IO_WriteData(point);
+}
+
+void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue) {
+  /* Write 16-bit Index, then Write Reg */
+  ClrCs
+    LCD_IO_WriteReg(LCD_Reg);
+  /* Write 16-bit Reg */
+  LCD_IO_WriteData(LCD_RegValue);
+  SetCs
+}
+
+void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh) {
+  uint16_t s_h, s_l, e_h, e_l;
+  uint16_t xEnd, yEnd;
+  xEnd = StartX + width;
+  yEnd = StartY + heigh - 1;
+  if (DeviceCode == 0x8989) {
+    /*LCD_WriteReg(0x0044, (StartX & 0xFF) | (xEnd << 8));
+    LCD_WriteReg(0x0045, StartY);
+    LCD_WriteReg(0x0046, yEnd);*/
+    LCD_WriteReg(0x0044, (StartY & 0xFF) | (yEnd << 8));
+    LCD_WriteReg(0x0045, StartX);
+    LCD_WriteReg(0x0046, xEnd);
+  }
+  else if (DeviceCode == 0x9488) {
+    s_h = (StartX >> 8) & 0x00ff;
+    s_l = StartX & 0x00ff;
+    e_h = ((StartX + width - 1) >> 8) & 0x00ff;
+    e_l = (StartX + width - 1) & 0x00ff;
+
+    LCD_IO_WriteReg(0x002A);
+    LCD_IO_WriteData(s_h);
+    LCD_IO_WriteData(s_l);
+    LCD_IO_WriteData(e_h);
+    LCD_IO_WriteData(e_l);
+
+    s_h = (StartY >> 8) & 0x00ff;
+    s_l = StartY & 0x00ff;
+    e_h = ((StartY + heigh - 1) >> 8) & 0x00ff;
+    e_l = (StartY + heigh - 1) & 0x00ff;
+
+    LCD_IO_WriteReg(0x002B);
+    LCD_IO_WriteData(s_h);
+    LCD_IO_WriteData(s_l);
+    LCD_IO_WriteData(e_h);
+    LCD_IO_WriteData(e_l);
+  }
+  else if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x1505)) {
+    /* LCD_WriteReg(0x0050, StartX);
+     LCD_WriteReg(0x0052, StartY);
+     LCD_WriteReg(0x0051, xEnd);
+     LCD_WriteReg(0x0053, yEnd);*/
+    LCD_WriteReg(0x0050, StartY);      //Specify the start/end positions of the window address in the horizontal direction by an address unit
+    LCD_WriteReg(0x0051, yEnd);      //Specify the start positions of the window address in the vertical direction by an address unit
+    LCD_WriteReg(0x0052, 320 - xEnd);
+    LCD_WriteReg(0x0053, 320 - StartX - 1);      //Specify the end positions of the window address in the vertical direction by an address unit
 
-  #define SetCs
-  #define ClrCs
+  }
+  else {
+    s_h = (StartX >> 8) & 0xFF;
+    s_l = StartX & 0xFF;
+    e_h = ((StartX + width - 1) >> 8) & 0xFF;
+    e_l = (StartX + width - 1) & 0xFF;
+
+    LCD_IO_WriteReg(0x2A);
+    LCD_IO_WriteData(s_h);
+    LCD_IO_WriteData(s_l);
+    LCD_IO_WriteData(e_h);
+    LCD_IO_WriteData(e_l);
+
+    s_h = (StartY >> 8) & 0xFF;
+    s_l = StartY & 0xFF;
+    e_h = ((StartY + heigh - 1) >> 8) & 0xFF;
+    e_l = (StartY + heigh - 1) & 0xFF;
+
+    LCD_IO_WriteReg(0x2B);
+    LCD_IO_WriteData(s_h);
+    LCD_IO_WriteData(s_l);
+    LCD_IO_WriteData(e_h);
+    LCD_IO_WriteData(e_l);
+  }
+}
+
+void LCD_Clear(uint16_t Color) {
+  uint32_t index = 0;
+  unsigned int count;
+
+  if (DeviceCode == 0x9488) {
+    tft_set_cursor(0, 0);
+    ili9320_SetWindows(0, 0, 480, 320);
+    LCD_WriteRAM_Prepare();
+    #ifdef LCD_USE_DMA_FSMC
+      LCD_IO_WriteMultiple(Color, LCD_FULL_PIXEL_WIDTH * LCD_FULL_PIXEL_HEIGHT);
+    #else
+    //index = (160*480);
+    for (index = 0; index < 320 * 480; index++)
+      LCD_IO_WriteData(Color);
+    #endif
+    //LCD_IO_WriteMultiple(Color, (480*320));
+    //while(index --) LCD_IO_WriteData(Color);
+  }
+  else if (DeviceCode == 0x5761) {
+    LCD_IO_WriteReg(0x002a);
+    LCD_IO_WriteData(0);
+    LCD_IO_WriteData(0);
+    LCD_IO_WriteData(HDP >> 8);
+    LCD_IO_WriteData(HDP & 0x00ff);
+    LCD_IO_WriteReg(0x002b);
+    LCD_IO_WriteData(0);
+    LCD_IO_WriteData(0);
+    LCD_IO_WriteData(VDP >> 8);
+    LCD_IO_WriteData(VDP & 0x00ff);
+    LCD_IO_WriteReg(0x002c);
+    LCD_IO_WriteReg(0x002c);
+    for (count = 0; count < (HDP + 1) * (VDP + 1); count++)
+      LCD_IO_WriteData(Color);
+  }
+  else {
+    tft_set_cursor(0, 0);
+    LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
+    for (index = 0; index < 76800; index++)
+      LCD_IO_WriteData(Color);
+  }
+}
 
-  #define  HDP  799//Horizontal Display Period     //**
-  #define  HT   1000//Horizontal Total
-  #define  HPS  51//LLINE Pulse Start Position
-  #define  LPS  3 //  Horizontal Display Period Start Position
-  #define  HPW  8 //  LLINE Pulse Width
+extern uint16_t ILI9488_ReadRAM();
 
-  #define  VDP  479//Vertical Display Period
-  #define  VT   530//Vertical Total
-  #define  VPS  24//  LFRAME Pulse Start Position
-  #define  FPS  23//Vertical Display Period Start Positio
-  #define  VPW  3 // LFRAME Pulse Width     //**
+#if DISABLED(SPI_GRAPHICAL_TFT)
 
-  #define MAX_HZ_POSX HDP+1
-  #define MAX_HZ_POSY VDP+1
+void init_tft() {
+  uint16_t i;
+  //************* Start Initial Sequence **********//
 
-  extern uint8_t gcode_preview_over, flash_preview_begin, default_preview_flg;
+  //start lcd pins and dma
+  #if PIN_EXISTS(LCD_BACKLIGHT)
+    OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away
+  #endif
 
-  void SysTick_Callback() {
-    lv_tick_inc(1);
-    print_time_count();
-  }
+  #if PIN_EXISTS(LCD_RESET)
+    // Perform a clean hardware reset with needed delays
+    OUT_WRITE(LCD_RESET_PIN, LOW);
+    _delay_ms(5);
+    WRITE(LCD_RESET_PIN, HIGH);
+    _delay_ms(5);
+  #endif
 
-  void tft_set_cursor(uint16_t x, uint16_t y) {
-    #if 0
-    if (DeviceCode == 0x8989) {
-      LCD_WriteReg(0x004E, y);        //行
-      LCD_WriteReg(0x004F, x);  //列
-    }
-    else if ((DeviceCode == 0x9919)) {
-      LCD_WriteReg(0x004E, x); // 行
-      LCD_WriteReg(0x004F, y); // 列
-    }
-    else if ((DeviceCode == 0x5761)) {    //SSD1963
-      LCD_WrtReg(0x002A);
-      LCD_WrtRAM(x >> 8);
-      LCD_WrtRAM(x & 0x00FF);
-      LCD_WrtRAM(HDP >> 8);
-      LCD_WrtRAM(HDP & 0x00FF);
-      LCD_WrtReg(0x002B);
-      LCD_WrtRAM(y >> 8);
-      LCD_WrtRAM(y & 0x00FF);
-      LCD_WrtRAM(VDP >> 8);
-      LCD_WrtRAM(VDP & 0x00FF);
-    }
-    else if (DeviceCode == 0x9488) {
-      ILI9488_WriteCmd(0x002A);
-      ILI9488_WriteData(x >> 8);
-      ILI9488_WriteData(x & 0x00FF);
-      ILI9488_WriteData(x >> 8);
-      ILI9488_WriteData(x & 0x00FF);
-      //ILI9488_WriteData(0x01);
-      //ILI9488_WriteData(0xDF);
-      ILI9488_WriteCmd(0x002B);
-      ILI9488_WriteData(y >> 8);
-      ILI9488_WriteData(y & 0x00FF);
-      ILI9488_WriteData(y >> 8);
-      ILI9488_WriteData(y & 0x00FF);
-      //ILI9488_WriteData(0x01);
-      //ILI9488_WriteData(0x3F);
-    }
-    else {
-      LCD_WriteReg(0x0020, y); // 行
-      LCD_WriteReg(0x0021, 0x13f - x); // 列
-    }
-    #else // if 0
-      LCD_IO_WriteReg(0x002A);
-      LCD_IO_WriteData(x >> 8);
-      LCD_IO_WriteData(x & 0x00FF);
-      LCD_IO_WriteData(x >> 8);
-      LCD_IO_WriteData(x & 0x00FF);
-      //ILI9488_WriteData(0x01);
-      //ILI9488_WriteData(0xDF);
-      LCD_IO_WriteReg(0x002B);
-      LCD_IO_WriteData(y >> 8);
-      LCD_IO_WriteData(y & 0x00FF);
-      LCD_IO_WriteData(y >> 8);
-      LCD_IO_WriteData(y & 0x00FF);
-      //ILI9488_WriteData(0x01);
-      //ILI9488_WriteData(0x3F);
-    #endif // if 0
-  }
+  #if PIN_EXISTS(LCD_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT)
+    WRITE(LCD_BACKLIGHT_PIN, HIGH);
+  #endif
 
-  void LCD_WriteRAM_Prepare(void) {
-    #if 0
-    if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x8989)) {
-      ClrCs
-      LCD->LCD_REG = R34;
-      SetCs
-    }
-    else {
-      LCD_WrtReg(0x002C);
-    }
-    #else
-      LCD_IO_WriteReg(0x002C);
-    #endif
-  }
+  TERN_(HAS_LCD_CONTRAST, refresh_contrast());
 
-  void tft_set_point(uint16_t x, uint16_t y, uint16_t point) {
-    //if (DeviceCode == 0x9488) {
-    if ((x > 480) || (y > 320)) return;
-    //}
-    //**if ( (x>320)||(y>240) ) return;
-    tft_set_cursor(x, y); /*设置光标位置*/
+  #ifdef LCD_USE_DMA_FSMC
+    dma_init(FSMC_DMA_DEV);
+    dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL);
+    dma_set_priority(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, DMA_PRIORITY_MEDIUM);
+  #endif
 
-    LCD_WriteRAM_Prepare();   /* 开始写入GRAM*/
-    //LCD_WriteRAM(point);
-    LCD_IO_WriteData(point);
-  }
+  LCD_IO_Init(FSMC_CS_PIN, FSMC_RS_PIN);
+
+  _delay_ms(5);
+
+  LCD_IO_WriteReg(0x00D3);
+  DeviceCode = ILI9488_ReadRAM(); //dummy read
+  DeviceCode = ILI9488_ReadRAM();
+  DeviceCode = ILI9488_ReadRAM();
+  DeviceCode <<= 8;
+  DeviceCode |= ILI9488_ReadRAM();
+
+  if (DeviceCode == 0x9488) {
+    LCD_IO_WriteReg(0x00E0);
+    LCD_IO_WriteData(0x0000);
+    LCD_IO_WriteData(0x0007);
+    LCD_IO_WriteData(0x000f);
+    LCD_IO_WriteData(0x000D);
+    LCD_IO_WriteData(0x001B);
+    LCD_IO_WriteData(0x000A);
+    LCD_IO_WriteData(0x003c);
+    LCD_IO_WriteData(0x0078);
+    LCD_IO_WriteData(0x004A);
+    LCD_IO_WriteData(0x0007);
+    LCD_IO_WriteData(0x000E);
+    LCD_IO_WriteData(0x0009);
+    LCD_IO_WriteData(0x001B);
+    LCD_IO_WriteData(0x001e);
+    LCD_IO_WriteData(0x000f);
+
+    LCD_IO_WriteReg(0x00E1);
+    LCD_IO_WriteData(0x0000);
+    LCD_IO_WriteData(0x0022);
+    LCD_IO_WriteData(0x0024);
+    LCD_IO_WriteData(0x0006);
+    LCD_IO_WriteData(0x0012);
+    LCD_IO_WriteData(0x0007);
+    LCD_IO_WriteData(0x0036);
+    LCD_IO_WriteData(0x0047);
+    LCD_IO_WriteData(0x0047);
+    LCD_IO_WriteData(0x0006);
+    LCD_IO_WriteData(0x000a);
+    LCD_IO_WriteData(0x0007);
+    LCD_IO_WriteData(0x0030);
+    LCD_IO_WriteData(0x0037);
+    LCD_IO_WriteData(0x000f);
+
+    LCD_IO_WriteReg(0x00C0);
+    LCD_IO_WriteData(0x0010);
+    LCD_IO_WriteData(0x0010);
+
+    LCD_IO_WriteReg(0x00C1);
+    LCD_IO_WriteData(0x0041);
+
+    LCD_IO_WriteReg(0x00C5);
+    LCD_IO_WriteData(0x0000);
+    LCD_IO_WriteData(0x0022);
+    LCD_IO_WriteData(0x0080);
+
+    LCD_IO_WriteReg(0x0036);
+    //ILI9488_WriteData(0x0068);
+    //if (gCfgItems.overturn_180 != 0xEE)
+    //{
+    LCD_IO_WriteData(0x0068);
+    //}
+    //else
+    //{
+    //ILI9488_WriteData(0x00A8);
+    //}
 
-  void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue) {
-    /* Write 16-bit Index, then Write Reg */
-    ClrCs
-      LCD_IO_WriteReg(LCD_Reg);
-    /* Write 16-bit Reg */
-    LCD_IO_WriteData(LCD_RegValue);
-    SetCs
-  }
+    LCD_IO_WriteReg(0x003A); //Interface Mode Control
+    LCD_IO_WriteData(0x0055);
 
-  void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh) {
-    uint16_t s_h, s_l, e_h, e_l;
-
-    uint16_t xEnd, yEnd;
-    xEnd = StartX + width;
-    yEnd = StartY + heigh - 1;
-    if (DeviceCode == 0x8989) {
-      /*LCD_WriteReg(0x0044, (StartX & 0xFF) | (xEnd << 8));
-      LCD_WriteReg(0x0045, StartY);
-      LCD_WriteReg(0x0046, yEnd);*/
-      LCD_WriteReg(0x0044, (StartY & 0xFF) | (yEnd << 8));
-      LCD_WriteReg(0x0045, StartX);
-      LCD_WriteReg(0x0046, xEnd);
-    }
-    else if (DeviceCode == 0x9488) {
-      s_h = (StartX >> 8) & 0x00ff;
-      s_l = StartX & 0x00ff;
-      e_h = ((StartX + width - 1) >> 8) & 0x00ff;
-      e_l = (StartX + width - 1) & 0x00ff;
-
-      LCD_IO_WriteReg(0x002A);
-      LCD_IO_WriteData(s_h);
-      LCD_IO_WriteData(s_l);
-      LCD_IO_WriteData(e_h);
-      LCD_IO_WriteData(e_l);
-
-      s_h = (StartY >> 8) & 0x00ff;
-      s_l = StartY & 0x00ff;
-      e_h = ((StartY + heigh - 1) >> 8) & 0x00ff;
-      e_l = (StartY + heigh - 1) & 0x00ff;
-
-      LCD_IO_WriteReg(0x002B);
-      LCD_IO_WriteData(s_h);
-      LCD_IO_WriteData(s_l);
-      LCD_IO_WriteData(e_h);
-      LCD_IO_WriteData(e_l);
-    }
-    else if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x1505)) {
-      /* LCD_WriteReg(0x0050, StartX);
-       LCD_WriteReg(0x0052, StartY);
-       LCD_WriteReg(0x0051, xEnd);
-       LCD_WriteReg(0x0053, yEnd);*/
-      LCD_WriteReg(0x0050, StartY);      //Specify the start/end positions of the window address in the horizontal direction by an address unit
-      LCD_WriteReg(0x0051, yEnd);      //Specify the start positions of the window address in the vertical direction by an address unit
-      LCD_WriteReg(0x0052, 320 - xEnd);
-      LCD_WriteReg(0x0053, 320 - StartX - 1);      //Specify the end positions of the window address in the vertical direction by an address unit
+    LCD_IO_WriteReg(0x00B0);  //Interface Mode Control
+    LCD_IO_WriteData(0x0000);
+    LCD_IO_WriteReg(0x00B1);   //Frame rate 70HZ
+    LCD_IO_WriteData(0x00B0);
+    LCD_IO_WriteData(0x0011);
+    LCD_IO_WriteReg(0x00B4);
+    LCD_IO_WriteData(0x0002);
+    LCD_IO_WriteReg(0x00B6); //RGB/MCU Interface Control
+    LCD_IO_WriteData(0x0002);
+    LCD_IO_WriteData(0x0042);
 
-    }
-    else {
-      s_h = (StartX >> 8) & 0xFF;
-      s_l = StartX & 0xFF;
-      e_h = ((StartX + width - 1) >> 8) & 0xFF;
-      e_l = (StartX + width - 1) & 0xFF;
-
-      LCD_IO_WriteReg(0x2A);
-      LCD_IO_WriteData(s_h);
-      LCD_IO_WriteData(s_l);
-      LCD_IO_WriteData(e_h);
-      LCD_IO_WriteData(e_l);
-
-      s_h = (StartY >> 8) & 0xFF;
-      s_l = StartY & 0xFF;
-      e_h = ((StartY + heigh - 1) >> 8) & 0xFF;
-      e_l = (StartY + heigh - 1) & 0xFF;
-
-      LCD_IO_WriteReg(0x2B);
-      LCD_IO_WriteData(s_h);
-      LCD_IO_WriteData(s_l);
-      LCD_IO_WriteData(e_h);
-      LCD_IO_WriteData(e_l);
-    }
-  }
+    LCD_IO_WriteReg(0x00B7);
+    LCD_IO_WriteData(0x00C6);
 
-  void LCD_Clear(uint16_t Color) {
-    uint32_t index = 0;
-    unsigned int count;
+    //WriteComm(0xBE);
+    //WriteData(0x00);
+    //WriteData(0x04);
 
-    if (DeviceCode == 0x9488) {
-      tft_set_cursor(0, 0);
-      ili9320_SetWindows(0, 0, 480, 320);
-      LCD_WriteRAM_Prepare();
-      //index = (160*480);
-      for (index = 0; index < 320 * 480; index++)
-        LCD_IO_WriteData(Color);
-      //LCD_IO_WriteMultiple(Color, (480*320));
-      //while(index --) LCD_IO_WriteData(Color);
-    }
-    else if (DeviceCode == 0x5761) {
-      LCD_IO_WriteReg(0x002a);
-      LCD_IO_WriteData(0);
-      LCD_IO_WriteData(0);
-      LCD_IO_WriteData(HDP >> 8);
-      LCD_IO_WriteData(HDP & 0x00ff);
-      LCD_IO_WriteReg(0x002b);
-      LCD_IO_WriteData(0);
-      LCD_IO_WriteData(0);
-      LCD_IO_WriteData(VDP >> 8);
-      LCD_IO_WriteData(VDP & 0x00ff);
-      LCD_IO_WriteReg(0x002c);
-      LCD_IO_WriteReg(0x002c);
-      for (count = 0; count < (HDP + 1) * (VDP + 1); count++)
-        LCD_IO_WriteData(Color);
-    }
-    else {
-      tft_set_cursor(0, 0);
-      LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
-      for (index = 0; index < 76800; index++)
-        LCD_IO_WriteData(Color);
-    }
-  }
+    LCD_IO_WriteReg(0x00E9);
+    LCD_IO_WriteData(0x0000);
 
-  extern uint16_t ILI9488_ReadRAM();
+    LCD_IO_WriteReg(0x00F7);
+    LCD_IO_WriteData(0x00A9);
+    LCD_IO_WriteData(0x0051);
+    LCD_IO_WriteData(0x002C);
+    LCD_IO_WriteData(0x0082);
 
-  #if DISABLED(SPI_GRAPHICAL_TFT)
+    LCD_IO_WriteReg(0x0011);
+    for (i = 0; i < 65535; i++);
+    LCD_IO_WriteReg(0x0029);
 
-  void init_tft() {
-    uint16_t i;
-    //************* Start Initial Sequence **********//
+    ili9320_SetWindows(0, 0, 480, 320);
+    LCD_Clear(0x0000);
 
-    LCD_IO_Init(FSMC_CS_PIN, FSMC_RS_PIN);
+    OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH);
+  }
+}
 
-    _delay_ms(5);
+#endif // if DISABLED(SPI_GRAPHICAL_TFT)
 
-    LCD_IO_WriteReg(0x00D3);
-    DeviceCode = ILI9488_ReadRAM(); //dummy read
-    DeviceCode = ILI9488_ReadRAM();
-    DeviceCode = ILI9488_ReadRAM();
-    DeviceCode <<= 8;
-    DeviceCode |= ILI9488_ReadRAM();
-
-    if (DeviceCode == 0x9488) {
-      LCD_IO_WriteReg(0x00E0);
-      LCD_IO_WriteData(0x0000);
-      LCD_IO_WriteData(0x0007);
-      LCD_IO_WriteData(0x000f);
-      LCD_IO_WriteData(0x000D);
-      LCD_IO_WriteData(0x001B);
-      LCD_IO_WriteData(0x000A);
-      LCD_IO_WriteData(0x003c);
-      LCD_IO_WriteData(0x0078);
-      LCD_IO_WriteData(0x004A);
-      LCD_IO_WriteData(0x0007);
-      LCD_IO_WriteData(0x000E);
-      LCD_IO_WriteData(0x0009);
-      LCD_IO_WriteData(0x001B);
-      LCD_IO_WriteData(0x001e);
-      LCD_IO_WriteData(0x000f);
-
-      LCD_IO_WriteReg(0x00E1);
-      LCD_IO_WriteData(0x0000);
-      LCD_IO_WriteData(0x0022);
-      LCD_IO_WriteData(0x0024);
-      LCD_IO_WriteData(0x0006);
-      LCD_IO_WriteData(0x0012);
-      LCD_IO_WriteData(0x0007);
-      LCD_IO_WriteData(0x0036);
-      LCD_IO_WriteData(0x0047);
-      LCD_IO_WriteData(0x0047);
-      LCD_IO_WriteData(0x0006);
-      LCD_IO_WriteData(0x000a);
-      LCD_IO_WriteData(0x0007);
-      LCD_IO_WriteData(0x0030);
-      LCD_IO_WriteData(0x0037);
-      LCD_IO_WriteData(0x000f);
-
-      LCD_IO_WriteReg(0x00C0);
-      LCD_IO_WriteData(0x0010);
-      LCD_IO_WriteData(0x0010);
-
-      LCD_IO_WriteReg(0x00C1);
-      LCD_IO_WriteData(0x0041);
-
-      LCD_IO_WriteReg(0x00C5);
-      LCD_IO_WriteData(0x0000);
-      LCD_IO_WriteData(0x0022);
-      LCD_IO_WriteData(0x0080);
-
-      LCD_IO_WriteReg(0x0036);
-      //ILI9488_WriteData(0x0068);
-      //if (gCfgItems.overturn_180 != 0xEE)
-      //{
-      LCD_IO_WriteData(0x0068);
-      //}
-      //else
-      //{
-      //ILI9488_WriteData(0x00A8);
-      //}
-
-      LCD_IO_WriteReg(0x003A); //Interface Mode Control
-      LCD_IO_WriteData(0x0055);
-
-      LCD_IO_WriteReg(0x00B0);  //Interface Mode Control
-      LCD_IO_WriteData(0x0000);
-      LCD_IO_WriteReg(0x00B1);   //Frame rate 70HZ
-      LCD_IO_WriteData(0x00B0);
-      LCD_IO_WriteData(0x0011);
-      LCD_IO_WriteReg(0x00B4);
-      LCD_IO_WriteData(0x0002);
-      LCD_IO_WriteReg(0x00B6); //RGB/MCU Interface Control
-      LCD_IO_WriteData(0x0002);
-      LCD_IO_WriteData(0x0042);
-
-      LCD_IO_WriteReg(0x00B7);
-      LCD_IO_WriteData(0x00C6);
-
-      //WriteComm(0xBE);
-      //WriteData(0x00);
-      //WriteData(0x04);
-
-      LCD_IO_WriteReg(0x00E9);
-      LCD_IO_WriteData(0x0000);
-
-      LCD_IO_WriteReg(0x00F7);
-      LCD_IO_WriteData(0x00A9);
-      LCD_IO_WriteData(0x0051);
-      LCD_IO_WriteData(0x002C);
-      LCD_IO_WriteData(0x0082);
-
-      LCD_IO_WriteReg(0x0011);
-      for (i = 0; i < 65535; i++);
-      LCD_IO_WriteReg(0x0029);
-
-      ili9320_SetWindows(0, 0, 480, 320);
-      LCD_Clear(0x0000);
-
-      OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH);
-    }
-  }
+extern uint8_t bmp_public_buf[17 * 1024];
+void tft_lvgl_init() {
+  //uint16_t test_id=0;
+  W25QXX.init(SPI_QUARTER_SPEED);
+  //test_id=W25QXX.W25QXX_ReadID();
 
-  #endif // if DISABLED(SPI_GRAPHICAL_TFT)
+  //init tft first!
+  #if ENABLED(SPI_GRAPHICAL_TFT)
+    SPI_TFT.spi_init(SPI_FULL_SPEED);
+    SPI_TFT.LCD_init();
+  #else
+    init_tft();
+  #endif
 
-  extern uint8_t bmp_public_buf[17 * 1024];
-  void tft_lvgl_init() {
-    //uint16_t test_id=0;
-    W25QXX.init(SPI_QUARTER_SPEED);
-    //test_id=W25QXX.W25QXX_ReadID();
-    #if ENABLED(SDSUPPORT)
-      UpdatePic();
+  #if ENABLED(SDSUPPORT)
+    UpdatePic();
+    #if HAS_SPI_FLASH_FONT
       UpdateFont();
     #endif
+  #endif
 
-    gCfgItems_init();
-    ui_cfg_init();
-    disp_language_init();
-    //spi_flash_read_test();
+  gCfgItems_init();
+  ui_cfg_init();
+  disp_language_init();
+  //spi_flash_read_test();
 
-    #if ENABLED(SPI_GRAPHICAL_TFT)
-      SPI_TFT.spi_init(SPI_FULL_SPEED);
-      SPI_TFT.LCD_init();
-    #else
-      init_tft();
-    #endif
+  #if ENABLED(TOUCH_BUTTONS)
+    touch.init();
+  #endif
 
-    lv_init();
+  lv_init();
 
-    lv_disp_buf_init(&disp_buf, bmp_public_buf, NULL, LV_HOR_RES_MAX * 18); /*Initialize the display buffer*/
+  lv_disp_buf_init(&disp_buf, bmp_public_buf, NULL, LV_HOR_RES_MAX * 18); /*Initialize the display buffer*/
 
-    lv_disp_drv_t disp_drv;     /*Descriptor of a display driver*/
-    lv_disp_drv_init(&disp_drv);    /*Basic initialization*/
-    disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/
-    disp_drv.buffer = &disp_buf;    /*Assign the buffer to the display*/
-    lv_disp_drv_register(&disp_drv);  /*Finally register the driver*/
+  lv_disp_drv_t disp_drv;     /*Descriptor of a display driver*/
+  lv_disp_drv_init(&disp_drv);    /*Basic initialization*/
+  disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/
+  disp_drv.buffer = &disp_buf;    /*Assign the buffer to the display*/
+  lv_disp_drv_register(&disp_drv);  /*Finally register the driver*/
 
-    lv_indev_drv_t indev_drv;
-    lv_indev_drv_init(&indev_drv);     /*Descriptor of a input device driver*/
-    indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/
-    indev_drv.read_cb = my_touchpad_read;  /*Set your driver function*/
-    lv_indev_drv_register(&indev_drv);   /*Finally register the driver*/
+  lv_indev_drv_t indev_drv;
+  lv_indev_drv_init(&indev_drv);     /*Descriptor of a input device driver*/
+  indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/
+  indev_drv.read_cb = my_touchpad_read;  /*Set your driver function*/
+  lv_indev_drv_register(&indev_drv);   /*Finally register the driver*/
 
-    systick_attach_callback(SysTick_Callback);
+  systick_attach_callback(SysTick_Callback);
 
+  #if HAS_SPI_FLASH_FONT
     init_gb2312_font();
+  #endif
 
-    tft_style_init();
-
-    filament_pin_setup();
+  tft_style_init();
 
-    #if ENABLED(POWER_LOSS_RECOVERY)
-    if (recovery.valid()) {
-      if (gCfgItems.from_flash_pic == 1)
-        flash_preview_begin = 1;
-      else
-        default_preview_flg = 1;
+  filament_pin_setup();
 
-      uiCfg.print_state = REPRINTING;
+  #if ENABLED(POWER_LOSS_RECOVERY)
+  if (recovery.valid()) {
+    if (gCfgItems.from_flash_pic == 1)
+      flash_preview_begin = 1;
+    else
+      default_preview_flg = 1;
 
-      memset(public_buf_m, 0, sizeof(public_buf_m));
-      strncpy(public_buf_m, recovery.info.sd_filename, sizeof(public_buf_m));
-      card.printLongPath(public_buf_m);
+    uiCfg.print_state = REPRINTING;
 
-      strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[sel_id]));
+    memset(public_buf_m, 0, sizeof(public_buf_m));
+    strncpy(public_buf_m, recovery.info.sd_filename, sizeof(public_buf_m));
+    card.printLongPath(public_buf_m);
 
-      lv_draw_printing();
-    }
-    else
-    #endif
-    lv_draw_ready_print();
+    strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[sel_id]));
 
-    #if ENABLED(MKS_TEST)
-      Test_GPIO();
-    #endif
+    lv_draw_printing();
   }
+  else
+  #endif
+  lv_draw_ready_print();
 
-  #if 0
-  void LCD_WriteRAM(uint16_t RGB_Code) {
-    #if 0
-      ClrCs
-      /* Write 16-bit GRAM Reg */
-      LCD->LCD_RAM = RGB_Code;
-      SetCs
-    #else
-      LCD_IO_WriteData(RGB_Code);
-    #endif
-  }
+  #if ENABLED(MKS_TEST)
+    Test_GPIO();
   #endif
+}
 
-  void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) {
-    #if ENABLED(SPI_GRAPHICAL_TFT)
-      uint16_t i, width, height;
-      uint16_t clr_temp;
-      uint8_t tbuf[480 * 2];
+void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) {
+  #if ENABLED(SPI_GRAPHICAL_TFT)
+    uint16_t i, width, height;
+    uint16_t clr_temp;
+    uint8_t tbuf[480 * 2];
+
+    SPI_TFT.spi_init(SPI_FULL_SPEED);
+
+    width = area->x2 - area->x1 + 1;
+    height = area->y2 - area->y1 + 1;
+
+    for (int j = 0; j < height; j++) {
+      SPI_TFT.SetCursor(0, 0);
+      SPI_TFT.SetWindows((uint16_t)area->x1, (uint16_t)area->y1 + j, width, 1);
+      SPI_TFT.LCD_WriteRAM_Prepare();
+
+      for (i = 0; i < width * 2;) {
+        clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11)
+                              | ((uint16_t)color_p->ch.green << 5)
+                              | ((uint16_t)color_p->ch.blue));
 
-      SPI_TFT.spi_init(SPI_FULL_SPEED);
+        tbuf[i] = clr_temp >> 8;
+        tbuf[i + 1] = clr_temp;
+        i += 2;
+        color_p++;
+      }
+      SPI_TFT_CS_L;
+      SPI_TFT_DC_H;
+      SPI.dmaSend(tbuf, width * 2, true);
+      SPI_TFT_CS_H;
+    }
+
+    lv_disp_flush_ready(disp);       /* Indicate you are ready with the flushing*/
 
+    W25QXX.init(SPI_QUARTER_SPEED);
+  #else
+    #if 1
+      uint16_t i, width, height;
+      uint16_t clr_temp;
       width = area->x2 - area->x1 + 1;
       height = area->y2 - area->y1 + 1;
-
-      for (int j = 0; j < height; j++) {
-        SPI_TFT.SetCursor(0, 0);
-        SPI_TFT.SetWindows((uint16_t)area->x1, (uint16_t)area->y1 + j, width, 1);
-        SPI_TFT.LCD_WriteRAM_Prepare();
-
-        for (i = 0; i < width * 2;) {
-          clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11)
-                                | ((uint16_t)color_p->ch.green << 5)
-                                | ((uint16_t)color_p->ch.blue));
-
-          tbuf[i] = clr_temp >> 8;
-          tbuf[i + 1] = clr_temp;
-          i += 2;
-          color_p++;
-        }
-        SPI_TFT_CS_L;
-        SPI_TFT_DC_H;
-        SPI.dmaSend(tbuf, width * 2, true);
-        SPI_TFT_CS_H;
+      ili9320_SetWindows((uint16_t)area->x1, (uint16_t)area->y1, width, height);
+      LCD_WriteRAM_Prepare();
+      for (i = 0; i < width * height - 2; i++) {
+        clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11)
+                              | ((uint16_t)color_p->ch.green << 5)
+                              | ((uint16_t)color_p->ch.blue));
+        LCD_IO_WriteData(clr_temp);
+        color_p++;
       }
 
       lv_disp_flush_ready(disp);       /* Indicate you are ready with the flushing*/
+    #endif
+  #endif // SPI_GRAPHICAL_TFT
+}
 
-      W25QXX.init(SPI_QUARTER_SPEED);
-    #else
-      #if 1
-        uint16_t i, width, height;
-        uint16_t clr_temp;
-        #if 0
-          int32_t x, y;
-          for (y = area->y1; y <= area->y2; y++)
-            for (x = area->x1; x <= area->x2; x++) {
-              //set_pixel(x, y, *color_p);  /* Put a pixel to the display.*/
-              clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11)
-                                    | ((uint16_t)color_p->ch.green << 5)
-                                    | ((uint16_t)color_p->ch.blue));
-              tft_set_point(x, y, clr_temp);
-              color_p++;
-            }
-
-        #else
-          width = area->x2 - area->x1 + 1;
-          height = area->y2 - area->y1 + 1;
-          //tft_set_cursor((uint16_t)area->x1,(uint16_t)area->y1);
-          ili9320_SetWindows((uint16_t)area->x1, (uint16_t)area->y1, width, height);
-          LCD_WriteRAM_Prepare();
-          for (i = 0; i < width * height; i++) {
-            clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11)
-                                  | ((uint16_t)color_p->ch.green << 5)
-                                  | ((uint16_t)color_p->ch.blue));
-            LCD_IO_WriteData(clr_temp);
-            color_p++;
-          }
-        #endif
-
-        lv_disp_flush_ready(disp);       /* Indicate you are ready with the flushing*/
-      #endif
-    #endif // SPI_GRAPHICAL_TFT
-  }
-
-  #define TICK_CYCLE 1
+#define TICK_CYCLE 1
 
-  static int32_t touch_time1 = 0;
+static int32_t touch_time1 = 0;
 
-  unsigned int  getTickDiff(unsigned int curTick, unsigned int lastTick) {
-    if (lastTick <= curTick)
-      return (curTick - lastTick) * TICK_CYCLE;
-    else
-      return (0xFFFFFFFF - lastTick + curTick) * TICK_CYCLE;
-  }
+unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) {
+  return TICK_CYCLE * (lastTick <= curTick ? (curTick - lastTick) : (0xFFFFFFFF - lastTick + curTick));
+}
 
-  #if ENABLED(SPI_GRAPHICAL_TFT)
+#if ENABLED(SPI_GRAPHICAL_TFT)
 
-    #ifndef USE_XPT2046
-      #define USE_XPT2046       1
-      #define XPT2046_XY_SWAP   1
-      #define XPT2046_X_INV     1
-      #define XPT2046_Y_INV     0
-    #endif
+  #ifndef USE_XPT2046
+    #define USE_XPT2046       1
+    #define XPT2046_XY_SWAP   1
+    #define XPT2046_X_INV     1
+    #define XPT2046_Y_INV     0
+  #endif
 
-    #if USE_XPT2046
-      #define XPT2046_HOR_RES   480
-      #define XPT2046_VER_RES   320
-      #define XPT2046_X_MIN     201
-      #define XPT2046_Y_MIN     164
-      #define XPT2046_X_MAX     3919
-      #define XPT2046_Y_MAX     3776
-      #define XPT2046_AVG       4
-      #define XPT2046_INV       1
-    #endif
+  #if USE_XPT2046
+    #define XPT2046_HOR_RES   480
+    #define XPT2046_VER_RES   320
+    #define XPT2046_X_MIN     201
+    #define XPT2046_Y_MIN     164
+    #define XPT2046_X_MAX     3919
+    #define XPT2046_Y_MAX     3776
+    #define XPT2046_AVG       4
+    #define XPT2046_INV       1
+  #endif
 
-  #else
+#else
 
-    #ifndef USE_XPT2046
-      #define USE_XPT2046       1
+  #ifndef USE_XPT2046
+    #define USE_XPT2046       1
+    #ifndef XPT2046_XY_SWAP
       #define XPT2046_XY_SWAP   1
+    #endif
+    #ifndef XPT2046_X_INV
       #define XPT2046_X_INV     0
+    #endif
+    #ifndef XPT2046_Y_INV
       #define XPT2046_Y_INV     1
     #endif
+  #endif
 
-    #if USE_XPT2046
+  #if USE_XPT2046
+    #ifndef XPT2046_HOR_RES   480
       #define XPT2046_HOR_RES   480
+    #endif
+    #ifndef XPT2046_VER_RES
       #define XPT2046_VER_RES   320
+    #endif
+    #ifndef XPT2046_X_MIN
       #define XPT2046_X_MIN     201
+    #endif
+    #ifndef XPT2046_Y_MIN
       #define XPT2046_Y_MIN     164
+    #endif
+    #ifndef XPT2046_X_MAX
       #define XPT2046_X_MAX     3919
+    #endif
+    #ifndef XPT2046_Y_MAX
       #define XPT2046_Y_MAX     3776
+    #endif
+    #ifndef XPT2046_AVG
       #define XPT2046_AVG       4
+    #endif
+    #ifndef XPT2046_INV
       #define XPT2046_INV       0
     #endif
+  #endif
 
+#endif
+
+static void xpt2046_corr(uint16_t *x, uint16_t *y) {
+  #if XPT2046_XY_SWAP
+    int16_t swap_tmp;
+    swap_tmp = *x;
+    *x = *y;
+    *y = swap_tmp;
+  #endif
+  if ((*x) > XPT2046_X_MIN) (*x) -= XPT2046_X_MIN; else (*x) = 0;
+  if ((*y) > XPT2046_Y_MIN) (*y) -= XPT2046_Y_MIN; else (*y) = 0;
+  (*x) = uint32_t(uint32_t(*x) * XPT2046_HOR_RES) / (XPT2046_X_MAX - XPT2046_X_MIN);
+  (*y) = uint32_t(uint32_t(*y) * XPT2046_VER_RES) / (XPT2046_Y_MAX - XPT2046_Y_MIN);
+  #if XPT2046_X_INV
+    (*x) = XPT2046_HOR_RES - (*x);
   #endif
+  #if XPT2046_Y_INV
+    (*y) = XPT2046_VER_RES - (*y);
+  #endif
+}
 
-  static void xpt2046_corr(uint16_t *x, uint16_t *y) {
-    #if XPT2046_XY_SWAP
-      int16_t swap_tmp;
-      swap_tmp = *x;
-      *x = *y;
-      *y = swap_tmp;
-    #endif
-    if ((*x) > XPT2046_X_MIN) (*x) -= XPT2046_X_MIN; else (*x) = 0;
-    if ((*y) > XPT2046_Y_MIN) (*y) -= XPT2046_Y_MIN; else (*y) = 0;
-    (*x) = uint32_t(uint32_t(*x) * XPT2046_HOR_RES) / (XPT2046_X_MAX - XPT2046_X_MIN);
-    (*y) = uint32_t(uint32_t(*y) * XPT2046_VER_RES) / (XPT2046_Y_MAX - XPT2046_Y_MIN);
-    #if XPT2046_X_INV
-      (*x) = XPT2046_HOR_RES - (*x);
-    #endif
-    #if XPT2046_Y_INV
-      (*y) = XPT2046_VER_RES - (*y);
-    #endif
-  }
+#define  times  4
+#define CHX   0x90
+#define CHY   0xD0
 
-  #define  times  4
-  #define CHX   0x90// 0x90
-  #define CHY   0xD0// 0xD0
+int SPI2_ReadWrite2Bytes(void) {
+  volatile uint16_t ans = 0;
+  uint16_t temp = 0;
+  #if ENABLED(SPI_GRAPHICAL_TFT)
+    temp = SPI_TFT.spi_read_write_byte(0xFF);
+    ans = temp << 8;
+    temp = SPI_TFT.spi_read_write_byte(0xFF);
+    ans |= temp;
+    ans >>= 3;
+  #else
+    temp = W25QXX.spi_flash_read_write_byte(0xFF);
+    ans = temp << 8;
+    temp = W25QXX.spi_flash_read_write_byte(0xFF);
+    ans |= temp;
+    ans >>= 3;
+  #endif
+  return ans & 0x0FFF;
+}
 
-  int SPI2_ReadWrite2Bytes(void) {
-    volatile uint16_t ans = 0;
-    uint16_t temp = 0;
-    #if ENABLED(SPI_GRAPHICAL_TFT)
-      temp = SPI_TFT.spi_read_write_byte(0xFF);
-      ans = temp << 8;
-      temp = SPI_TFT.spi_read_write_byte(0xFF);
-      ans |= temp;
-      ans >>= 3;
-    #else
-      temp = W25QXX.spi_flash_read_write_byte(0xFF);
-      ans = temp << 8;
-      temp = W25QXX.spi_flash_read_write_byte(0xFF);
-      ans |= temp;
-      ans >>= 3;
-    #endif
-    return ans & 0x0FFF;
-  }
+uint16_t x_addata[times], y_addata[times];
+void XPT2046_Rd_Addata(uint16_t *X_Addata, uint16_t *Y_Addata) {
+  uint16_t i, j, k;
 
-  uint16_t x_addata[times], y_addata[times];
-  void XPT2046_Rd_Addata(uint16_t *X_Addata, uint16_t *Y_Addata) {
-    uint16_t i, j, k;
-    //int result;
-    //#if ENABLED(TOUCH_BUTTONS)
+  #if ENABLED(SPI_GRAPHICAL_TFT)
+    SPI_TFT.spi_init(SPI_QUARTER_SPEED);
+  #endif
 
+  for (i = 0; i < times; i++) {
     #if ENABLED(SPI_GRAPHICAL_TFT)
-      SPI_TFT.spi_init(SPI_QUARTER_SPEED);
+      OUT_WRITE(TOUCH_CS_PIN, LOW);
+      SPI_TFT.spi_read_write_byte(CHX);
+      y_addata[i] = SPI2_ReadWrite2Bytes();
+      WRITE(TOUCH_CS_PIN, HIGH);
+
+      OUT_WRITE(TOUCH_CS_PIN, LOW);
+      SPI_TFT.spi_read_write_byte(CHY);
+      x_addata[i] = SPI2_ReadWrite2Bytes();
+      WRITE(TOUCH_CS_PIN, HIGH);
+    #else // #if ENABLED(TOUCH_BUTTONS)
+      OUT_WRITE(TOUCH_CS_PIN, LOW);
+      W25QXX.spi_flash_read_write_byte(CHX);
+      y_addata[i] = SPI2_ReadWrite2Bytes();
+      WRITE(TOUCH_CS_PIN, HIGH);
+
+      OUT_WRITE(TOUCH_CS_PIN, LOW);
+      W25QXX.spi_flash_read_write_byte(CHY);
+      x_addata[i] = SPI2_ReadWrite2Bytes();
+      WRITE(TOUCH_CS_PIN, HIGH);
     #endif
 
-    for (i = 0; i < times; i++) {
-      #if ENABLED(SPI_GRAPHICAL_TFT)
-        OUT_WRITE(TOUCH_CS_PIN, LOW);
-        SPI_TFT.spi_read_write_byte(CHX);
-        y_addata[i] = SPI2_ReadWrite2Bytes();
-        WRITE(TOUCH_CS_PIN, HIGH);
-
-        OUT_WRITE(TOUCH_CS_PIN, LOW);
-        SPI_TFT.spi_read_write_byte(CHY);
-        x_addata[i] = SPI2_ReadWrite2Bytes();
-        WRITE(TOUCH_CS_PIN, HIGH);
-      #else // #if ENABLED(TOUCH_BUTTONS)
-        OUT_WRITE(TOUCH_CS_PIN, LOW);
-        W25QXX.spi_flash_read_write_byte(CHX);
-        y_addata[i] = SPI2_ReadWrite2Bytes();
-        WRITE(TOUCH_CS_PIN, HIGH);
-
-        OUT_WRITE(TOUCH_CS_PIN, LOW);
-        W25QXX.spi_flash_read_write_byte(CHY);
-        x_addata[i] = SPI2_ReadWrite2Bytes();
-        WRITE(TOUCH_CS_PIN, HIGH);
-      #endif
-
-    }
-    //#endif
-    //result = x_addata[0];
-    for (i = 0; i < times; i++)
-      for (j = i + 1; j < times; j++)
-        if (x_addata[j] > x_addata[i]) {
-          k = x_addata[j];
-          x_addata[j] = x_addata[i];
-          x_addata[i] = k;
-        }
-    if (x_addata[times / 2 - 1] - x_addata[times / 2] > 50) {
-      *X_Addata = *Y_Addata = 0;
-      return;
-    }
+  }
 
-    *X_Addata = (x_addata[times / 2 - 1] + x_addata[times / 2]) / 2;
+  for (i = 0; i < times; i++)
+    for (j = i + 1; j < times; j++)
+      if (x_addata[j] > x_addata[i]) {
+        k = x_addata[j];
+        x_addata[j] = x_addata[i];
+        x_addata[i] = k;
+      }
+  if (x_addata[times / 2 - 1] - x_addata[times / 2] > 50) {
+    *X_Addata = *Y_Addata = 0;
+    return;
+  }
 
-    //result = y_addata[0];
-    for (i = 0; i < times; i++)
-      for (j = i + 1; j < times; j++)
-        if (y_addata[j] > y_addata[i]) {
-          k = y_addata[j];
-          y_addata[j] = y_addata[i];
-          y_addata[i] = k;
-        }
+  *X_Addata = (x_addata[times / 2 - 1] + x_addata[times / 2]) / 2;
 
-    if (y_addata[times / 2 - 1] - y_addata[times / 2] > 50) {
-      *X_Addata = *Y_Addata = 0;
-      return;
-    }
+  for (i = 0; i < times; i++)
+    for (j = i + 1; j < times; j++)
+      if (y_addata[j] > y_addata[i]) {
+        k = y_addata[j];
+        y_addata[j] = y_addata[i];
+        y_addata[i] = k;
+      }
 
-    *Y_Addata = (y_addata[times / 2 - 1] + y_addata[times / 2]) / 2;
+  if (y_addata[times / 2 - 1] - y_addata[times / 2] > 50) {
+    *X_Addata = *Y_Addata = 0;
+    return;
   }
 
-  #define ADC_VALID_OFFSET  10
+  *Y_Addata = (y_addata[times / 2 - 1] + y_addata[times / 2]) / 2;
+}
+
+#define ADC_VALID_OFFSET  10
+
+uint8_t TOUCH_PressValid(uint16_t _usX, uint16_t _usY) {
+  if (   (_usX <= ADC_VALID_OFFSET) || (_usY <= ADC_VALID_OFFSET)
+      || (_usX >= 4095 - ADC_VALID_OFFSET) || (_usY >= 4095 - ADC_VALID_OFFSET)
+  ) return 0;
+  return 1;
+}
+
+static lv_coord_t last_x = 0, last_y = 0;
+bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) {
+  uint32_t tmpTime, diffTime = 0;
+
+  tmpTime = millis();
+  diffTime = getTickDiff(tmpTime, touch_time1);
+  /*Save the state and save the pressed coordinate*/
+  //data->state = TOUCH_PressValid(last_x, last_y) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
+  //if (data->state == LV_INDEV_STATE_PR)  ADS7843_Rd_Addata((u16 *)&last_x, (u16 *)&last_y);
+  //touchpad_get_xy(&last_x, &last_y);
+  /*Save the pressed coordinates and the state*/
+  if (diffTime > 10) {
+    //use marlin touch code if enabled
+    #if ENABLED(TOUCH_BUTTONS)
+      touch.getTouchPoint(reinterpret_cast<uint16_t&>(last_x), reinterpret_cast<uint16_t&>(last_y));
+    #else
+      XPT2046_Rd_Addata((uint16_t *)&last_x, (uint16_t *)&last_y);
+    #endif
+    if (TOUCH_PressValid(last_x, last_y)) {
 
-  uint8_t TOUCH_PressValid(uint16_t _usX, uint16_t _usY) {
-    if ((_usX <= ADC_VALID_OFFSET) || (_usY <= ADC_VALID_OFFSET)
-        || (_usX >= 4095 - ADC_VALID_OFFSET) || (_usY >= 4095 - ADC_VALID_OFFSET)
-        ) return 0;
+      data->state = LV_INDEV_STATE_PR;
 
-    return 1;
-  }
+      /*Set the coordinates (if released use the last pressed coordinates)*/
 
-  static lv_coord_t last_x = 0, last_y = 0;
-  bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) {
-    #if 1
-      uint32_t tmpTime, diffTime = 0;
-
-      tmpTime = millis();
-      diffTime = getTickDiff(tmpTime, touch_time1);
-      /*Save the state and save the pressed coordinate*/
-      //data->state = TOUCH_PressValid(last_x, last_y) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
-      //if (data->state == LV_INDEV_STATE_PR)  ADS7843_Rd_Addata((u16 *)&last_x, (u16 *)&last_y);
-      //touchpad_get_xy(&last_x, &last_y);
-      /*Save the pressed coordinates and the state*/
-      if (diffTime > 10) {
-        XPT2046_Rd_Addata((uint16_t *)&last_x, (uint16_t *)&last_y);
-        if (TOUCH_PressValid(last_x, last_y)) {
-
-          data->state = LV_INDEV_STATE_PR;
-
-          /*Set the coordinates (if released use the last pressed coordinates)*/
-
-          xpt2046_corr((uint16_t *)&last_x, (uint16_t *)&last_y);
-          data->point.x = last_x;
-          data->point.y = last_y;
-
-        }
-        else {
-          data->state = LV_INDEV_STATE_REL;
-        }
-        touch_time1 = tmpTime;
-      }
+      // SERIAL_ECHOLNPAIR("antes X: ", last_x, ", y: ", last_y);
+      xpt2046_corr((uint16_t *)&last_x, (uint16_t *)&last_y);
+      // SERIAL_ECHOLNPAIR("X: ", last_x, ", y: ", last_y);
+      data->point.x = last_x;
+      data->point.y = last_y;
 
-      return false; /*Return `false` because we are not buffering and no more data to read*/
-    #endif
+      last_x = 0;
+      last_y = 0;
+    }
+    else {
+      data->state = LV_INDEV_STATE_REL;
+    }
+    touch_time1 = tmpTime;
   }
 
-#endif // TFT_LITTLE_VGL_UI
+  return false; /*Return `false` because we are not buffering and no more data to read*/
+}
+
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp
index 8fe6c8cbf8..7e29714443 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp
@@ -21,7 +21,7 @@
  */
 #include "../../../../inc/MarlinConfigPre.h"
 
-#if ENABLED(TFT_LITTLE_VGL_UI)
+#if ENABLED(TFT_LVGL_UI)
 
 #include "../../../../MarlinCore.h"
 
@@ -1900,4 +1900,4 @@ void disp_language_init() {
   }
 }
 
-#endif // TFT_LITTLE_VGL_UI
+#endif // TFT_LVGL_UI
diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h
index d8933fe039..6b06bda887 100644
--- a/Marlin/src/pins/pins.h
+++ b/Marlin/src/pins/pins.h
@@ -541,9 +541,9 @@
 #elif MB(CCROBOT_MEEB_3DP)
   #include "stm32f1/pins_CCROBOT_MEEB_3DP.h"    // STM32F1                                env:STM32F103RC_meeb
 #elif MB(CHITU3D_V5)
-  #include "stm32f1/pins_CHITU3D_V5.h"          // STM32F1                                env:chitu_f103 env:chitu_v5_gpio_init
+  #include "stm32f1/pins_CHITU3D_V5.h"          // STM32F1                                env:chitu_f103 env:chitu_v5_gpio_init env:chitu_f103_lvgl
 #elif MB(CHITU3D_V6)
-  #include "stm32f1/pins_CHITU3D_V6.h"          // STM32F1                                env:chitu_f103
+  #include "stm32f1/pins_CHITU3D_V6.h"          // STM32F1                                env:chitu_f103 env:chitu_f103_lvgl
 #elif MB(CREALITY_V4)
   #include "stm32f1/pins_CREALITY_V4.h"         // STM32F1                                env:STM32F103RET6_creality
 
diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h
index 9396eb629b..d99bba8369 100644
--- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h
+++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h
@@ -142,6 +142,71 @@
   #endif
 #endif
 
+#define SPI_FLASH_SIZE 0x200000                   // 2MB
+
+#if ENABLED(TFT_LVGL_UI)
+  #define HAS_SPI_FLASH_FONT 0
+  #define HAS_GCODE_PREVIEW 1
+  #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0
+  #define HAS_LANG_SELECT_SCREEN 0
+  #define HAS_BAK_VIEW_IN_FLASH 0
+
+  //SPI 2
+  #define W25QXX_CS_PIN                     PB12
+  #define W25QXX_MOSI_PIN                   PB15
+  #define W25QXX_MISO_PIN                   PB14
+  #define W25QXX_SCK_PIN                    PB13
+
+  #define TOUCH_CS_PIN                      PB7   // SPI1_NSS
+  #define TOUCH_SCK_PIN                     PA5   // SPI1_SCK
+  #define TOUCH_MISO_PIN                    PA6   // SPI1_MISO
+  #define TOUCH_MOSI_PIN                    PA7   // SPI1_MOSI
+  // #define TOUCH_INT_PIN                   PB6
+
+  #define SPI_TFT_CS_PIN            TOUCH_CS_PIN
+  #define SPI_TFT_SCK_PIN          TOUCH_SCK_PIN
+  #define SPI_TFT_MISO_PIN        TOUCH_MISO_PIN
+  #define SPI_TFT_MOSI_PIN        TOUCH_MOSI_PIN
+  #define SPI_TFT_DC_PIN                    PB6
+  #define SPI_TFT_RST_PIN                   PF11
+
+  #define LCD_RESET_PIN                     PF11
+  #define LCD_BACKLIGHT_PIN                 PD13
+  #define FSMC_CS_PIN                       PD7
+  #define FSMC_RS_PIN                       PD11
+
+  #define LCD_USE_DMA_FSMC                        // Use DMA transfers to send data to the TFT
+  #define FSMC_DMA_DEV                      DMA2
+  #define FSMC_DMA_CHANNEL               DMA_CH5
+
+  #define LCD_FULL_PIXEL_WIDTH 480
+  #define LCD_PIXEL_OFFSET_X 48
+  #define LCD_FULL_PIXEL_HEIGHT 320
+  #define LCD_PIXEL_OFFSET_Y 48
+
+  #define LCD_PIXEL_HEIGHT 320
+  #define LCD_PIXEL_WIDTH 480
+
+  #define XPT2046_X_CALIBRATION  -12316
+  #define XPT2046_Y_CALIBRATION   8981
+  #define XPT2046_X_OFFSET        340
+  #define XPT2046_Y_OFFSET        -20
+
+  #define USE_XPT2046       1
+  #define XPT2046_XY_SWAP   0
+  #define XPT2046_X_INV     1
+  #define XPT2046_Y_INV     0
+
+  #define XPT2046_HOR_RES   480
+  #define XPT2046_VER_RES   320
+  #define XPT2046_X_MIN     140
+  #define XPT2046_Y_MIN     200
+  #define XPT2046_X_MAX     1900
+  #define XPT2046_Y_MAX     1900
+  #define XPT2046_AVG       4
+  #define XPT2046_INV       0
+#endif
+
 // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available
 // We nee to use the SPI2
 #define ENABLE_SPI2
diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h
index a82637be93..6d668bf0c5 100644
--- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h
+++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h
@@ -147,6 +147,71 @@
   #endif
 #endif
 
+#define SPI_FLASH_SIZE 0x200000                   // 2MB
+
+#if ENABLED(TFT_LVGL_UI)
+  #define HAS_SPI_FLASH_FONT 0
+  #define HAS_GCODE_PREVIEW 1
+  #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0
+  #define HAS_LANG_SELECT_SCREEN 0
+  #define HAS_BAK_VIEW_IN_FLASH 0
+
+  //SPI 2
+  #define W25QXX_CS_PIN                     PB12
+  #define W25QXX_MOSI_PIN                   PB15
+  #define W25QXX_MISO_PIN                   PB14
+  #define W25QXX_SCK_PIN                    PB13
+
+  #define TOUCH_CS_PIN                      PB7   // SPI1_NSS
+  #define TOUCH_SCK_PIN                     PA5   // SPI1_SCK
+  #define TOUCH_MISO_PIN                    PA6   // SPI1_MISO
+  #define TOUCH_MOSI_PIN                    PA7   // SPI1_MOSI
+  // #define TOUCH_INT_PIN                   PB6
+
+  #define SPI_TFT_CS_PIN            TOUCH_CS_PIN
+  #define SPI_TFT_SCK_PIN          TOUCH_SCK_PIN
+  #define SPI_TFT_MISO_PIN        TOUCH_MISO_PIN
+  #define SPI_TFT_MOSI_PIN        TOUCH_MOSI_PIN
+  #define SPI_TFT_DC_PIN                    PB6
+  #define SPI_TFT_RST_PIN                   PF11
+
+  #define LCD_RESET_PIN                     PF11
+  #define LCD_BACKLIGHT_PIN                 PD13
+  #define FSMC_CS_PIN                       PD7
+  #define FSMC_RS_PIN                       PD11
+
+  #define LCD_USE_DMA_FSMC                        // Use DMA transfers to send data to the TFT
+  #define FSMC_DMA_DEV                      DMA2
+  #define FSMC_DMA_CHANNEL               DMA_CH5
+
+  #define LCD_FULL_PIXEL_WIDTH 480
+  #define LCD_PIXEL_OFFSET_X 48
+  #define LCD_FULL_PIXEL_HEIGHT 320
+  #define LCD_PIXEL_OFFSET_Y 48
+
+  #define LCD_PIXEL_HEIGHT 320
+  #define LCD_PIXEL_WIDTH 480
+
+  #define XPT2046_X_CALIBRATION  -12316
+  #define XPT2046_Y_CALIBRATION   8981
+  #define XPT2046_X_OFFSET        340
+  #define XPT2046_Y_OFFSET        -20
+
+  #define USE_XPT2046       1
+  #define XPT2046_XY_SWAP   0
+  #define XPT2046_X_INV     1
+  #define XPT2046_Y_INV     0
+
+  #define XPT2046_HOR_RES   480
+  #define XPT2046_VER_RES   320
+  #define XPT2046_X_MIN     140
+  #define XPT2046_Y_MIN     200
+  #define XPT2046_X_MAX     1900
+  #define XPT2046_Y_MAX     1900
+  #define XPT2046_AVG       4
+  #define XPT2046_INV       0
+#endif
+
 // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available
 // so SPI2 is required.
 #define ENABLE_SPI2
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h
index 2b9010f889..a86a4d0719 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h
@@ -231,7 +231,7 @@
 
   #endif // HAS_SPI_LCD
 
-#elif ENABLED(TFT_LITTLE_VGL_UI)
+#elif ENABLED(TFT_LVGL_UI)
 
   #define FSMC_CS_PIN                       PD7   // NE4
   #define FSMC_RS_PIN                       PD11  // A0
diff --git a/platformio.ini b/platformio.ini
index 1f5385ca51..f0b71d439e 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -267,7 +267,7 @@ build_flags    = ${common.build_flags} -std=gnu++17 -Wno-register
 build_unflags  = -std=gnu++11
 src_filter     = ${common.default_src_filter} +<src/HAL/SAMD51>
 lib_deps       = ${common.lib_deps}
-  SoftwareSerialM=https://github.com/FYSETC/SoftwareSerialM/archive/master.zip
+  SoftwareSerialM
   Adafruit_SPIFlash=https://github.com/adafruit/Adafruit_SPIFlash/archive/master.zip
 debug_tool     = jlink
 
@@ -346,7 +346,7 @@ lib_ignore    =
   Adafruit NeoPixel
   SPI
 lib_deps      = ${common.lib_deps}
-  SoftwareSerialM=https://github.com/FYSETC/SoftwareSerialM/archive/master.zip
+  SoftwareSerialM
 
 #
 # STM32F103RC
@@ -385,7 +385,7 @@ lib_deps          =
   LiquidTWI2@1.2.7
   Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use
   SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip
-  SoftwareSerialM=https://github.com/FYSETC/SoftwareSerialM/archive/master.zip
+  SoftwareSerialM
   USBComposite for STM32F1@0.91
 lib_ignore        = SPI
 debug_tool        = stlink
@@ -640,7 +640,7 @@ build_unflags = -std=gnu++11
 extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_nano35.py
 src_filter    = ${common.default_src_filter} +<src/HAL/STM32F1>
 lib_deps      = ${common.lib_deps}
-  SoftwareSerialM=https://github.com/FYSETC/SoftwareSerialM/archive/master.zip
+  SoftwareSerialM
   MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip
 lib_ignore    = Adafruit NeoPixel, SPI
 
@@ -691,6 +691,17 @@ platform      = ${common_stm32f1.platform}
 extends       = env:chitu_f103
 build_flags   = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX
 
+#
+# Chitu boards like Tronxy X5SA (STM32F103ZET6) using TFT LVGL UI
+#
+[env:chitu_f103_lvgl]
+platform      = ${common_stm32f1.platform}
+extends       = env:chitu_f103
+src_filter    = ${common.default_src_filter} +<src/HAL/STM32F1>
+lib_deps      = ${common.lib_deps}
+   SoftwareSerialM
+   MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip
+
 #
 # Creality (STM32F103RET6)
 #
-- 
GitLab