Browse Source

MKS Robin ILI9328 TFT support (#16401)

Alexander Gavrilenko 4 years ago
parent
commit
c6f7ea9f22

+ 11
- 1
Marlin/src/HAL/HAL_STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp View File

@@ -49,6 +49,7 @@
49 49
 void LCD_IO_Init(uint8_t cs, uint8_t rs);
50 50
 void LCD_IO_WriteData(uint16_t RegValue);
51 51
 void LCD_IO_WriteReg(uint16_t Reg);
52
+uint16_t LCD_IO_ReadData(uint16_t RegValue);
52 53
 uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize);
53 54
 #ifdef LCD_USE_DMA_FSMC
54 55
   void LCD_IO_WriteMultiple(uint16_t data, uint32_t count);
@@ -80,7 +81,9 @@ uint8_t u8g_com_stm32duino_fsmc_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, voi
80 81
       u8g_Delay(50);
81 82
 
82 83
       if (arg_ptr)
83
-        *((uint32_t *)arg_ptr) = LCD_IO_ReadData(LCD_READ_ID, 3);
84
+        *((uint32_t *)arg_ptr) = LCD_IO_ReadData(0x0000);
85
+        if (*((uint32_t *)arg_ptr) == 0)
86
+          *((uint32_t *)arg_ptr) = (LCD_READ_ID << 24) | LCD_IO_ReadData(LCD_READ_ID, 3);
84 87
       isCommand = 0;
85 88
       break;
86 89
 
@@ -265,6 +268,13 @@ void LCD_IO_WriteReg(uint16_t Reg) {
265 268
   __DSB();
266 269
 }
267 270
 
271
+uint16_t LCD_IO_ReadData(uint16_t RegValue) {
272
+  LCD->REG = RegValue;
273
+  __DSB();
274
+
275
+  return LCD->RAM;
276
+}
277
+
268 278
 uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) {
269 279
   volatile uint32_t data;
270 280
   LCD->REG = RegValue;

+ 285
- 120
Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp View File

@@ -65,6 +65,8 @@
65 65
 #include <string.h>
66 66
 
67 67
 #if ENABLED(LCD_USE_DMA_FSMC)
68
+  extern void LCD_IO_WriteReg(uint16_t Reg);
69
+  extern void LCD_IO_WriteData(uint16_t RegValue);
68 70
   extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length);
69 71
   extern void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length);
70 72
   extern void LCD_IO_WaitSequence_Async();
@@ -80,10 +82,6 @@
80 82
 #define X_HI (X_LO + 2 * WIDTH  - 1)
81 83
 #define Y_HI (Y_LO + 2 * HEIGHT - 1)
82 84
 
83
-#define LCD_COLUMN      0x2A   /* Colomn address register */
84
-#define LCD_ROW         0x2B   /* Row address register */
85
-#define LCD_WRITE_RAM   0x2C
86
-
87 85
 // see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html
88 86
 
89 87
 #define COLOR_BLACK       0x0000  // #000000
@@ -133,113 +131,254 @@
133 131
 
134 132
 static uint32_t lcd_id = 0;
135 133
 
136
-#define U8G_ESC_DATA(x) (uint8_t)(x >> 8), (uint8_t)(x & 0xFF)
134
+#define ST7789V_CASET       0x2A   /* Column address register */
135
+#define ST7789V_RASET       0x2B   /* Row address register */
136
+#define ST7789V_WRITE_RAM   0x2C   /* Write data to GRAM */
137 137
 
138
-static const uint8_t page_first_sequence[] = {
139
-  U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(X_LO), U8G_ESC_DATA(X_HI),
140
-  U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), U8G_ESC_DATA(Y_LO), U8G_ESC_DATA(Y_HI),
141
-  U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1),
142
-  U8G_ESC_END
143
-};
144 138
 
145
-static const uint8_t clear_screen_sequence[] = {
146
-  U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), 0x00, 0x00, U8G_ESC_DATA(LCD_FULL_PIXEL_WIDTH),
147
-  U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), 0x00, 0x00, U8G_ESC_DATA(LCD_FULL_PIXEL_HEIGHT),
148
-  U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1),
149
-  U8G_ESC_END
150
-};
139
+/* Mind the mess: with landscape screen orientation 'Horizontal' is Y and 'Vertical' is X */
140
+#define ILI9328_HASET       0x20   /* Horizontal GRAM address register (0-255) */
141
+#define ILI9328_VASET       0x21   /* Vertical GRAM address register (0-511)*/
142
+#define ILI9328_WRITE_RAM   0x22   /* Write data to GRAM */
151 143
 
