|
@@ -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:
|