Kaynağa Gözat

SPI Emulated DOGM (like FSMC_GRAPHICAL_TFT, but SPI) (#18817)

Victor Oliveira 3 yıl önce
ebeveyn
işleme
38ce5966e1
No account linked to committer's email address

+ 10
- 4
Marlin/Configuration.h Dosyayı Görüntüle

@@ -2157,6 +2157,12 @@
2157 2157
 //#define FSMC_GRAPHICAL_TFT
2158 2158
 
2159 2159
 //
2160
+// SPI display (MKS Robin Nano V2.0, MKS Gen L V2.0)
2161
+// Upscaled 128x64 Marlin UI
2162
+//
2163
+//#define SPI_GRAPHICAL_TFT
2164
+
2165
+//
2160 2166
 // TFT LVGL UI
2161 2167
 //
2162 2168
 // Using default MKS icons and fonts from: https://git.io/JJvzK
@@ -2189,10 +2195,10 @@
2189 2195
   #define BUTTON_DELAY_EDIT  50 // (ms) Button repeat delay for edit screens
2190 2196
   #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus
2191 2197
 
2192
-  #define XPT2046_X_CALIBRATION   12316
2193
-  #define XPT2046_Y_CALIBRATION  -8981
2194
-  #define XPT2046_X_OFFSET       -43
2195
-  #define XPT2046_Y_OFFSET        257
2198
+  //#define XPT2046_X_CALIBRATION 12316
2199
+  //#define XPT2046_Y_CALIBRATION -8981
2200
+  //#define XPT2046_X_OFFSET        -43
2201
+  //#define XPT2046_Y_OFFSET        257
2196 2202
 #endif
2197 2203
 
2198 2204
 //

+ 3
- 2
Marlin/Configuration_adv.h Dosyayı Görüntüle

@@ -1509,9 +1509,10 @@
1509 1509
 #endif
1510 1510
 
1511 1511
 //
1512
-// FSMC Graphical TFT
1512
+// FSMC / SPI Graphical TFT
1513 1513
 //
1514
-#if ENABLED(FSMC_GRAPHICAL_TFT)
1514
+#if TFT_SCALED_DOGLCD
1515
+  //#define GRAPHICAL_TFT_ROTATE_180
1515 1516
   //#define TFT_MARLINUI_COLOR 0xFFFF // White
1516 1517
   //#define TFT_MARLINBG_COLOR 0x0000 // Black
1517 1518
   //#define TFT_DISABLED_COLOR 0x0003 // Almost black

+ 2
- 0
Marlin/src/HAL/STM32F1/SPI.h Dosyayı Görüntüle

@@ -208,6 +208,8 @@ public:
208 208
    */
209 209
   void setDataSize(uint32_t ds);
210 210
 
211
+  uint32_t getDataSize() { return _currentSetting->dataSize; }
212
+
211 213
   /* Victor Perez 2017. Added to set and clear callback functions for callback
212 214
    * on DMA transfer completion.
213 215
    * onReceive used to set the callback in case of dmaTransfer (tx/rx), once rx is completed

+ 236
- 0
Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp Dosyayı Görüntüle

@@ -0,0 +1,236 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
17
+ *
18
+ */
19
+#ifdef __STM32F1__
20
+
21
+#include "../../../inc/MarlinConfig.h"
22
+
23
+#if BOTH(HAS_GRAPHICAL_LCD, SPI_GRAPHICAL_TFT) && DISABLED(FORCE_SOFT_SPI)
24
+
25
+#include "../HAL.h"
26
+#include <U8glib.h>
27
+#include <SPI.h>
28
+
29
+#define SPI_TFT_CS_H  OUT_WRITE(SPI_TFT_CS_PIN, HIGH)
30
+#define SPI_TFT_CS_L  OUT_WRITE(SPI_TFT_CS_PIN, LOW)
31
+
32
+#define SPI_TFT_DC_H  OUT_WRITE(SPI_TFT_DC_PIN, HIGH)
33
+#define SPI_TFT_DC_L  OUT_WRITE(SPI_TFT_DC_PIN, LOW)
34
+
35
+#define SPI_TFT_RST_H OUT_WRITE(SPI_TFT_RST_PIN, HIGH)
36
+#define SPI_TFT_RST_L OUT_WRITE(SPI_TFT_RST_PIN, LOW)
37
+
38
+#define SPI_TFT_BLK_H OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH)
39
+#define SPI_TFT_BLK_L OUT_WRITE(LCD_BACKLIGHT_PIN, LOW)
40
+
41
+void LCD_IO_Init(uint8_t cs, uint8_t rs);
42
+void LCD_IO_WriteData(uint16_t RegValue);
43
+void LCD_IO_WriteReg(uint16_t Reg);
44
+uint16_t LCD_IO_ReadData(uint16_t RegValue);
45
+uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize);
46
+#ifdef LCD_USE_DMA_SPI
47
+  void LCD_IO_WriteMultiple(uint16_t data, uint32_t count);
48
+  void LCD_IO_WriteSequence(uint16_t *data, uint16_t length);
49
+#endif
50
+
51
+void LCD_WR_REG(uint8_t cmd) {
52
+  SPI_TFT_CS_L;
53
+  SPI_TFT_DC_L;
54
+  SPI.send(cmd);
55
+  SPI_TFT_CS_H;
56
+}
57
+void LCD_WR_DATA(uint8_t data) {
58
+  SPI_TFT_CS_L;
59
+  SPI_TFT_DC_H;
60
+  SPI.send(data);
61
+  SPI_TFT_CS_H;
62
+}
63
+
64
+void spi1Init(uint8_t spiRate) {
65
+  SPI_TFT_CS_H;
66
+
67
+  /**
68
+   * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz
69
+   * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1
70
+   * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2
71
+   */
72
+  uint8_t clock;
73
+  switch (spiRate) {
74
+    case SPI_FULL_SPEED:    clock = SPI_CLOCK_DIV4;  break;
75
+    case SPI_HALF_SPEED:    clock = SPI_CLOCK_DIV4; break;
76
+    case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break;
77
+    case SPI_EIGHTH_SPEED:  clock = SPI_CLOCK_DIV16; break;
78
+    case SPI_SPEED_5:       clock = SPI_CLOCK_DIV32; break;
79
+    case SPI_SPEED_6:       clock = SPI_CLOCK_DIV64; break;
80
+    default:                clock = SPI_CLOCK_DIV2;        // Default from the SPI library
81
+  }
82
+  SPI.setModule(1);
83
+  SPI.begin();
84
+  SPI.setClockDivider(clock);
85
+  SPI.setBitOrder(MSBFIRST);
86
+  SPI.setDataMode(SPI_MODE0);
87
+}
88
+
89
+void LCD_IO_Init(uint8_t cs, uint8_t rs) {
90
+  spi1Init(SPI_FULL_SPEED);
91
+}
92
+
93
+void LCD_IO_WriteData(uint16_t RegValue) {
94
+  LCD_WR_DATA(RegValue);
95
+}
96
+
97
+void LCD_IO_WriteReg(uint16_t Reg) {
98
+  LCD_WR_REG(Reg);
99
+}
100
+
101
+uint16_t LCD_IO_ReadData(uint16_t RegValue) {
102
+  uint16_t d = 0;
103
+  SPI_TFT_CS_L;
104
+
105
+  SPI_TFT_DC_L;
106
+  SPI.send(RegValue);
107
+  SPI_TFT_DC_H;
108
+
109
+  SPI.read((uint8_t*)&d, 1); //dummy read
110
+  SPI.read((uint8_t*)&d, 1);
111
+
112
+  SPI_TFT_CS_H;
113
+  return d >> 7;
114
+}
115
+
116
+uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) {
117
+  uint32_t data = 0;
118
+  uint8_t d = 0;
119
+  SPI_TFT_CS_L;
120
+
121
+  SPI_TFT_DC_L;
122
+  SPI.send(RegValue);
123
+  SPI_TFT_DC_H;
124
+
125
+  SPI.read((uint8_t*)&d, 1); //dummy read
126
+  SPI.read((uint8_t*)&d, 1);
127
+  data = d;
128
+  while (--ReadSize) {
129
+    data <<= 8;
130
+    SPI.read((uint8_t*)&d, 1);
131
+    data |= (d & 0xFF);
132
+  }
133
+
134
+  SPI_TFT_CS_H;
135
+  return uint32_t(data >> 7);
136
+}
137
+
138
+#ifdef LCD_USE_DMA_SPI
139
+  void LCD_IO_WriteMultiple(uint16_t data, uint32_t count) {
140
+    if (SPI.getDataSize() == DATA_SIZE_8BIT) {
141
+      count *= 2;
142
+    }
143
+    while (count > 0) {
144
+      SPI_TFT_CS_L;
145
+      SPI_TFT_DC_H;
146
+      SPI.dmaSend(&data, 1, true);
147
+      SPI_TFT_CS_H;
148
+      count--;
149
+    }
150
+  }
151
+
152
+  void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) {
153
+    if (SPI.getDataSize() == DATA_SIZE_8BIT) {
154
+      length *= 2;
155
+    }
156
+    SPI_TFT_CS_L;
157
+    SPI_TFT_DC_H;
158
+    SPI.dmaSend(data, length, true);
159
+    SPI_TFT_CS_H;
160
+  }
161
+
162
+  void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length) {
163
+    if (SPI.getDataSize() == DATA_SIZE_8BIT) {
164
+      length *= 2;
165
+    }
166
+    SPI_TFT_CS_L;
167
+    SPI_TFT_DC_H;
168
+    SPI.dmaSendAsync(data, length, true);
169
+    SPI_TFT_CS_H;
170
+  }
171
+
172
+  void LCD_IO_WaitSequence_Async() {
173
+    SPI_TFT_CS_L;
174
+    SPI_TFT_DC_H;
175
+    SPI.dmaSendAsync(NULL, 0, true);
176
+    SPI_TFT_CS_H;
177
+  }
178
+#endif
179
+
180
+static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT
181
+
182
+#ifndef LCD_READ_ID
183
+  #define LCD_READ_ID 0x04   // Read display identification information (0xD3 on ILI9341)
184
+#endif
185
+
186
+uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
187
+  if (msgInitCount) {
188
+    if (msg == U8G_COM_MSG_INIT) msgInitCount--;
189
+    if (msgInitCount) return -1;
190
+  }
191
+
192
+  static uint8_t isCommand;
193
+
194
+  LCD_IO_Init(-1, -1);
195
+
196
+  switch (msg) {
197
+    case U8G_COM_MSG_STOP: break;
198
+    case U8G_COM_MSG_INIT:
199
+      u8g_SetPIOutput(u8g, U8G_PI_RESET);
200
+
201
+      u8g_Delay(50);
202
+
203
+      if (arg_ptr) {
204
+        spi1Init(SPI_EIGHTH_SPEED);
205
+        *((uint32_t *)arg_ptr) = (LCD_READ_ID << 24) | LCD_IO_ReadData(LCD_READ_ID, 3);
206
+        spi1Init(SPI_FULL_SPEED);
207
+      }
208
+      isCommand = 0;
209
+      break;
210
+
211
+    case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1)
212
+      isCommand = arg_val == 0 ? 1 : 0;
213
+      break;
214
+
215
+    case U8G_COM_MSG_RESET:
216
+      u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
217
+      break;
218
+
219
+    case U8G_COM_MSG_WRITE_BYTE:
220
+      if (isCommand)
221
+        LCD_IO_WriteReg(arg_val);
222
+      else
223
+        LCD_IO_WriteData((uint16_t)arg_val);
224
+      break;
225
+
226
+    case U8G_COM_MSG_WRITE_SEQ:
227
+      for (uint8_t i = 0; i < arg_val; i += 2)
228
+        LCD_IO_WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i));
229
+      break;
230
+
231
+  }
232
+  return 1;
233
+}
234
+
235
+#endif // HAS_GRAPHICAL_LCD
236
+#endif // STM32F1