152
-#if ENABLED(TOUCH_BUTTONS)
144
+#define ILI9328_HASTART     0x50   /* Horizontal address start position (0-255) */
145
+#define ILI9328_HAEND       0x51   /* Horizontal address end position (0-255) */
146
+#define ILI9328_VASTART     0x52   /* Vertical address start position (0-511) */
147
+#define ILI9328_VAEND       0x53   /* Vertical address end position (0-511) */
153 148
 
154
-  static const uint8_t separation_line_sequence_left[] = {
155
-    U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(10), U8G_ESC_DATA(159),
156
-    U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), U8G_ESC_DATA(170), U8G_ESC_DATA(173),
157
-    U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1),
158
-    U8G_ESC_END
159
-  };
160 149
 
161
-  static const uint8_t separation_line_sequence_right[] = {
162
-    U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(160), U8G_ESC_DATA(309),
163
-    U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), U8G_ESC_DATA(170), U8G_ESC_DATA(173),
164
-    U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1),
165
-    U8G_ESC_END
166
-  };
150
+static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) {
151
+  #ifdef LCD_USE_DMA_FSMC
152
+    LCD_IO_WriteReg(ILI9328_HASTART);
153
+    LCD_IO_WriteData(Ymin);
154
+    LCD_IO_WriteReg(ILI9328_HAEND);
155
+    LCD_IO_WriteData(Ymax);
156
+    LCD_IO_WriteReg(ILI9328_VASTART);
157
+    LCD_IO_WriteData(Xmin);
158
+    LCD_IO_WriteReg(ILI9328_VAEND);
159
+    LCD_IO_WriteData(Xmax);
160
+
161
+    LCD_IO_WriteReg(ILI9328_HASET);
162
+    LCD_IO_WriteData(Ymin);
163
+    LCD_IO_WriteReg(ILI9328_VASET);
164
+    LCD_IO_WriteData(Xmin);
165
+
166
+    LCD_IO_WriteReg(ILI9328_WRITE_RAM);
167
+  #else
168
+    u8g_SetAddress(u8g, dev, 0);
169
+
170
+    u8g_WriteByte(u8g, dev, ILI9328_HASTART);
171
+    u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Ymin);
172
+    u8g_WriteByte(u8g, dev, ILI9328_HAEND);
173
+    u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Ymax);
174
+    u8g_WriteByte(u8g, dev, ILI9328_VASTART);
175
+    u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Xmin);
176
+    u8g_WriteByte(u8g, dev, ILI9328_VAEND);
177
+    u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Xmax);
178
+
179
+    u8g_WriteByte(u8g, dev, ILI9328_HASET);
180
+    u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Ymin);
181
+    u8g_WriteByte(u8g, dev, ILI9328_VASET);
182
+    u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Xmin);
183
+
184
+    u8g_WriteByte(u8g, dev, ILI9328_WRITE_RAM);
185
+    u8g_SetAddress(u8g, dev, 1);
186
+  #endif
187
+}
167 188
 
168
-  static const uint8_t buttonD_sequence[] = {
169
-    U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(14), U8G_ESC_DATA(77),
170
-    U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), U8G_ESC_DATA(185), U8G_ESC_DATA(224),
171
-    U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1),
172
-    U8G_ESC_END
173
-  };
189
+static void setWindow_st7789v(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) {
190
+  #ifdef LCD_USE_DMA_FSMC
191
+    LCD_IO_WriteReg(ST7789V_CASET);
192
+    LCD_IO_WriteData((Xmin >> 8) & 0xFF);
193
+    LCD_IO_WriteData(Xmin & 0xFF);
194
+    LCD_IO_WriteData((Xmax >> 8) & 0xFF);
195
+    LCD_IO_WriteData(Xmax & 0xFF);
196
+
197
+    LCD_IO_WriteReg(ST7789V_RASET);
198
+    LCD_IO_WriteData((Ymin >> 8) & 0xFF);
199
+    LCD_IO_WriteData(Ymin & 0xFF);
200
+    LCD_IO_WriteData((Ymax >> 8) & 0xFF);
201
+    LCD_IO_WriteData(Ymax & 0xFF);
202
+
203
+    LCD_IO_WriteReg(ST7789V_WRITE_RAM);
204
+  #else
205
+    u8g_SetAddress(u8g, dev, 0); u8g_WriteByte(u8g, dev, ST7789V_CASET); u8g_SetAddress(u8g, dev, 1);
206
+    u8g_WriteByte(u8g, dev, (Xmin >> 8) & 0xFF);
207
+    u8g_WriteByte(u8g, dev, Xmin & 0xFF);
208
+    u8g_WriteByte(u8g, dev, (Xmax >> 8) & 0xFF);
209
+    u8g_WriteByte(u8g, dev, Xmax & 0xFF);
210
+
211
+    u8g_SetAddress(u8g, dev, 0); u8g_WriteByte(u8g, dev, ST7789V_RASET); u8g_SetAddress(u8g, dev, 1);
212
+    u8g_WriteByte(u8g, dev, (Ymin >> 8) & 0xFF);
213
+    u8g_WriteByte(u8g, dev, Ymin & 0xFF);
214
+    u8g_WriteByte(u8g, dev, (Ymax >> 8) & 0xFF);
215
+    u8g_WriteByte(u8g, dev, Ymax & 0xFF);
216
+
217
+    u8g_SetAddress(u8g, dev, 0); u8g_WriteByte(u8g, dev, ST7789V_WRITE_RAM); u8g_SetAddress(u8g, dev, 1);
218
+  #endif
219
+}
174 220
 
175
-  static const uint8_t buttonA_sequence[] = {
176
-    U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(90), U8G_ESC_DATA(153),
177
-    U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), U8G_ESC_DATA(185), U8G_ESC_DATA(224),
178
-    U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1),
179
-    U8G_ESC_END
180
-  };
221
+static void setWindow_none(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) {}
222
+void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) = setWindow_none;
181 223
 
182
-  static const uint8_t buttonB_sequence[] = {
183
-    U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(166), U8G_ESC_DATA(229),
184
-    U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), U8G_ESC_DATA(185), U8G_ESC_DATA(224),
185
-    U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1),
186
-    U8G_ESC_END
187
-  };
188 224
 
189
-  static const uint8_t buttonC_sequence[] = {
190
-    U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(242), U8G_ESC_DATA(305),
191
-    U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), U8G_ESC_DATA(185), U8G_ESC_DATA(224),
192
-    U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1),
193
-    U8G_ESC_END
194
-  };
225
+#define ESC_REG(x)      0xFFFF, 0x00FF & (uint16_t)x
226
+#define ESC_DELAY(x)    0xFFFF, 0x8000 | (x & 0x7FFF)
227
+#define ESC_END         0xFFFF, 0x7FFF
228
+#define ESC_FFFF        0xFFFF, 0xFFFF
195 229
 