+ 66
- 18
Marlin/src/feature/touch/xpt2046.cpp Dosyayı Görüntüle

@@ -23,10 +23,14 @@
23 23
 
24 24
 #include "xpt2046.h"
25 25
 #include "../../inc/MarlinConfig.h"
26
-#if ENABLED(FSMC_GRAPHICAL_TFT)
26
+
27
+#if TFT_SCALED_DOGLCD
27 28
   #include "../../lcd/dogm/ultralcd_DOGM.h" // for LCD_FULL_PIXEL_WIDTH, etc.
28 29
 #endif
29 30
 
31
+#ifndef XPT2046_Z1_THRESHOLD
32
+  #define XPT2046_Z1_THRESHOLD 10
33
+#endif
30 34
 
31 35
 /*
32 36
  * Draw and Touch processing
@@ -117,10 +121,15 @@ uint8_t XPT2046::read_buttons() {
117 121
     // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible.
118 122
 
119 123
     if (!isTouched()) return 0;
120
-    const uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1],
121
-                  y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3];
124
+    uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1],
125
+             y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3];
122 126
     if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read.
123 127
 
128
+    #if ENABLED(GRAPHICAL_TFT_ROTATE_180)
129
+      x = TOUCH_SCREEN_WIDTH - x;
130
+      y = TOUCH_SCREEN_HEIGHT - y;
131
+    #endif
132
+
124 133
     // Touch within the button area simulates an encoder button
125 134
     if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT)
126 135
       return WITHIN(x,  14,  77) ? EN_D
@@ -151,30 +160,69 @@ bool XPT2046::isTouched() {
151 160
   );
152 161
 }
153 162
 
163
+#if ENABLED(TOUCH_BUTTONS_HW_SPI)
164
+  #include <SPI.h>
165
+
166
+  static void touch_spi_init(uint8_t spiRate) {
167
+    /**
168
+     * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz
169
+     * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1
170
+     * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2
171
+     */
172
+    uint8_t clock;
173
+    switch (spiRate) {
174
+      case SPI_FULL_SPEED:    clock = SPI_CLOCK_DIV4;  break;
175
+      case SPI_HALF_SPEED:    clock = SPI_CLOCK_DIV4; break;
176
+      case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break;
177
+      case SPI_EIGHTH_SPEED:  clock = SPI_CLOCK_DIV16; break;
178
+      case SPI_SPEED_5:       clock = SPI_CLOCK_DIV32; break;
179
+      case SPI_SPEED_6:       clock = SPI_CLOCK_DIV64; break;
180
+      default:                clock = SPI_CLOCK_DIV2;        // Default from the SPI library
181
+    }
182
+    SPI.setModule(TOUCH_BUTTONS_HW_SPI_DEVICE);
183
+    SPI.begin();
184
+    SPI.setClockDivider(clock);
185
+    SPI.setBitOrder(MSBFIRST);
186
+    SPI.setDataMode(SPI_MODE0);
187
+  }
188
+#endif // TOUCH_BUTTONS_HW_SPI
189
+
154 190
 uint16_t XPT2046::getInTouch(const XPTCoordinate coordinate) {
155 191
   uint16_t data[3];
192
+  const uint8_t coord = uint8_t(coordinate) | XPT2046_CONTROL | XPT2046_DFR_MODE;
156 193
 
157
-  OUT_WRITE(TOUCH_CS_PIN, LOW);
194
+  #if ENABLED(TOUCH_BUTTONS_HW_SPI)
158 195
 
159
-  const uint8_t coord = uint8_t(coordinate) | XPT2046_CONTROL | XPT2046_DFR_MODE;
160
-  for (uint16_t i = 0; i < 3 ; i++) {
161
-    for (uint8_t j = 0x80; j; j >>= 1) {
162
-      WRITE(TOUCH_SCK_PIN, LOW);
163
-      WRITE(TOUCH_MOSI_PIN, bool(coord & j));
164
-      WRITE(TOUCH_SCK_PIN, HIGH);
196
+    touch_spi_init(SPI_SPEED_6);
197
+    for (uint16_t i = 0; i < 3; i++) {
198
+      OUT_WRITE(TOUCH_CS_PIN, LOW);
199
+      SPI.transfer(coord);
200
+      data[i] = (((SPI.transfer(0xFF) << 8) | SPI.transfer(0xFF)) >> 3) & 0x0FFF;
201
+      WRITE(TOUCH_CS_PIN, HIGH);
165 202
     }
166 203
 
167
-    data[i] = 0;
168
-    for (uint16_t j = 0x8000; j; j >>= 1) {
204
+  #else // !TOUCH_BUTTONS_HW_SPI
205
+
206
+    OUT_WRITE(TOUCH_CS_PIN, LOW);
207
+    for (uint16_t i = 0; i < 3; i++) {
208
+      for (uint8_t j = 0x80; j; j >>= 1) {
209
+        WRITE(TOUCH_SCK_PIN, LOW);
210
+        WRITE(TOUCH_MOSI_PIN, bool(coord & j));
211
+        WRITE(TOUCH_SCK_PIN, HIGH);
212
+      }
213
+
214
+      data[i] = 0;
215
+      for (uint16_t j = 0x8000; j; j >>= 1) {
216
+        WRITE(TOUCH_SCK_PIN, LOW);
217
+        if (READ(TOUCH_MISO_PIN)) data[i] |= j;
218
+        WRITE(TOUCH_SCK_PIN, HIGH);
219
+      }
169 220
       WRITE(TOUCH_SCK_PIN, LOW);
170
-      if (READ(TOUCH_MISO_PIN)) data[i] |= j;
171
-      WRITE(TOUCH_SCK_PIN, HIGH);
221
+      data[i] >>= 4;
172 222
     }
173
-    WRITE(TOUCH_SCK_PIN, LOW);
174
-    data[i] >>= 4;
175
-  }
223
+    WRITE(TOUCH_CS_PIN, HIGH);
176 224
 
177
-  WRITE(TOUCH_CS_PIN, HIGH);
225
+  #endif // !TOUCH_BUTTONS_HW_SPI
178 226
 
179 227
   uint16_t delta01 = _MAX(data[0], data[1]) - _MIN(data[0], data[1]),
180 228
            delta02 = _MAX(data[0], data[2]) - _MIN(data[0], data[2]),

+ 0
- 4
Marlin/src/feature/touch/xpt2046.h Dosyayı Görüntüle

@@ -34,10 +34,6 @@ enum XPTCoordinate : uint8_t {
34 34
   XPT2046_Z2 = 0x40
35 35
 };
36 36
 
37
-#ifndef XPT2046_Z1_THRESHOLD
38
-  #define XPT2046_Z1_THRESHOLD 10
39
-#endif
40
-
41 37
 class XPT2046 {
42 38
 public:
43 39
   static void init();

+ 5
- 1
Marlin/src/inc/Conditionals_LCD.h Dosyayı Görüntüle

@@ -261,7 +261,11 @@
261 261
 #endif
262 262
 
263 263
 // FSMC/SPI TFT Panels
264
-#if ENABLED(FSMC_GRAPHICAL_TFT)
264
+#if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT)
265
+  #define TFT_SCALED_DOGLCD 1
266
+#endif
267
+
268
+#if TFT_SCALED_DOGLCD
265 269
   #define DOGLCD
266 270
   #define IS_ULTIPANEL
267 271
   #define DELAYED_BACKLIGHT_INIT

+ 1
- 1
Marlin/src/inc/Conditionals_post.h Dosyayı Görüntüle

@@ -373,7 +373,7 @@
373 373
 
374 374
 #endif
375 375
 
376
-#if EITHER(LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT)
376
+#if ANY(LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT)
377 377
   #define NO_LCD_REINIT 1  // Suppress LCD re-initialization
378 378
 #endif
379 379
 

+ 20
- 6
Marlin/src/inc/SanityCheck.h Dosyayı Görüntüle

@@ -451,8 +451,6 @@
451 451
   #error "MKS_ROBIN_TFT is now FSMC_GRAPHICAL_TFT. Please update your configuration."
452 452
 #elif defined(TFT_LVGL_UI)
453 453
   #error "TFT_LVGL_UI is now TFT_LVGL_UI_FSMC. Please update your configuration."
454
-#elif defined(SPI_GRAPHICAL_TFT)
455
-  #error "SPI_GRAPHICAL_TFT is now TFT_LVGL_UI_SPI. Please update your configuration."
456 454
 #elif defined(SDPOWER)
457 455
   #error "SDPOWER is now SDPOWER_PIN. Please update your configuration and/or pins."
458 456
 #elif defined(STRING_SPLASH_LINE1) || defined(STRING_SPLASH_LINE2)
@@ -3036,11 +3034,27 @@ static_assert(   _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
3036 3034
 #endif
3037 3035
 
3038 3036
 /**
3039
- * Sanity checks for stepper chunk support
3037
+ * Stepper Chunk support
3040 3038
  */
3041
-#if ENABLED(DIRECT_STEPPING)
3042
-  #if ENABLED(LIN_ADVANCE)
3043
-    #error "DIRECT_STEPPING is incompatible with LIN_ADVANCE. Enable in external planner if possible."
3039
+#if BOTH(DIRECT_STEPPING, LIN_ADVANCE)
3040
+  #error "DIRECT_STEPPING is incompatible with LIN_ADVANCE. Enable in external planner if possible."
3041
+#endif
3042
+
3043
+/**
3044
+ * Touch Buttons
3045
+ */
3046
+#if ENABLED(TOUCH_BUTTONS)
3047
+  #ifndef XPT2046_X_CALIBRATION
3048
+    #error "XPT2046_X_CALIBRATION must be defined with TOUCH_BUTTONS."
3049
+  #endif
3050
+  #ifndef XPT2046_Y_CALIBRATION
3051
+    #error "XPT2046_Y_CALIBRATION must be defined with TOUCH_BUTTONS."
3052
+  #endif
3053
+  #ifndef XPT2046_X_OFFSET
3054
+    #error "XPT2046_X_OFFSET must be defined with TOUCH_BUTTONS."
3055
+  #endif
3056
+  #ifndef XPT2046_Y_OFFSET
3057
+    #error "XPT2046_Y_OFFSET must be defined with TOUCH_BUTTONS."
3044 3058
   #endif
3045 3059
 #endif
3046 3060
 

+ 5
- 0
Marlin/src/lcd/dogm/HAL_LCD_com_defines.h Dosyayı Görüntüle

@@ -87,6 +87,11 @@
87 87
     #define U8G_COM_HAL_FSMC_FN       u8g_com_stm32duino_fsmc_fn
88 88
   #endif
89 89
 
90
+  #if ENABLED(SPI_GRAPHICAL_TFT)
91
+    uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
92
+    #define U8G_COM_HAL_FSMC_FN       u8g_com_stm32duino_spi_fn
93
+  #endif
94
+
90 95
 #elif defined(TARGET_LPC1768)
91 96
 
92 97
   uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);

+ 74
- 57
Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp Dosyayı Görüntüle

@@ -57,14 +57,21 @@
57 57
 
58 58
 #include "../../inc/MarlinConfig.h"
59 59
 
60
-#if HAS_GRAPHICAL_LCD && PIN_EXISTS(FSMC_CS)
60
+#if HAS_GRAPHICAL_LCD && (PIN_EXISTS(FSMC_CS) || ENABLED(SPI_GRAPHICAL_TFT))
61 61
 
62 62
 #include "HAL_LCD_com_defines.h"
63 63
 #include "ultralcd_DOGM.h"
64 64
 
65 65
 #include <string.h>
66 66
 
67
-#ifdef LCD_USE_DMA_FSMC
67
+#if EITHER(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI)
68
+  #define HAS_LCD_IO 1
69
+#endif
70
+
71
+#if HAS_LCD_IO
72
+  extern void LCD_IO_Init(uint8_t cs, uint8_t rs);
73
+  extern uint16_t LCD_IO_ReadData(uint16_t Reg);
74
+  extern uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize);
68 75
   extern void LCD_IO_WriteReg(uint16_t Reg);
69 76
   extern void LCD_IO_WriteData(uint16_t RegValue);
70 77
   extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length);
@@ -148,46 +155,34 @@ static uint32_t lcd_id = 0;
148 155
 
149 156
 
150 157
 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);
158
+  #if HAS_LCD_IO
159
+    #define IO_REG_DATA(R,D) do { LCD_IO_WriteReg(R); LCD_IO_WriteData(D); }while(0)
167 160
   #else
161
+    #define IO_REG_DATA(R,D) do { u8g_WriteByte(u8g, dev, R); u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&D); }while(0)
162
+  #endif
163
+
164
+  #if NONE(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI)
168 165
     u8g_SetAddress(u8g, dev, 0);
166
+  #endif
169 167
 
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);
168
+  IO_REG_DATA(ILI9328_HASTART, Ymin);
169
+  IO_REG_DATA(ILI9328_HAEND,   Ymax);
170
+  IO_REG_DATA(ILI9328_VASTART, Xmin);
171
+  IO_REG_DATA(ILI9328_VAEND,   Xmax);
178 172
 
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);
173
+  IO_REG_DATA(ILI9328_HASET,   Ymin);
174
+  IO_REG_DATA(ILI9328_VASET,   Xmin);
183 175
 