230
+#ifdef LCD_USE_DMA_FSMC
231
+  void writeEscSequence(const uint16_t *sequence) {
232
+    uint16_t data;
233
+    for (;;) {
234
+      data = *sequence++;
235
+      if (data != 0xFFFF) {
236
+        LCD_IO_WriteData(data);
237
+        continue;
238
+      }
239
+      data = *sequence++;
240
+      if (data == 0x7FFF) return;
241
+      if (data == 0xFFFF) {
242
+        LCD_IO_WriteData(data);
243
+      } else if (data & 0x8000) {
244
+        delay(data & 0x7FFF);
245
+      } else if ((data & 0xFF00) == 0) {
246
+        LCD_IO_WriteReg(data);
247
+      }
248
+    }
249
+  }
250
+#else
251
+  void writeEscSequence8(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) {
252
+    uint16_t data;
253
+    u8g_SetAddress(u8g, dev, 1);
254
+    for (;;) {
255
+      data = *sequence++;
256
+      if (data != 0xFFFF) {
257
+        u8g_WriteByte(u8g, dev, data & 0xFF);
258
+        continue;
259
+      }
260
+      data = *sequence++;
261
+      if (data == 0x7FFF) return;
262
+      if (data == 0xFFFF) {
263
+        u8g_WriteByte(u8g, dev, data & 0xFF);
264
+      } else if (data & 0x8000) {
265
+        delay(data & 0x7FFF);
266
+      } else if ((data & 0xFF00) == 0) {
267
+        u8g_SetAddress(u8g, dev, 0);
268
+        u8g_WriteByte(u8g, dev, data & 0xFF);
269
+        u8g_SetAddress(u8g, dev, 1);
270
+      }
271
+    }
272
+  }
273
+
274
+  void writeEscSequence16(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) {
275
+    uint16_t data;
276
+    u8g_SetAddress(u8g, dev, 0);
277
+    for (;;) {
278
+      data = *sequence++;
279
+      if (data != 0xFFFF) {
280
+        u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&data);
281
+        continue;
282
+      }
283
+      data = *sequence++;
284
+      if (data == 0x7FFF) return;
285
+      if (data == 0xFFFF) {
286
+        u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&data);
287
+      } else if (data & 0x8000) {
288
+        delay(data & 0x7FFF);
289
+      } else if ((data & 0xFF00) == 0) {
290
+        u8g_WriteByte(u8g, dev, data & 0xFF);
291
+      }
292
+    }
293
+    u8g_SetAddress(u8g, dev, 1);
294
+  }
196 295
 #endif
197 296
 
198
-static const uint8_t st7789v_init_sequence[] = { // 0x8552 - ST7789V
199
-  U8G_ESC_ADR(0),
200
-  0x10,
201
-  U8G_ESC_DLY(10),
202
-  0x01,
203
-  U8G_ESC_DLY(100), U8G_ESC_DLY(100),
204
-  0x11,
205
-  U8G_ESC_DLY(120),
206
-  0x36, U8G_ESC_ADR(1), 0xA0,
207
-  U8G_ESC_ADR(0), 0x3A, U8G_ESC_ADR(1), 0x05,
208
-  U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), 0x00, 0x00, 0x01, 0x3F,
209
-  U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), 0x00, 0x00, 0x00, 0xEF,
210
-  U8G_ESC_ADR(0), 0xB2, U8G_ESC_ADR(1), 0x0C, 0x0C, 0x00, 0x33, 0x33,
211
-  U8G_ESC_ADR(0), 0xB7, U8G_ESC_ADR(1), 0x35,
212
-  U8G_ESC_ADR(0), 0xBB, U8G_ESC_ADR(1), 0x1F,
213
-  U8G_ESC_ADR(0), 0xC0, U8G_ESC_ADR(1), 0x2C,
214
-  U8G_ESC_ADR(0), 0xC2, U8G_ESC_ADR(1), 0x01, 0xC3,
215
-  U8G_ESC_ADR(0), 0xC4, U8G_ESC_ADR(1), 0x20,
216
-  U8G_ESC_ADR(0), 0xC6, U8G_ESC_ADR(1), 0x0F,
217
-  U8G_ESC_ADR(0), 0xD0, U8G_ESC_ADR(1), 0xA4, 0xA1,
218
-  U8G_ESC_ADR(0), 0xE0, U8G_ESC_ADR(1), 0xD0, 0x08, 0x11, 0x08, 0x0C, 0x15, 0x39, 0x33, 0x50, 0x36, 0x13, 0x14, 0x29, 0x2D,
219
-  U8G_ESC_ADR(0), 0xE1, U8G_ESC_ADR(1), 0xD0, 0x08, 0x10, 0x08, 0x06, 0x06, 0x39, 0x44, 0x51, 0x0B, 0x16, 0x14, 0x2F, 0x31,
220
-  U8G_ESC_ADR(0), 0x29, 0x11, 0x35, U8G_ESC_ADR(1), 0x00,
221
-  U8G_ESC_END
297
+static const uint16_t st7789v_init[] = {
298
+  ESC_REG(0x0010), ESC_DELAY(10),
299
+  ESC_REG(0x0001), ESC_DELAY(200),
300
+  ESC_REG(0x0011), ESC_DELAY(120),
301
+  ESC_REG(0x0036), 0x00A0,
302
+  ESC_REG(0x003A), 0x0055,
303
+  ESC_REG(0x002A), 0x0000, 0x0000, 0x0001, 0x003F,
304
+  ESC_REG(0x002B), 0x0000, 0x0000, 0x0000, 0x00EF,
305
+  ESC_REG(0x00B2), 0x000C, 0x000C, 0x0000, 0x0033, 0x0033,
306
+  ESC_REG(0x00B7), 0x0035,
307
+  ESC_REG(0x00BB), 0x001F,
308
+  ESC_REG(0x00C0), 0x002C,
309
+  ESC_REG(0x00C2), 0x0001, 0x00C3,
310
+  ESC_REG(0x00C4), 0x0020,
311
+  ESC_REG(0x00C6), 0x000F,
312
+  ESC_REG(0x00D0), 0x00A4, 0x00A1,
313
+  ESC_REG(0x0029),
314
+  ESC_REG(0x0011),
315
+  ESC_END
222 316
 };
223 317
 
224
-static const uint8_t ili9341_init_sequence[] = { // 0x9341 - ILI9341
225
-  U8G_ESC_ADR(0),
226
-  0x10,
227
-  U8G_ESC_DLY(10),
228
-  0x01,
229
-  U8G_ESC_DLY(100), U8G_ESC_DLY(100),
230
-  0x36, U8G_ESC_ADR(1), 0xE8,
231
-  U8G_ESC_ADR(0), 0x3A, U8G_ESC_ADR(1), 0x55,
232
-  U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), 0x00, 0x00, 0x01, 0x3F,
233
-  U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), 0x00, 0x00, 0x00, 0xEF,
234
-  U8G_ESC_ADR(0), 0xC5, U8G_ESC_ADR(1), 0x3E, 0x28,
235
-  U8G_ESC_ADR(0), 0xC7, U8G_ESC_ADR(1), 0x86,
236
-  U8G_ESC_ADR(0), 0xB1, U8G_ESC_ADR(1), 0x00, 0x18,
237
-  U8G_ESC_ADR(0), 0xC0, U8G_ESC_ADR(1), 0x23,
238
-  U8G_ESC_ADR(0), 0xC1, U8G_ESC_ADR(1), 0x10,
239
-  U8G_ESC_ADR(0), 0x29,
240
-  U8G_ESC_ADR(0), 0x11,
241
-  U8G_ESC_DLY(100),
242
-  U8G_ESC_END
318
+static const uint16_t ili9328_init[] = {
319
+  ESC_REG(0x0001), 0x0100,
320
+  ESC_REG(0x0002), 0x0400,
321
+  ESC_REG(0x0003), 0x1038,
322
+  ESC_REG(0x0004), 0x0000,
323
+  ESC_REG(0x0008), 0x0202,
324
+  ESC_REG(0x0009), 0x0000,
325
+  ESC_REG(0x000A), 0x0000,
326
+  ESC_REG(0x000C), 0x0000,
327
+  ESC_REG(0x000D), 0x0000,
328
+  ESC_REG(0x000F), 0x0000,
329
+  ESC_REG(0x0010), 0x0000,
330
+  ESC_REG(0x0011), 0x0007,
331
+  ESC_REG(0x0012), 0x0000,
332
+  ESC_REG(0x0013), 0x0000,
333
+  ESC_REG(0x0007), 0x0001,
334
+  ESC_DELAY(200),
335
+  ESC_REG(0x0010), 0x1690,
336
+  ESC_REG(0x0011), 0x0227,
337
+  ESC_DELAY(50),
338
+  ESC_REG(0x0012), 0x008C,
339
+  ESC_DELAY(50),
340
+  ESC_REG(0x0013), 0x1500,
341
+  ESC_REG(0x0029), 0x0004,
342
+  ESC_REG(0x002B), 0x000D,
343
+  ESC_DELAY(50),
344
+  ESC_REG(0x0050), 0x0000,
345
+  ESC_REG(0x0051), 0x00EF,
346
+  ESC_REG(0x0052), 0x0000,
347
+  ESC_REG(0x0053), 0x013F,
348
+  ESC_REG(0x0020), 0x0000,
349
+  ESC_REG(0x0021), 0x0000,
350
+  ESC_REG(0x0060), 0x2700,
351
+  ESC_REG(0x0061), 0x0001,
352
+  ESC_REG(0x006A), 0x0000,
353
+  ESC_REG(0x0080), 0x0000,
354
+  ESC_REG(0x0081), 0x0000,
355
+  ESC_REG(0x0082), 0x0000,
356
+  ESC_REG(0x0083), 0x0000,
357
+  ESC_REG(0x0084), 0x0000,
358
+  ESC_REG(0x0085), 0x0000,
359
+  ESC_REG(0x0090), 0x0010,
360
+  ESC_REG(0x0092), 0x0600,
361
+  ESC_REG(0x0007), 0x0133,
362
+  ESC_REG(0x0022),
363
+  ESC_END
364
+};
365
+
366
+static const uint16_t ili9341_init[] = {
367
+  ESC_REG(0x0010), ESC_DELAY(10),
368
+  ESC_REG(0x0001), ESC_DELAY(200),
369
+  ESC_REG(0x0036), 0x00E8,
370
+  ESC_REG(0x003A), 0x0055,
371
+  ESC_REG(0x002A), 0x0000, 0x0000, 0x0001, 0x003F,
372
+  ESC_REG(0x002B), 0x0000, 0x0000, 0x0000, 0x00EF,
373
+  ESC_REG(0x00C5), 0x003E, 0x0028,
374
+  ESC_REG(0x00C7), 0x0086,
375
+  ESC_REG(0x00B1), 0x0000, 0x0018,
376
+  ESC_REG(0x00C0), 0x0023,
377
+  ESC_REG(0x00C1), 0x0010,
378
+  ESC_REG(0x0029),
379
+  ESC_REG(0x0011),
380
+  ESC_DELAY(100),
381
+  ESC_END
243 382
 };