176
+  #if HAS_LCD_IO
177
+    LCD_IO_WriteReg(ILI9328_WRITE_RAM);
178
+  #else
184 179
     u8g_WriteByte(u8g, dev, ILI9328_WRITE_RAM);
185 180
     u8g_SetAddress(u8g, dev, 1);
186 181
   #endif
187 182
 }
188 183
 
189 184
 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
185
+  #if HAS_LCD_IO
191 186
     LCD_IO_WriteReg(ST7789V_CASET);
192 187
     LCD_IO_WriteData((Xmin >> 8) & 0xFF);
193 188
     LCD_IO_WriteData(Xmin & 0xFF);
@@ -227,7 +222,7 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint
227 222
 #define ESC_END         0xFFFF, 0x7FFF
228 223
 #define ESC_FFFF        0xFFFF, 0xFFFF
229 224
 
230
-#ifdef LCD_USE_DMA_FSMC
225
+#if HAS_LCD_IO
231 226
   void writeEscSequence(const uint16_t *sequence) {
232 227
     uint16_t data;
233 228
     for (;;) {
@@ -247,6 +242,7 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint
247 242
       }
248 243
     }
249 244
   }
245
+  #define WRITE_ESC_SEQUENCE(V) writeEscSequence(V)
250 246
 #else