244 383
 
245 384
 #if ENABLED(TOUCH_BUTTONS)
@@ -439,23 +578,55 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
439 578
   switch (msg) {
440 579
     case U8G_DEV_MSG_INIT:
441 580
       dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, &lcd_id);
442
-      if (lcd_id == 0x040404) return 0; // No connected display on FSMC
443
-      if (lcd_id == 0xFFFFFF) return 0; // No connected display on SPI
444 581
 
445
-      if ((lcd_id & 0xFFFF) == 0x8552)  // ST7789V
446
-        u8g_WriteEscSeqP(u8g, dev, st7789v_init_sequence);
447
-      if ((lcd_id & 0xFFFF) == 0x9341)  // ILI9341
448
-        u8g_WriteEscSeqP(u8g, dev, ili9341_init_sequence);
582
+      switch(lcd_id & 0xFFFF) {
583
+        case 0x8552:   // ST7789V
584
+          #ifdef LCD_USE_DMA_FSMC
585
+            writeEscSequence(st7789v_init);
586
+          #else
587
+            writeEscSequence8(u8g, dev, st7789v_init);
588
+          #endif
589
+          setWindow = setWindow_st7789v;
590
+          break;
591
+        case 0x9328:  // ILI9328
592
+          #ifdef LCD_USE_DMA_FSMC
593
+            writeEscSequence(ili9328_init);
594
+          #else
595
+            writeEscSequence16(u8g, dev, ili9328_init);
596
+          #endif
597
+          setWindow = setWindow_ili9328;
598
+          break;
599
+        case 0x9341:   // ILI9341
600
+          #ifdef LCD_USE_DMA_FSMC
601
+            writeEscSequence(ili9341_init);
602
+          #else
603
+            writeEscSequence8(u8g, dev, ili9341_init);
604
+          #endif
605
+          setWindow = setWindow_st7789v;
606
+          break;
607
+        case 0x0404:  // No connected display on FSMC
608
+          lcd_id = 0;
609
+          return 0;
610
+        case 0xFFFF:  // No connected display on SPI
611
+          lcd_id = 0;
612
+          return 0;
613
+        default:
614
+          if (lcd_id && 0xFF000000)
615
+            setWindow = setWindow_st7789v;
616
+          else
617
+            setWindow = setWindow_ili9328;
618
+          break;
619
+      }
449 620
 
450 621
       if (preinit) {
451 622
         preinit = false;
452 623
         return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
453 624
       }
454 625
 
455
-      // Clear Screen Sequence
456
-      u8g_WriteEscSeqP(u8g, dev, clear_screen_sequence);
626
+      // Clear Screen
627
+      setWindow(u8g, dev, 0, 0, LCD_FULL_PIXEL_WIDTH - 1, LCD_FULL_PIXEL_HEIGHT - 1);
457 628
       #ifdef LCD_USE_DMA_FSMC
458
-        LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, (320*240));
629
+        LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, LCD_FULL_PIXEL_WIDTH * LCD_FULL_PIXEL_HEIGHT);
459 630
       #else
460 631
         memset2(buffer, TFT_MARLINBG_COLOR, 160);
461 632
         for (uint16_t i = 0; i < 960; i++)
@@ -465,31 +636,25 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
465 636
       // bottom line and buttons
466 637
       #if ENABLED(TOUCH_BUTTONS)
467 638
 
639
+        setWindow(u8g, dev, 10, 170, 309, 171);
468 640
         #ifdef LCD_USE_DMA_FSMC
469
-          u8g_WriteEscSeqP(u8g, dev, separation_line_sequence_left);
470
-          LCD_IO_WriteMultiple(TFT_DISABLED_COLOR, 300);
471
-          u8g_WriteEscSeqP(u8g, dev, separation_line_sequence_right);
472
-          LCD_IO_WriteMultiple(TFT_DISABLED_COLOR, 300);
641
+          LCD_IO_WriteMultiple(TFT_DISABLED_COLOR, 600);
473 642
         #else
474 643
           memset2(buffer, TFT_DISABLED_COLOR, 150);
475
-          u8g_WriteEscSeqP(u8g, dev, separation_line_sequence_left);
476
-          for (uint8_t i = 4; i--;)
477
-            u8g_WriteSequence(u8g, dev, 150, (uint8_t *)buffer);
478
-          u8g_WriteEscSeqP(u8g, dev, separation_line_sequence_right);
479
-          for (uint8_t i = 4; i--;)
644
+          for (uint8_t i = 8; i--;)
480 645
             u8g_WriteSequence(u8g, dev, 150, (uint8_t *)buffer);
481 646
         #endif
482 647
 
483
-        u8g_WriteEscSeqP(u8g, dev, buttonD_sequence);
648
+        setWindow(u8g, dev, 14, 185,  77, 224);
484 649
         drawImage(buttonD, u8g, dev, 32, 20, TFT_BTCANCEL_COLOR);
485 650
 
486
-        u8g_WriteEscSeqP(u8g, dev, buttonA_sequence);
651
+        setWindow(u8g, dev, 90, 185, 153, 224);
487 652
         drawImage(buttonA, u8g, dev, 32, 20, TFT_BTARROWS_COLOR);
488 653
 
489
-        u8g_WriteEscSeqP(u8g, dev, buttonB_sequence);
654
+        setWindow(u8g, dev, 166, 185, 229, 224);
490 655
         drawImage(buttonB, u8g, dev, 32, 20, TFT_BTARROWS_COLOR);
491 656
 
492
-        u8g_WriteEscSeqP(u8g, dev, buttonC_sequence);
657
+        setWindow(u8g, dev, 242, 185, 305, 224);
493 658
         drawImage(buttonC, u8g, dev, 32, 20, TFT_BTOKMENU_COLOR);
494 659
       #endif // TOUCH_BUTTONS
495 660
 
@@ -499,7 +664,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
499 664
 
500 665
     case U8G_DEV_MSG_PAGE_FIRST:
501 666
       page = 0;
502
-      u8g_WriteEscSeqP(u8g, dev, page_first_sequence);
667
+      setWindow(u8g, dev, X_LO, Y_LO, X_HI, Y_HI);
503 668
       break;
504 669
 
505 670
     case U8G_DEV_MSG_PAGE_NEXT:

+ 2
- 1
Marlin/src/pins/stm32/pins_MKS_ROBIN.h View File

@@ -112,7 +112,8 @@
112 112
 
113 113
 /**
114 114
  * Note: MKS Robin TFT screens use various TFT controllers
115
- * Supported screens are based on the ILI9341 and ST7789V (320x240), ILI9328 and 9488 are not.
115
+ * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240)
116
+ * ILI9488 is not supported
116 117
  * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp
117 118
  *
118 119
  * If the screen stays white, disable 'LCD_RESET_PIN'

Loading…
Cancel
Save