251 247
   void writeEscSequence8(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) {
252 248
     uint16_t data;
@@ -271,6 +267,8 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint
271 267
     }
272 268
   }
273 269
 
270
+  #define WRITE_ESC_SEQUENCE(V) writeEscSequence8(u8g, dev, V)
271
+
274 272
   void writeEscSequence16(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) {
275 273
     uint16_t data;
276 274
     u8g_SetAddress(u8g, dev, 0);
@@ -381,6 +379,30 @@ static const uint16_t ili9341_init[] = {
381 379
   ESC_END
382 380
 };
383 381
 
382
+static const uint16_t st9677_init[] = {
383
+  ESC_REG(0x0010), ESC_DELAY(120),
384
+  ESC_REG(0x0001), ESC_DELAY(120),
385
+  ESC_REG(0x0011), ESC_DELAY(120),
386
+  ESC_REG(0x00F0), 0x00C3,
387
+  ESC_REG(0x00F0), 0x0096,
388
+  ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x00E8, 0x0028),
389
+  ESC_REG(0x003A), 0x0055,
390
+  ESC_REG(0x00B4), 0x0001,
391
+  ESC_REG(0x00B7), 0x00C6,
392
+  ESC_REG(0x00E8), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033,
393
+  ESC_REG(0x00C1), 0x0006,
394
+  ESC_REG(0x00C2), 0x00A7,
395
+  ESC_REG(0x00C5), 0x0018,
396
+  ESC_REG(0x00E0), 0x00F0, 0x0009, 0x000B, 0x0006, 0x0004, 0x0015, 0x002F, 0x0054, 0x0042, 0x003C, 0x0017, 0x0014, 0x0018, 0x001B,
397
+  ESC_REG(0x00E1), 0x00F0, 0x0009, 0x000B, 0x0006, 0x0004, 0x0003, 0x002D, 0x0043, 0x0042, 0x003B, 0x0016, 0x0014, 0x0017, 0x001B,
398
+  ESC_REG(0x00F0), 0x003C,
399
+  ESC_REG(0x00F0), 0x0069, ESC_DELAY(120),
400
+  ESC_REG(0x0029),
401
+  ESC_REG(0x0011),
402
+  ESC_DELAY(100),
403
+  ESC_END
404
+};
405
+
384 406
 #if ENABLED(TOUCH_BUTTONS)
385 407
 
386 408
   static const uint8_t buttonD[] = {
@@ -560,7 +582,7 @@ static const uint16_t ili9341_init[] = {
560 582
           v = TFT_MARLINBG_COLOR;
561 583
         LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = v;
562 584
       }
563
-      #ifdef LCD_USE_DMA_FSMC
585
+      #if HAS_LCD_IO
564 586
         LOOP_S_L_N(n, 1, FSMC_UPSCALE)
565 587
           for (uint16_t l = 0; l < length * (FSMC_UPSCALE); l++)
566 588
             buffer[l + (length * (FSMC_UPSCALE) * n)] = buffer[l];
@@ -586,41 +608,39 @@ static uint8_t page;
586 608
 
587 609
 uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {
588 610
   u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
589
-  #ifdef LCD_USE_DMA_FSMC
611
+
612
+  #if ENABLED(SPI_GRAPHICAL_TFT)
613
+    LCD_IO_Init(-1, -1);
614
+  #endif
615
+
616
+  #if HAS_LCD_IO
590 617
     static uint16_t bufferA[WIDTH * sq(FSMC_UPSCALE)], bufferB[WIDTH * sq(FSMC_UPSCALE)];
591 618
     uint16_t* buffer = &bufferA[0];
592
-    bool allow_async = true;
619
+    bool allow_async = DISABLED(SPI_GRAPHICAL_TFT);
593 620
   #else
594 621
     uint16_t buffer[WIDTH*2]; // 16-bit RGB 565 pixel line buffer
595 622
   #endif
623
+
596 624
   switch (msg) {
597 625
     case U8G_DEV_MSG_INIT:
598 626
       dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, &lcd_id);
599 627
 
600 628
       switch (lcd_id & 0xFFFF) {
601 629
         case 0x8552:   // ST7789V
602
-          #ifdef LCD_USE_DMA_FSMC
603
-            writeEscSequence(st7789v_init);
604
-          #else
605
-            writeEscSequence8(u8g, dev, st7789v_init);
606
-          #endif
630
+          WRITE_ESC_SEQUENCE(st7789v_init);
607 631
           setWindow = setWindow_st7789v;
608 632
           break;
609 633
         case 0x9328:  // ILI9328
610
-          #ifdef LCD_USE_DMA_FSMC
611
-            writeEscSequence(ili9328_init);
612
-          #else
613
-            writeEscSequence16(u8g, dev, ili9328_init);
614
-          #endif
634
+          WRITE_ESC_SEQUENCE(ili9328_init);
615 635
           setWindow = setWindow_ili9328;
616 636
           break;
617 637
         case 0x9341:   // ILI9341
618 638
         case 0x8066:   // Anycubic / TronXY TFTs (480x320)
619
-          #ifdef LCD_USE_DMA_FSMC
620
-            writeEscSequence(ili9341_init);
621
-          #else
622
-            writeEscSequence8(u8g, dev, ili9341_init);
623
-          #endif
639
+          WRITE_ESC_SEQUENCE(ili9341_init);
640
+          setWindow = setWindow_st7789v;
641
+          break;
642
+        case 0x7796:
643
+          WRITE_ESC_SEQUENCE(TERN(HAS_LCD_IO, st9677_init, ili9341_init));
624 644
           setWindow = setWindow_st7789v;
625 645
           break;
626 646
         case 0x0404:  // No connected display on FSMC
@@ -630,10 +650,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
630 650
           lcd_id = 0;
631 651
           return 0;
632 652
         default:
633
-          if (lcd_id && 0xFF000000)
634
-            setWindow = setWindow_st7789v;
635
-          else
636
-            setWindow = setWindow_ili9328;
653
+          setWindow = (lcd_id & 0xFF000000) ? setWindow_st7789v : setWindow_ili9328;
637 654
           break;
638 655
       }
639 656
 
@@ -644,7 +661,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
644 661
 
645 662
       // Clear Screen
646 663
       setWindow(u8g, dev, 0, 0, LCD_FULL_PIXEL_WIDTH - 1, LCD_FULL_PIXEL_HEIGHT - 1);
647
-      #ifdef LCD_USE_DMA_FSMC
664
+      #if HAS_LCD_IO
648 665
         LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, LCD_FULL_PIXEL_WIDTH * LCD_FULL_PIXEL_HEIGHT);
649 666
       #else
650 667
         memset2(buffer, TFT_MARLINBG_COLOR, 160);
@@ -681,7 +698,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
681 698
 
682 699
       LOOP_L_N(y, PAGE_HEIGHT) {
683 700
         uint32_t k = 0;
684
-        #ifdef LCD_USE_DMA_FSMC
701
+        #if HAS_LCD_IO
685 702
           buffer = (y & 1) ? bufferB : bufferA;
686 703
         #endif
687 704
         for (uint16_t i = 0; i < (uint32_t)pb->width; i++) {
@@ -689,7 +706,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
689 706
           const uint16_t c = TEST(b, y) ? TFT_MARLINUI_COLOR : TFT_MARLINBG_COLOR;
690 707
           LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = c;
691 708
         }
692
-        #ifdef LCD_USE_DMA_FSMC
709
+        #if HAS_LCD_IO
693 710
           LOOP_S_L_N(n, 1, FSMC_UPSCALE)
694 711
             for (uint16_t l = 0; l < WIDTH * (FSMC_UPSCALE); l++)
695 712
               buffer[l + WIDTH * (FSMC_UPSCALE) * n] = buffer[l];

+ 9
- 5
Marlin/src/lcd/dogm/ultralcd_DOGM.h Dosyayı Görüntüle

@@ -182,12 +182,16 @@
182 182
   #define U8G_CLASS U8GLIB_SH1106_128X64
183 183
   #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS
184 184
 
185
-#elif ENABLED(FSMC_GRAPHICAL_TFT)
185
+#elif TFT_SCALED_DOGLCD
186 186
 
187 187
   // Unspecified 320x240 TFT pre-initialized by built-in bootloader
188 188
 
189 189
   #define U8G_CLASS U8GLIB_TFT_320X240_UPSCALE_FROM_128X64
190
-  #define U8G_PARAM FSMC_CS_PIN, FSMC_RS_PIN
190
+  #if ENABLED(FSMC_GRAPHICAL_TFT)
191
+    #define U8G_PARAM FSMC_CS_PIN, FSMC_RS_PIN
192
+  #else
193
+    #define U8G_PARAM -1, -1
194
+  #endif
191 195
 
192 196
 #else
193 197
 
@@ -210,18 +214,18 @@
210 214
 
211 215
 // LCD_FULL_PIXEL_WIDTH =
212 216
 // LCD_PIXEL_OFFSET_X + (LCD_PIXEL_WIDTH * 2) + LCD_PIXEL_OFFSET_X
213
-#if ENABLED(FSMC_GRAPHICAL_TFT)
217
+#if TFT_SCALED_DOGLCD
214 218
   #ifndef LCD_FULL_PIXEL_WIDTH
215 219
     #define LCD_FULL_PIXEL_WIDTH  320
216 220
   #endif
217 221
   #ifndef LCD_PIXEL_OFFSET_X
218
-    #define LCD_PIXEL_OFFSET_X    32
222
+    #define LCD_PIXEL_OFFSET_X     32
219 223
   #endif
220 224
   #ifndef LCD_FULL_PIXEL_HEIGHT
221 225
     #define LCD_FULL_PIXEL_HEIGHT 240
222 226
   #endif
223 227
   #ifndef LCD_PIXEL_OFFSET_Y
224
-    #define LCD_PIXEL_OFFSET_Y    32
228
+    #define LCD_PIXEL_OFFSET_Y     32
225 229
   #endif
226 230
 #endif
227 231
 

+ 17
- 8
Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h Dosyayı Görüntüle

@@ -112,10 +112,10 @@
112 112
 
113 113
 #if ENABLED(FSMC_GRAPHICAL_TFT)
114 114
   #define FSMC_UPSCALE 3
115
-  #define LCD_FULL_PIXEL_WIDTH 480
116
-  #define LCD_PIXEL_OFFSET_X 48
117
-  #define LCD_FULL_PIXEL_HEIGHT 320
118
-  #define LCD_PIXEL_OFFSET_Y 48
115
+  #define LCD_FULL_PIXEL_WIDTH               480
116
+  #define LCD_PIXEL_OFFSET_X                  48
117
+  #define LCD_FULL_PIXEL_HEIGHT              320
118
+  #define LCD_PIXEL_OFFSET_Y                  48
119 119
 
120 120
   #define LCD_RESET_PIN                     PF11
121 121
   #define LCD_BACKLIGHT_PIN                 PD13
@@ -135,10 +135,19 @@
135 135
     #define BUTTON_DELAY_EDIT 50                  // (ms) Button repeat delay for edit screens
136 136
     #define BUTTON_DELAY_MENU 250                 // (ms) Button repeat delay for menus
137 137
 
138
-    #define XPT2046_X_CALIBRATION  -12316
139
-    #define XPT2046_Y_CALIBRATION   8981
140
-    #define XPT2046_X_OFFSET        340
141
-    #define XPT2046_Y_OFFSET        -20
138
+    #ifndef XPT2046_X_CALIBRATION
139
+      #define XPT2046_X_CALIBRATION       -12316
140
+    #endif
141
+    #ifndef XPT2046_Y_CALIBRATION
142
+      #define XPT2046_Y_CALIBRATION         8981
143
+    #endif
144
+    #ifndef XPT2046_X_OFFSET
145
+      #define XPT2046_X_OFFSET               340
146
+    #endif
147
+    #ifndef XPT2046_Y_OFFSET
148
+      #define XPT2046_Y_OFFSET               -20
149
+    #endif
150
+
142 151
   #endif
143 152
 #endif
144 153
 

+ 16
- 8
Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h Dosyayı Görüntüle

@@ -118,10 +118,10 @@
118 118
 //
119 119
 #if ENABLED(FSMC_GRAPHICAL_TFT)
120 120
   #define FSMC_UPSCALE 3
121
-  #define LCD_FULL_PIXEL_WIDTH 480
122
-  #define LCD_PIXEL_OFFSET_X 48
123
-  #define LCD_FULL_PIXEL_HEIGHT 320
124
-  #define LCD_PIXEL_OFFSET_Y 48
121
+  #define LCD_FULL_PIXEL_WIDTH               480
122
+  #define LCD_PIXEL_OFFSET_X                  48
123
+  #define LCD_FULL_PIXEL_HEIGHT              320
124
+  #define LCD_PIXEL_OFFSET_Y                  48
125 125
 
126 126
   #define LCD_RESET_PIN                     PF11
127 127
   #define LCD_BACKLIGHT_PIN                 PD13
@@ -141,10 +141,18 @@
141 141
     #define BUTTON_DELAY_EDIT 50                  // (ms) Button repeat delay for edit screens
142 142
     #define BUTTON_DELAY_MENU 250                 // (ms) Button repeat delay for menus
143 143
 
144
-    #define XPT2046_X_CALIBRATION  -12316
145
-    #define XPT2046_Y_CALIBRATION   8981
146
-    #define XPT2046_X_OFFSET        340
147
-    #define XPT2046_Y_OFFSET        -20
144
+    #ifndef XPT2046_X_CALIBRATION
145
+      #define XPT2046_X_CALIBRATION       -12316
146
+    #endif
147
+    #ifndef XPT2046_Y_CALIBRATION
148
+      #define XPT2046_Y_CALIBRATION         8981
149
+    #endif
150
+    #ifndef XPT2046_X_OFFSET
151
+      #define XPT2046_X_OFFSET               340
152
+    #endif
153
+    #ifndef XPT2046_Y_OFFSET
154
+      #define XPT2046_Y_OFFSET               -20
155
+    #endif
148 156
   #endif
149 157
 #endif
150 158
 

+ 78
- 11
Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h Dosyayı Görüntüle

@@ -207,6 +207,13 @@
207 207
 #define MT_DET_2_PIN                        PE6
208 208
 #define MT_DET_PIN_INVERTING false
209 209
 
210
+#ifndef FIL_RUNOUT_PIN
211
+  #define FIL_RUNOUT_PIN            MT_DET_1_PIN
212
+#endif
213
+#ifndef FIL_RUNOUT2_PIN
214
+  #define FIL_RUNOUT2_PIN           MT_DET_2_PIN
215
+#endif
216
+
210 217
 #define WIFI_IO0_PIN                        PC13
211 218
 
212 219
 //
@@ -224,7 +231,9 @@
224 231
 //
225 232
 // LCD / Controller
226 233
 //
227
-#define BEEPER_PIN                          PC5
234
+#ifndef BEEPER_PIN
235
+  #define BEEPER_PIN                        PC5
236
+#endif
228 237
 
229 238
 /**
230 239
  * Note: MKS Robin TFT screens use various TFT controllers.
@@ -250,7 +259,6 @@
250 259
 
251 260
   #define BTN_EN1                           PE8
252 261
   #define BTN_EN2                           PE11
253
-  #define BEEPER_PIN                        PC5
254 262
   #define BTN_ENC                           PE13
255 263
 
256 264
 #elif ENABLED(TFT_LITTLE_VGL_UI)
@@ -269,16 +277,71 @@
269 277
 
270 278
 #if HAS_SPI_LCD
271 279
 
272
-  #define BEEPER_PIN                        PC5
273
-  #define BTN_ENC                           PE13
274
-  #define LCD_PINS_ENABLE                   PD13
275
-  #define LCD_PINS_RS                       PC6
276
-  #define BTN_EN1                           PE8
277
-  #define BTN_EN2                           PE11
278
-  #define LCD_BACKLIGHT_PIN                 -1
280
+  #if ENABLED(SPI_GRAPHICAL_TFT)                  // Emulated DOGM SPI
281
+    #define SPI_TFT_CS_PIN                  PD11
282
+    #define SPI_TFT_SCK_PIN                 PA5
283
+    #define SPI_TFT_MISO_PIN                PA6
284
+    #define SPI_TFT_MOSI_PIN                PA7
285
+    #define SPI_TFT_DC_PIN                  PD10
286
+    #define SPI_TFT_RST_PIN                 PC6
287
+
288
+    #define LCD_BACKLIGHT_PIN               PD13
289
+
290
+    #define LCD_READ_ID                     0xD3
291
+    #define LCD_USE_DMA_SPI
292
+
293
+    #define TOUCH_BUTTONS_HW_SPI
294
+    #define TOUCH_BUTTONS_HW_SPI_DEVICE     1
295
+
296
+    //#define TOUCH_BUTTONS
297
+    #if ENABLED(TOUCH_BUTTONS)
298
+      #define TOUCH_CS_PIN                  PE14  // SPI1_NSS
299
+      #define TOUCH_SCK_PIN                 PA5   // SPI1_SCK
300
+      #define TOUCH_MISO_PIN                PA6   // SPI1_MISO
301
+      #define TOUCH_MOSI_PIN                PA7   // SPI1_MOSI
302
+
303
+      #ifndef XPT2046_X_CALIBRATION
304
+        #define XPT2046_X_CALIBRATION      -5481
305
+      #endif
306
+      #ifndef XPT2046_Y_CALIBRATION
307
+        #define XPT2046_Y_CALIBRATION       4000
308
+      #endif
309
+      #ifndef XPT2046_X_OFFSET
310
+        #define XPT2046_X_OFFSET             343
311
+      #endif
312
+      #ifndef XPT2046_Y_OFFSET
313
+        #define XPT2046_Y_OFFSET               0
314
+      #endif
315
+    #endif
316
+
317
+    #ifndef FSMC_UPSCALE
318
+      #define FSMC_UPSCALE                     3
319
+    #endif
320
+    #ifndef LCD_FULL_PIXEL_WIDTH
321
+      #define LCD_FULL_PIXEL_WIDTH           480
322
+    #endif
323
+    #ifndef LCD_PIXEL_OFFSET_X
324
+      #define LCD_PIXEL_OFFSET_X              48
325
+    #endif
326
+    #ifndef LCD_FULL_PIXEL_HEIGHT
327
+      #define LCD_FULL_PIXEL_HEIGHT          320
328
+    #endif
329
+    #ifndef LCD_PIXEL_OFFSET_Y
330
+      #define LCD_PIXEL_OFFSET_Y              32
331
+    #endif
332
+
333
+    #define BTN_ENC                         PE13
334
+    #define BTN_EN1                         PE8
335
+    #define BTN_EN2                         PE11
336
+
337
+    #define LCD_PINS_ENABLE                 PD13
338
+    #define LCD_PINS_RS                     PC6
339
+
340
+  #elif ENABLED(MKS_MINI_12864)
341
+
342
+    // MKS MINI12864 and MKS LCD12864B
343
+    // If using MKS LCD12864A (Need to remove RPK2 resistor)
279 344
 
280
-  // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor)
281
-  #if ENABLED(MKS_MINI_12864)
282 345
     #define LCD_BACKLIGHT_PIN               -1
283 346
     #define LCD_RESET_PIN                   -1
284 347
     #define DOGLCD_A0                       PD11
@@ -320,3 +383,7 @@
320 383
   #define W25QXX_MISO_PIN                   PB14
321 384
   #define W25QXX_SCK_PIN                    PB13
322 385
 #endif
386
+
387
+#if ENABLED(SPEAKER) && BEEPER_PIN == PC5
388
+  #error "MKS Robin nano default BEEPER_PIN is not a SPEAKER."
389
+#endif

Loading…
İptal
Kaydet