Robin & Longer3D SPI TFT driver (#14595)
This commit is contained in:
		
				
					committed by
					
						 Scott Lahteine
						Scott Lahteine
					
				
			
			
				
	
			
			
			
						parent
						
							45bde333d5
						
					
				
				
					commit
					81d629bc47
				
			| @@ -2032,8 +2032,16 @@ | ||||
| //============================================================================= | ||||
|  | ||||
| // | ||||
| // CONTROLLER TYPE: Keypad / Add-on | ||||
| // Alfawise U30 ILI9341 2.8 TP Ver 1.2 | ||||
| // (Blue PCB on the back of touchscreen) | ||||
| // | ||||
| //#define TOUCH_BUTTONS | ||||
| #if ENABLED(TOUCH_BUTTONS) | ||||
|   #define XPT2046_X_CALIBRATION   12316 | ||||
|   #define XPT2046_Y_CALIBRATION  -8981 | ||||
|   #define XPT2046_X_OFFSET       -43 | ||||
|   #define XPT2046_Y_OFFSET        257 | ||||
| #endif | ||||
|  | ||||
| // | ||||
| // RepRapWorld REPRAPWORLD_KEYPAD v1.1 | ||||
|   | ||||
| @@ -35,9 +35,12 @@ | ||||
| #include "U8glib.h" | ||||
| #include "libmaple/fsmc.h" | ||||
| #include "libmaple/gpio.h" | ||||
| #include "libmaple/dma.h" | ||||
| #include "boards.h" | ||||
|  | ||||
| #define LCD_READ_ID     0x04   /* Read display identification information */ | ||||
| #ifndef LCD_READ_ID | ||||
|   #define LCD_READ_ID 0x04   // Read display identification information (0xD3 on ILI9341) | ||||
| #endif | ||||
|  | ||||
| /* Timing configuration */ | ||||
| #define FSMC_ADDRESS_SETUP_TIME   15  // AddressSetupTime | ||||
| @@ -47,6 +50,10 @@ void LCD_IO_Init(uint8_t cs, uint8_t rs); | ||||
| void LCD_IO_WriteData(uint16_t RegValue); | ||||
| void LCD_IO_WriteReg(uint16_t Reg); | ||||
| uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); | ||||
| #ifdef LCD_USE_DMA_FSMC | ||||
|   void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); | ||||
|   void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); | ||||
| #endif | ||||
|  | ||||
| static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT | ||||
|  | ||||
| @@ -59,21 +66,25 @@ uint8_t u8g_com_stm32duino_fsmc_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, voi | ||||
|   static uint8_t isCommand; | ||||
|  | ||||
|   switch (msg) { | ||||
|     case U8G_COM_MSG_STOP: | ||||
|       break; | ||||
|     case U8G_COM_MSG_STOP: break; | ||||
|     case U8G_COM_MSG_INIT: | ||||
|       u8g_SetPIOutput(u8g, U8G_PI_RESET); | ||||
|  | ||||
|       #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_IO_Init(u8g->pin_list[U8G_PI_CS], u8g->pin_list[U8G_PI_A0]); | ||||
|       u8g_Delay(100); | ||||
|       u8g_Delay(50); | ||||
|  | ||||
|       if (arg_ptr != nullptr) | ||||
|       if (arg_ptr) | ||||
|         *((uint32_t *)arg_ptr) = LCD_IO_ReadData(LCD_READ_ID, 3); | ||||
|  | ||||
|       isCommand = 0; | ||||
|       break; | ||||
|  | ||||
|     case U8G_COM_MSG_ADDRESS:           // define cmd (arg_val = 0) or data mode (arg_val = 1) | ||||
|     case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1) | ||||
|       isCommand = arg_val == 0 ? 1 : 0; | ||||
|       break; | ||||
|  | ||||
| @@ -89,7 +100,6 @@ uint8_t u8g_com_stm32duino_fsmc_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, voi | ||||
|       break; | ||||
|  | ||||
|     case U8G_COM_MSG_WRITE_SEQ: | ||||
|  | ||||
|       for (uint8_t i = 0; i < arg_val; i += 2) | ||||
|         LCD_IO_WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); | ||||
|       break; | ||||
| @@ -107,7 +117,7 @@ __attribute__((always_inline)) __STATIC_INLINE void __DSB(void) { | ||||
|   __ASM volatile ("dsb 0xF":::"memory"); | ||||
| } | ||||
|  | ||||
| #define FSMC_CS_NE1  PD7 | ||||
| #define FSMC_CS_NE1   PD7 | ||||
|  | ||||
| #ifdef STM32_XL_DENSITY | ||||
|   #define FSMC_CS_NE2 PG9 | ||||
| @@ -257,7 +267,7 @@ void LCD_IO_WriteReg(uint16_t Reg) { | ||||
|  | ||||
| uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { | ||||
|   volatile uint32_t data; | ||||
|   LCD->REG = (uint16_t)RegValue; | ||||
|   LCD->REG = RegValue; | ||||
|   __DSB(); | ||||
|  | ||||
|   data = LCD->RAM; // dummy read | ||||
| @@ -267,9 +277,48 @@ uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { | ||||
|     data <<= 8; | ||||
|     data |= (LCD->RAM & 0x00FF); | ||||
|   } | ||||
|   return (uint32_t)data; | ||||
|   return uint32_t(data); | ||||
| } | ||||
|  | ||||
| #endif // HAS_GRAPHICAL_LCD | ||||
| #if ENABLED(LCD_USE_DMA_FSMC) | ||||
|  | ||||
| void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) { | ||||
|   while (count > 0) { | ||||
|     dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, &color, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM); | ||||
|     dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, count > 65535 ? 65535 : count); | ||||
|     dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); | ||||
|     dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); | ||||
|  | ||||
|     while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; | ||||
|     dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); | ||||
|  | ||||
|     count = count > 65535 ? count - 65535 : 0; | ||||
|   } | ||||
| } | ||||
|  | ||||
| void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { | ||||
|   dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | DMA_PINC_MODE); | ||||
|   dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, length); | ||||
|   dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); | ||||
|   dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); | ||||
|  | ||||
|   while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; | ||||
|   dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); | ||||
| } | ||||
|  | ||||
| void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length) { | ||||
|   dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | DMA_PINC_MODE); | ||||
|   dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, length); | ||||
|   dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); | ||||
|   dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); | ||||
| } | ||||
|  | ||||
| void LCD_IO_WaitSequence_Async() { | ||||
|   while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; | ||||
|   dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); | ||||
| } | ||||
|  | ||||
| #endif // LCD_USE_DMA_FSMC | ||||
|  | ||||
| #endif // HAS_GRAPHICAL_LCD | ||||
| #endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN | ||||
|   | ||||
| @@ -57,6 +57,10 @@ | ||||
| #include "gcode/parser.h" | ||||
| #include "gcode/queue.h" | ||||
|  | ||||
| #if ENABLED(TOUCH_BUTTONS) | ||||
|   #include "feature/touch/xpt2046.h" | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(HOST_ACTION_COMMANDS) | ||||
|   #include "feature/host_actions.h" | ||||
| #endif | ||||
| @@ -943,6 +947,10 @@ void setup() { | ||||
|   // This also updates variables in the planner, elsewhere | ||||
|   settings.first_load(); | ||||
|  | ||||
|   #if ENABLED(TOUCH_BUTTONS) | ||||
|     touch.init(); | ||||
|   #endif | ||||
|  | ||||
|   #if HAS_M206_COMMAND | ||||
|     // Initialize current position based on home_offset | ||||
|     LOOP_XYZ(a) current_position[a] += home_offset[a]; | ||||
|   | ||||
							
								
								
									
										129
									
								
								Marlin/src/feature/touch/xpt2046.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								Marlin/src/feature/touch/xpt2046.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,129 @@ | ||||
| /** | ||||
|  * Marlin 3D Printer Firmware | ||||
|  * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include "../../inc/MarlinConfigPre.h" | ||||
|  | ||||
| #if ENABLED(TOUCH_BUTTONS) | ||||
|  | ||||
| #include "xpt2046.h" | ||||
| #include "../../inc/MarlinConfig.h" | ||||
|  | ||||
| #ifndef TOUCH_INT_PIN | ||||
|   #define TOUCH_INT_PIN  -1 | ||||
| #endif | ||||
| #ifndef TOUCH_MISO_PIN | ||||
|   #define TOUCH_MISO_PIN MISO_PIN | ||||
| #endif | ||||
| #ifndef TOUCH_MOSI_PIN | ||||
|   #define TOUCH_MOSI_PIN MOSI_PIN | ||||
| #endif | ||||
| #ifndef TOUCH_SCK_PIN | ||||
|   #define TOUCH_SCK_PIN  SCK_PIN | ||||
| #endif | ||||
| #ifndef TOUCH_CS_PIN | ||||
|   #define TOUCH_CS_PIN   CS_PIN | ||||
| #endif | ||||
|  | ||||
| XPT2046 touch; | ||||
| extern int8_t encoderDiff; | ||||
|  | ||||
| void XPT2046::init(void) { | ||||
|   SET_INPUT(TOUCH_INT_PIN); // Pendrive interrupt pin, used as polling in getInTouch | ||||
|   SET_INPUT(TOUCH_MISO_PIN); | ||||
|   SET_OUTPUT(TOUCH_MOSI_PIN); | ||||
|  | ||||
|   OUT_WRITE(TOUCH_SCK_PIN, 0); | ||||
|   OUT_WRITE(TOUCH_CS_PIN, 1); | ||||
|  | ||||
|   // Read once to enable pendrive status pin | ||||
|   getInTouch(XPT2046_X); | ||||
| } | ||||
|  | ||||
| #include "../../lcd/ultralcd.h" // For EN_C bit mask | ||||
|  | ||||
| uint8_t XPT2046::read_buttons() { | ||||
|   int16_t tsoffsets[4] = { 0 }; | ||||
|  | ||||
|   static uint32_t timeout = 0; | ||||
|   if (PENDING(millis(), timeout)) return 0; | ||||
|   timeout = millis() + 250; | ||||
|  | ||||
|   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. | ||||
|  | ||||
|   if (READ(TOUCH_INT_PIN)) return 0; // If HIGH there are no screen presses. | ||||
|   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 (READ(TOUCH_INT_PIN)) return 0; // Fingers must still be on the TS for a valid read. | ||||
|  | ||||
|   if (y < 185 || y > 224) return 0; | ||||
|  | ||||
|        if (WITHIN(x,  21,  98)) encoderDiff = -(ENCODER_STEPS_PER_MENU_ITEM) * ENCODER_PULSES_PER_STEP; | ||||
|   else if (WITHIN(x, 121, 198)) encoderDiff =   ENCODER_STEPS_PER_MENU_ITEM  * ENCODER_PULSES_PER_STEP; | ||||
|   else if (WITHIN(x, 221, 298)) return EN_C; | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| uint16_t XPT2046::getInTouch(const XPTCoordinate coordinate) { | ||||
|   uint16_t data[3]; | ||||
|  | ||||
|   OUT_WRITE(TOUCH_CS_PIN, LOW); | ||||
|  | ||||
|   const uint8_t coord = uint8_t(coordinate) | XPT2046_CONTROL | XPT2046_DFR_MODE; | ||||
|   for (uint16_t i = 0; i < 3 ; i++) { | ||||
|     for (uint8_t j = 0x80; j; j >>= 1) { | ||||
|       WRITE(TOUCH_SCK_PIN, LOW); | ||||
|       WRITE(TOUCH_MOSI_PIN, bool(coord & j)); | ||||
|       WRITE(TOUCH_SCK_PIN, HIGH); | ||||
|     } | ||||
|  | ||||
|     data[i] = 0; | ||||
|     for (uint16_t j = 0x8000; j; j >>= 1) { | ||||
|       WRITE(TOUCH_SCK_PIN, LOW); | ||||
|       if (READ(TOUCH_MISO_PIN)) data[i] |= j; | ||||
|       WRITE(TOUCH_SCK_PIN, HIGH); | ||||
|     } | ||||
|     WRITE(TOUCH_SCK_PIN, LOW); | ||||
|     data[i] >>= 4; | ||||
|   } | ||||
|  | ||||
|   WRITE(TOUCH_CS_PIN, HIGH); | ||||
|  | ||||
|   uint16_t delta01 = _MAX(data[0], data[1]) - _MIN(data[0], data[1]), | ||||
|            delta02 = _MAX(data[0], data[2]) - _MIN(data[0], data[2]), | ||||
|            delta12 = _MAX(data[1], data[2]) - _MIN(data[1], data[2]); | ||||
|  | ||||
|   if (delta01 <= delta02 && delta01 <= delta12) | ||||
|     return (data[0] + data[1]) >> 1; | ||||
|  | ||||
|   if (delta02 <= delta12) | ||||
|     return (data[0] + data[2]) >> 1; | ||||
|  | ||||
|   return (data[1] + data[2]) >> 1; | ||||
| } | ||||
|  | ||||
| #endif // TOUCH_BUTTONS | ||||
							
								
								
									
										43
									
								
								Marlin/src/feature/touch/xpt2046.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								Marlin/src/feature/touch/xpt2046.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| /** | ||||
|  * Marlin 3D Printer Firmware | ||||
|  * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
| #pragma once | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| // Relies on XPT2046-compatible mode of ADS7843, | ||||
| // hence no Z1 / Z2 measurements are possible. | ||||
|  | ||||
| #define XPT2046_DFR_MODE 0x00 | ||||
| #define XPT2046_SER_MODE 0x04 | ||||
| #define XPT2046_CONTROL  0x80 | ||||
|  | ||||
| enum XPTCoordinate : uint8_t { | ||||
|   XPT2046_X = 0x10, | ||||
|   XPT2046_Y = 0x50 | ||||
| }; | ||||
|  | ||||
| class XPT2046 { | ||||
| public: | ||||
|   static void init(void); | ||||
|   static uint8_t read_buttons(); | ||||
| private: | ||||
|   static uint16_t getInTouch(const XPTCoordinate coordinate); | ||||
| }; | ||||
|  | ||||
| extern XPT2046 touch; | ||||
| @@ -61,14 +61,21 @@ | ||||
|  | ||||
| #include "U8glib.h" | ||||
| #include "HAL_LCD_com_defines.h" | ||||
| #include "string.h" | ||||
| #include <string.h> | ||||
|  | ||||
| #if ENABLED(LCD_USE_DMA_FSMC) | ||||
|   extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); | ||||
|   extern void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length); | ||||
|   extern void LCD_IO_WaitSequence_Async(); | ||||
|   extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); | ||||
| #endif | ||||
|  | ||||
| #define WIDTH 128 | ||||
| #define HEIGHT 64 | ||||
| #define PAGE_HEIGHT 8 | ||||
|  | ||||
| #define X_MIN 32 | ||||
| #define Y_MIN 56 | ||||
| #define Y_MIN 32 | ||||
| #define X_MAX (X_MIN + 2 * WIDTH  - 1) | ||||
| #define Y_MAX (Y_MIN + 2 * HEIGHT - 1) | ||||
|  | ||||
| @@ -76,6 +83,30 @@ | ||||
| #define LCD_ROW         0x2B   /* Row address register */ | ||||
| #define LCD_WRITE_RAM   0x2C | ||||
|  | ||||
| // see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html | ||||
|  | ||||
| #define COLOR_BLACK 0x0000 | ||||
| #define COLOR_WHITE 0xFFFF | ||||
| #define COLOR_BLUE  0x21DD | ||||
| #define COLOR_RED   0xF800 | ||||
| #define COLOR_DARK  0x0003 // Some dark color | ||||
|  | ||||
| #ifndef TFT_MARLINUI_COLOR | ||||
|   #define TFT_MARLINUI_COLOR COLOR_WHITE | ||||
| #endif | ||||
| #ifndef TFT_MARLINBG_COLOR | ||||
|   #define TFT_MARLINBG_COLOR COLOR_BLACK | ||||
| #endif | ||||
| #ifndef TFT_DISABLED_COLOR | ||||
|   #define TFT_DISABLED_COLOR COLOR_DARK | ||||
| #endif | ||||
| #ifndef TFT_BTSLEFT_COLOR | ||||
|   #define TFT_BTSLEFT_COLOR COLOR_BLUE | ||||
| #endif | ||||
| #ifndef TFT_BTRIGHT_COLOR | ||||
|   #define TFT_BTRIGHT_COLOR COLOR_RED | ||||
| #endif | ||||
|  | ||||
| static uint32_t lcd_id = 0; | ||||
|  | ||||
| #define U8G_ESC_DATA(x) (uint8_t)(x >> 8), (uint8_t)(x & 0xFF) | ||||
| @@ -94,6 +125,45 @@ static const uint8_t clear_screen_sequence[] = { | ||||
|   U8G_ESC_END | ||||
| }; | ||||
|  | ||||
| #if ENABLED(TOUCH_BUTTONS) | ||||
|  | ||||
|   static const uint8_t separation_line_sequence_left[] = { | ||||
|     U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(10), U8G_ESC_DATA(159), | ||||
|     U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), U8G_ESC_DATA(170), U8G_ESC_DATA(173), | ||||
|     U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), | ||||
|     U8G_ESC_END | ||||
|   }; | ||||
|  | ||||
|   static const uint8_t separation_line_sequence_right[] = { | ||||
|     U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(160), U8G_ESC_DATA(309), | ||||
|     U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), U8G_ESC_DATA(170), U8G_ESC_DATA(173), | ||||
|     U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), | ||||
|     U8G_ESC_END | ||||
|   }; | ||||
|  | ||||
|   static const uint8_t button0_sequence[] = { | ||||
|     U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(20), U8G_ESC_DATA(99), | ||||
|     U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), U8G_ESC_DATA(185), U8G_ESC_DATA(224), | ||||
|     U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), | ||||
|     U8G_ESC_END | ||||
|   }; | ||||
|  | ||||
|   static const uint8_t button1_sequence[] = { | ||||
|     U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(120), U8G_ESC_DATA(199), | ||||
|     U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), U8G_ESC_DATA(185), U8G_ESC_DATA(224), | ||||
|     U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), | ||||
|     U8G_ESC_END | ||||
|   }; | ||||
|  | ||||
|   static const uint8_t button2_sequence[] = { | ||||
|     U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), U8G_ESC_DATA(220), U8G_ESC_DATA(299), | ||||
|     U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), U8G_ESC_DATA(185), U8G_ESC_DATA(224), | ||||
|     U8G_ESC_ADR(0), LCD_WRITE_RAM, U8G_ESC_ADR(1), | ||||
|     U8G_ESC_END | ||||
|   }; | ||||
|  | ||||
| #endif | ||||
|  | ||||
| static const uint8_t st7789v_init_sequence[] = { // 0x8552 - ST7789V | ||||
|   U8G_ESC_ADR(0), | ||||
|   0x10, | ||||
| @@ -120,53 +190,254 @@ static const uint8_t st7789v_init_sequence[] = { // 0x8552 - ST7789V | ||||
|   U8G_ESC_END | ||||
| }; | ||||
|  | ||||
| static const uint8_t ili9341_init_sequence[] = { // 0x9341 - ILI9341 | ||||
|   U8G_ESC_ADR(0), | ||||
|   0x10, | ||||
|   U8G_ESC_DLY(10), | ||||
|   0x01, | ||||
|   U8G_ESC_DLY(100), U8G_ESC_DLY(100), | ||||
|   0x36, U8G_ESC_ADR(1), 0xE8, | ||||
|   U8G_ESC_ADR(0), 0x3A, U8G_ESC_ADR(1), 0x55, | ||||
|   U8G_ESC_ADR(0), LCD_COLUMN, U8G_ESC_ADR(1), 0x00, 0x00, 0x01, 0x3F, | ||||
|   U8G_ESC_ADR(0), LCD_ROW,    U8G_ESC_ADR(1), 0x00, 0x00, 0x00, 0xEF, | ||||
|   U8G_ESC_ADR(0), 0xC5, U8G_ESC_ADR(1), 0x3E, 0x28, | ||||
|   U8G_ESC_ADR(0), 0xC7, U8G_ESC_ADR(1), 0x86, | ||||
|   U8G_ESC_ADR(0), 0xB1, U8G_ESC_ADR(1), 0x00, 0x18, | ||||
|   U8G_ESC_ADR(0), 0xC0, U8G_ESC_ADR(1), 0x23, | ||||
|   U8G_ESC_ADR(0), 0xC1, U8G_ESC_ADR(1), 0x10, | ||||
|   U8G_ESC_ADR(0), 0x29, | ||||
|   U8G_ESC_ADR(0), 0x11, | ||||
|   U8G_ESC_DLY(100), | ||||
|   U8G_ESC_END | ||||
| }; | ||||
|  | ||||
| #if ENABLED(TOUCH_BUTTONS) | ||||
|  | ||||
|   static const uint8_t button0[] = { | ||||
|      B01111111,B11111111,B11111111,B11111111,B11111110, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00010000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00010000,B00000000,B00000001, | ||||
|      B10000000,B01000000,B00010000,B00000000,B00000001, | ||||
|      B10000000,B11100000,B00010000,B00000000,B00000001, | ||||
|      B10000001,B11110000,B00010000,B00000000,B00000001, | ||||
|      B10000011,B11111000,B00010000,B00000000,B00000001, | ||||
|      B10000111,B11111100,B00010000,B11111111,B11100001, | ||||
|      B10000000,B11100000,B00010000,B11111111,B11100001, | ||||
|      B10000000,B11100000,B00010000,B00000000,B00000001, | ||||
|      B10000000,B11100000,B00010000,B00000000,B00000001, | ||||
|      B10000000,B11100000,B00010000,B00000000,B00000001, | ||||
|      B10000000,B11100000,B00010000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00010000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00010000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B01111111,B11111111,B11111111,B11111111,B11111110, | ||||
|   }; | ||||
|  | ||||
|   static const uint8_t button1[] = { | ||||
|      B01111111,B11111111,B11111111,B11111111,B11111110, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00010000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00010000,B00000110,B00000001, | ||||
|      B10000000,B11100000,B00010000,B00000110,B00000001, | ||||
|      B10000000,B11100000,B00010000,B00000110,B00000001, | ||||
|      B10000000,B11100000,B00010000,B00000110,B00000001, | ||||
|      B10000000,B11100000,B00010000,B00000110,B00000001, | ||||
|      B10000000,B11100000,B00010000,B11111111,B11110001, | ||||
|      B10000111,B11111100,B00010000,B11111111,B11110001, | ||||
|      B10000011,B11111000,B00010000,B00000110,B00000001, | ||||
|      B10000001,B11110000,B00010000,B00000110,B00000001, | ||||
|      B10000000,B11100000,B00010000,B00000110,B00000001, | ||||
|      B10000000,B01000000,B00010000,B00000110,B00000001, | ||||
|      B10000000,B00000000,B00010000,B00000110,B00000001, | ||||
|      B10000000,B00000000,B00010000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B01111111,B11111111,B11111111,B11111111,B11111110, | ||||
|   }; | ||||
|  | ||||
|   static const uint8_t button2[] = { | ||||
|      B01111111,B11111111,B11111111,B11111111,B11111110, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000001,B11000000,B00000001, | ||||
|      B10000000,B00000000,B01000001,B11000000,B00000001, | ||||
|      B10000000,B00000000,B11000001,B11000000,B00000001, | ||||
|      B10000000,B00000001,B11111111,B11000000,B00000001, | ||||
|      B10000000,B00000011,B11111111,B11000000,B00000001, | ||||
|      B10000000,B00000001,B11111111,B11000000,B00000001, | ||||
|      B10000000,B00000000,B11000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B01000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B10000000,B00000000,B00000000,B00000000,B00000001, | ||||
|      B01111111,B11111111,B11111111,B11111111,B11111110, | ||||
|   }; | ||||
|  | ||||
|   void drawImage(const uint8_t *data, u8g_t *u8g, u8g_dev_t *dev, uint16_t length, uint16_t height, uint16_t color) { | ||||
|     uint16_t buffer[160]; | ||||
|  | ||||
|     for (uint16_t i = 0; i < height; i++) { | ||||
|       uint16_t k = 0; | ||||
|       for (uint16_t j = 0; j < length; j++) { | ||||
|         uint16_t v = TFT_MARLINBG_COLOR; | ||||
|         if (*(data + (i * (length >> 3) + (j >> 3))) & (0x80 >> (j & 7))) | ||||
|           v = color; | ||||
|         else | ||||
|           v = TFT_MARLINBG_COLOR; | ||||
|         buffer[k++] = v; buffer[k++] = v; | ||||
|       } | ||||
|       #ifdef LCD_USE_DMA_FSMC | ||||
|         if (k <= 80) { // generally is... for our buttons | ||||
|           memcpy(&buffer[k], &buffer[0], k * sizeof(uint16_t)); | ||||
|           LCD_IO_WriteSequence(buffer, k * sizeof(uint16_t)); | ||||
|         } | ||||
|         else { | ||||
|           LCD_IO_WriteSequence(buffer, k); | ||||
|           LCD_IO_WriteSequence(buffer, k); | ||||
|         } | ||||
|       #else | ||||
|         u8g_WriteSequence(u8g, dev, k << 1, (uint8_t *)buffer); | ||||
|         u8g_WriteSequence(u8g, dev, k << 1, (uint8_t *)buffer); | ||||
|       #endif | ||||
|     } | ||||
|   } | ||||
|  | ||||
| #endif // TOUCH_BUTTONS | ||||
|  | ||||
| // Used to fill RGB565 (16bits) background | ||||
| inline void memset2(const void *ptr, uint16_t fill, size_t cnt) { | ||||
|   uint16_t* wptr = (uint16_t*) ptr; | ||||
|   for (size_t i = 0; i < cnt; i += 2) { | ||||
|      *wptr = fill; | ||||
|      wptr++; | ||||
|   } | ||||
| } | ||||
|  | ||||
| static bool preinit = true; | ||||
| static uint8_t page; | ||||
|  | ||||
| uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { | ||||
|   u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); | ||||
|   uint16_t buffer[256]; | ||||
|   uint32_t i, j, k; | ||||
|  | ||||
|   #ifdef LCD_USE_DMA_FSMC | ||||
|     static uint16_t bufferA[512], bufferB[512]; | ||||
|     uint16_t* buffer = &bufferA[0]; | ||||
|     bool allow_async = true; | ||||
|   #else | ||||
|     uint16_t buffer[256]; // 16-bit RGB 565 pixel line buffer | ||||
|   #endif | ||||
|   uint16_t i; | ||||
|   switch (msg) { | ||||
|     case U8G_DEV_MSG_INIT: | ||||
|       dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, &lcd_id); | ||||
|       if (lcd_id == 0x040404) return 0; // No connected display on FSMC | ||||
|       if (lcd_id == 0xFFFFFF) return 0; // No connected display on SPI | ||||
|  | ||||
|       memset(buffer, 0x00, sizeof(buffer)); | ||||
|  | ||||
|       if ((lcd_id & 0xFFFF) == 0x8552)  // ST7789V | ||||
|         u8g_WriteEscSeqP(u8g, dev, st7789v_init_sequence); | ||||
|       if ((lcd_id & 0xFFFF) == 0x9341)  // ILI9341 | ||||
|         u8g_WriteEscSeqP(u8g, dev, ili9341_init_sequence); | ||||
|  | ||||
|       if (preinit) { | ||||
|         preinit = false; | ||||
|         return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); | ||||
|       } | ||||
|  | ||||
|       u8g_WriteEscSeqP(u8g, dev, clear_screen_sequence); | ||||
|       for (i = 0; i < 960; i++) | ||||
|         u8g_WriteSequence(u8g, dev, 160, (uint8_t *)buffer); | ||||
|       break; | ||||
|       #ifdef LCD_USE_DMA_FSMC | ||||
|         LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, (320*240)); | ||||
|       #else | ||||
|         memset2(buffer, TFT_MARLINBG_COLOR, 160); | ||||
|         for (uint16_t i = 0; i < 960; i++) | ||||
|           u8g_WriteSequence(u8g, dev, 160, (uint8_t *)buffer); | ||||
|       #endif | ||||
|  | ||||
|     case U8G_DEV_MSG_STOP: | ||||
|       break; | ||||
|       // bottom line and buttons | ||||
|       #if ENABLED(TOUCH_BUTTONS) | ||||
|  | ||||
|         #ifdef LCD_USE_DMA_FSMC | ||||
|           u8g_WriteEscSeqP(u8g, dev, separation_line_sequence_left); | ||||
|           LCD_IO_WriteMultiple(TFT_DISABLED_COLOR, 300); | ||||
|           u8g_WriteEscSeqP(u8g, dev, separation_line_sequence_right); | ||||
|           LCD_IO_WriteMultiple(TFT_DISABLED_COLOR, 300); | ||||
|         #else | ||||
|           memset2(buffer, TFT_DISABLED_COLOR, 150); | ||||
|           u8g_WriteEscSeqP(u8g, dev, separation_line_sequence_left); | ||||
|           for (uint8_t i = 4; i--;) | ||||
|             u8g_WriteSequence(u8g, dev, 150, (uint8_t *)buffer); | ||||
|           u8g_WriteEscSeqP(u8g, dev, separation_line_sequence_right); | ||||
|           for (uint8_t i = 4; i--;) | ||||
|             u8g_WriteSequence(u8g, dev, 150, (uint8_t *)buffer); | ||||
|         #endif | ||||
|  | ||||
|         u8g_WriteEscSeqP(u8g, dev, button0_sequence); | ||||
|         drawImage(button0, u8g, dev, 40, 20, TFT_BTSLEFT_COLOR); | ||||
|  | ||||
|         u8g_WriteEscSeqP(u8g, dev, button1_sequence); | ||||
|         drawImage(button1, u8g, dev, 40, 20, TFT_BTSLEFT_COLOR); | ||||
|  | ||||
|         u8g_WriteEscSeqP(u8g, dev, button2_sequence); | ||||
|         drawImage(button2, u8g, dev, 40, 20, TFT_BTRIGHT_COLOR); | ||||
|  | ||||
|       #endif // TOUCH_BUTTONS | ||||
|  | ||||
|       return 0; | ||||
|  | ||||
|     case U8G_DEV_MSG_STOP: preinit = true; break; | ||||
|  | ||||
|     case U8G_DEV_MSG_PAGE_FIRST: | ||||
|       page = 0; | ||||
|       u8g_WriteEscSeqP(u8g, dev, page_first_sequence); | ||||
|       break; | ||||
|  | ||||
|     case U8G_DEV_MSG_PAGE_NEXT: | ||||
|       for (j = 0; j < 8; j++) { | ||||
|         k = 0; | ||||
|         for (i = 0; i < (uint32_t)pb->width; i++) { | ||||
|       if (++page > 8) return 1; | ||||
|  | ||||
|       for (uint8_t y = 0; y < 8; y++) { | ||||
|         uint32_t k = 0; | ||||
|         #ifdef LCD_USE_DMA_FSMC | ||||
|           buffer = (y & 1) ? bufferB : bufferA; | ||||
|         #endif | ||||
|         for (uint16_t i = 0; i < (uint32_t)pb->width; i++) { | ||||
|           const uint8_t b = *(((uint8_t *)pb->buf) + i); | ||||
|           const uint16_t c = TEST(b, j) ? 0x7FFF : 0x0000; | ||||
|           const uint16_t c = TEST(b, y) ? TFT_MARLINUI_COLOR : TFT_MARLINBG_COLOR; | ||||
|           buffer[k++] = c; buffer[k++] = c; | ||||
|         } | ||||
|         for (k = 0; k < 2; k++) { | ||||
|           u8g_WriteSequence(u8g, dev, 128, (uint8_t*)buffer); | ||||
|           u8g_WriteSequence(u8g, dev, 128, (uint8_t*)&(buffer[64])); | ||||
|           u8g_WriteSequence(u8g, dev, 128, (uint8_t*)&(buffer[128])); | ||||
|           u8g_WriteSequence(u8g, dev, 128, (uint8_t*)&(buffer[192])); | ||||
|         } | ||||
|         #ifdef LCD_USE_DMA_FSMC | ||||
|           memcpy(&buffer[256], &buffer[0], 512); | ||||
|           if (allow_async) { | ||||
|             if (y > 0 || page > 1) LCD_IO_WaitSequence_Async(); | ||||
|             if (y == 7 && page == 8) | ||||
|               LCD_IO_WriteSequence(buffer, 512); // last line of last page | ||||
|             else | ||||
|               LCD_IO_WriteSequence_Async(buffer, 512); | ||||
|           } | ||||
|           else | ||||
|             LCD_IO_WriteSequence(buffer, 512); | ||||
|         #else | ||||
|           for (uint8_t i = 2; i--;) { | ||||
|             u8g_WriteSequence(u8g, dev, 128, (uint8_t*)buffer); | ||||
|             u8g_WriteSequence(u8g, dev, 128, (uint8_t*)&(buffer[64])); | ||||
|             u8g_WriteSequence(u8g, dev, 128, (uint8_t*)&(buffer[128])); | ||||
|             u8g_WriteSequence(u8g, dev, 128, (uint8_t*)&(buffer[192])); | ||||
|           } | ||||
|         #endif | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     case U8G_DEV_MSG_SLEEP_ON: | ||||
|       // Enter Sleep Mode (10h) | ||||
|       return 1; | ||||
|     case U8G_DEV_MSG_SLEEP_OFF: | ||||
|       // Sleep Out (11h) | ||||
|       return 1; | ||||
|   } | ||||
|   return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); | ||||
| @@ -174,4 +445,4 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u | ||||
|  | ||||
| U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tft_320x240_upscale_from_128x64_fn, U8G_COM_HAL_FSMC_FN); | ||||
|  | ||||
| #endif // HAS_GRAPHICAL_LCD | ||||
| #endif // HAS_GRAPHICAL_LCD && FSMC_CS | ||||
|   | ||||
| @@ -102,6 +102,11 @@ | ||||
|   #if HAS_SLOW_BUTTONS | ||||
|     volatile uint8_t MarlinUI::slow_buttons; | ||||
|   #endif | ||||
|   #if ENABLED(TOUCH_BUTTONS) | ||||
|     #include "../feature/touch/xpt2046.h" | ||||
|     volatile uint8_t MarlinUI::touch_buttons; | ||||
|     uint8_t MarlinUI::read_touch_buttons() { return touch.read_buttons(); } | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(INIT_SDCARD_ON_BOOT) | ||||
| @@ -324,8 +329,13 @@ void MarlinUI::init() { | ||||
|     #endif | ||||
|   #endif | ||||
|  | ||||
|   #if HAS_ENCODER_ACTION && HAS_SLOW_BUTTONS | ||||
|     slow_buttons = 0; | ||||
|   #if HAS_ENCODER_ACTION | ||||
|     #if HAS_SLOW_BUTTONS | ||||
|       slow_buttons = 0; | ||||
|     #endif | ||||
|     #if ENABLED(TOUCH_BUTTONS) | ||||
|       touch_buttons = 0; | ||||
|     #endif | ||||
|   #endif | ||||
|  | ||||
|   update_buttons(); | ||||
| @@ -823,6 +833,11 @@ void MarlinUI::update() { | ||||
|  | ||||
|     next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL; | ||||
|  | ||||
|     #if ENABLED(TOUCH_BUTTONS) | ||||
|       if (on_status_screen()) | ||||
|         next_lcd_update_ms += (LCD_UPDATE_INTERVAL) * 2; | ||||
|     #endif | ||||
|  | ||||
|     #if ENABLED(LCD_HAS_STATUS_INDICATORS) | ||||
|       update_indicators(); | ||||
|     #endif | ||||
| @@ -833,6 +848,10 @@ void MarlinUI::update() { | ||||
|         slow_buttons = read_slow_buttons(); // Buttons that take too long to read in interrupt context | ||||
|       #endif | ||||
|  | ||||
|       #if ENABLED(TOUCH_BUTTONS) | ||||
|         touch_buttons = read_touch_buttons(); | ||||
|       #endif | ||||
|  | ||||
|       #if ENABLED(REPRAPWORLD_KEYPAD) | ||||
|  | ||||
|         if (handle_keypad()) { | ||||
| @@ -1180,6 +1199,9 @@ void MarlinUI::update() { | ||||
|           #if HAS_SLOW_BUTTONS | ||||
|             | slow_buttons | ||||
|           #endif | ||||
|           #if ENABLED(TOUCH_BUTTONS) | ||||
|             | touch_buttons | ||||
|           #endif | ||||
|         ; | ||||
|       #elif HAS_ADC_BUTTONS | ||||
|         buttons = 0; | ||||
|   | ||||
| @@ -56,7 +56,11 @@ | ||||
|     uint8_t get_ADC_keyValue(); | ||||
|   #endif | ||||
|  | ||||
|   #define LCD_UPDATE_INTERVAL 100 | ||||
|   #if ENABLED(TOUCH_BUTTONS) | ||||
|     #define LCD_UPDATE_INTERVAL 50 | ||||
|   #else | ||||
|     #define LCD_UPDATE_INTERVAL 100 | ||||
|   #endif | ||||
|  | ||||
|   #if HAS_LCD_MENU | ||||
|  | ||||
| @@ -497,6 +501,11 @@ public: | ||||
|       static volatile uint8_t slow_buttons; | ||||
|       static uint8_t read_slow_buttons(); | ||||
|     #endif | ||||
|     #if ENABLED(TOUCH_BUTTONS) | ||||
|       static volatile uint8_t touch_buttons; | ||||
|       static uint8_t read_touch_buttons(); | ||||
|     #endif | ||||
|  | ||||
|     static void update_buttons(); | ||||
|     static inline bool button_pressed() { return BUTTON_CLICK(); } | ||||
|     #if EITHER(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) | ||||
|   | ||||
| @@ -1160,3 +1160,15 @@ | ||||
| #if PIN_EXISTS(FET_SAFETY) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, FET_SAFETY_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(TOUCH_MISO) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, TOUCH_MISO_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(TOUCH_MOSI) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, TOUCH_MOSI_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(TOUCH_SCK) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, TOUCH_SCK_PIN) | ||||
| #endif | ||||
| #if PIN_EXISTS(TOUCH_CS) | ||||
|   REPORT_NAME_DIGITAL(__LINE__, TOUCH_CS_PIN) | ||||
| #endif | ||||
|   | ||||
| @@ -103,13 +103,13 @@ | ||||
| // | ||||
| #if ENABLED(TMC_USE_SW_SPI) | ||||
|   #ifndef TMC_SW_MOSI | ||||
|     #define TMC_SW_MOSI      PC12 | ||||
|     #define TMC_SW_MOSI    PC12 | ||||
|   #endif | ||||
|   #ifndef TMC_SW_MISO | ||||
|     #define TMC_SW_MISO      PC11 | ||||
|     #define TMC_SW_MISO    PC11 | ||||
|   #endif | ||||
|   #ifndef TMC_SW_SCK | ||||
|     #define TMC_SW_SCK       PC10 | ||||
|     #define TMC_SW_SCK     PC10 | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -117,10 +117,13 @@ | ||||
| #define BEEPER_PIN         PC3    // use PB7 to shut up if desired | ||||
| #define LED_PIN            PC13 | ||||
|  | ||||
| // | ||||
| // Touch support | ||||
| #define BTN_ENC            PA11   // Real pin is needed to enable encoder's push button functionality used by touch screen. PA11 gives stable value. | ||||
|  | ||||
| #define TOUCH_CS           PA4 | ||||
| //#define TOUCH_INTERRUPT    PC4    // Not yet implemented | ||||
| // | ||||
| #if ENABLED(TOUCH_BUTTONS) | ||||
|   #define BTN_ENC          PA11   // Real pin needed to enable encoder's push button functionality used by touch screen. PA11 gives stable value. | ||||
|   #define TOUCH_CS_PIN     PA4 | ||||
|   #define TOUCH_INT_PIN    PC4 | ||||
| #endif | ||||
|  | ||||
| #define NO_PAUSE_AFTER_PRINT | ||||
|   | ||||
| @@ -53,6 +53,10 @@ | ||||
| #define Z_MIN_PIN          PA11 | ||||
| #define Z_MAX_PIN          PC4 | ||||
|  | ||||
| #ifndef FIL_RUNOUT_PIN | ||||
|   #define FIL_RUNOUT_PIN   PF11  // MT_DET | ||||
| #endif | ||||
|  | ||||
| // | ||||
| // Steppers | ||||
| // | ||||
| @@ -76,44 +80,54 @@ | ||||
| // Temperature Sensors | ||||
| // | ||||
| #define TEMP_0_PIN         PC1   // TH1 | ||||
| //#define TEMP_1_PIN         PC2   // TH2 | ||||
| #define TEMP_BED_PIN       PC0   // TB1 | ||||
|  | ||||
| // | ||||
| // Heaters / Fans | ||||
| // | ||||
| #define HEATER_0_PIN       PC3   // HEATER1 | ||||
| //#define HEATER_1_PIN       PA6   // HEATER2 | ||||
| #define HEATER_BED_PIN     PA0   // HOT BED | ||||
|  | ||||
| #define FAN_PIN            PB1   // FAN | ||||
|  | ||||
| #define BTN_ENC            PB3   // Pin is not connected. Real pin is needed to enable encoder's push button functionality used by touch screen | ||||
|  | ||||
| // | ||||
| // Thermocouples | ||||
| // | ||||
| //#define MAX6675_SS_PIN     PE5  // TC1 - CS1 | ||||
| //#define MAX6675_SS_PIN     PE6  // TC2 - CS2 | ||||
|  | ||||
| // | ||||
| // Misc. Functions | ||||
| // | ||||
| #define POWER_LOSS_PIN     PA2   // PW_DET | ||||
| #define PS_ON_PIN          PA3   // PW_OFF | ||||
| #define FIL_RUNOUT_PIN     PF11  // MT_DET | ||||
|  | ||||
| #define BEEPER_PIN         PC5 | ||||
| //#define LED_PIN            PB2 | ||||
|  | ||||
| // | ||||
| // LCD / Controller | ||||
| // | ||||
| #define BEEPER_PIN         PC5 | ||||
| #define SD_DETECT_PIN      PD12 | ||||
|  | ||||
| /** | ||||
|  * Note: MKS Robin TFT screens use various TFT controllers. | ||||
|  * If the screen stays white, disable 'LCD_RESET_PIN' | ||||
|  * to let the bootloader init the screen. | ||||
|  */ | ||||
| #define LCD_RESET_PIN      PF6 | ||||
| #define NO_LCD_REINIT             // Suppress LCD re-initialization | ||||
| #if ENABLED(MKS_ROBIN_TFT) | ||||
|   #define LCD_RESET_PIN    PF6 | ||||
|   #define NO_LCD_REINIT           // Suppress LCD re-initialization | ||||
|  | ||||
| #define LCD_BACKLIGHT_PIN  PD13 | ||||
| #define FSMC_CS_PIN        PD7    // NE4 | ||||
| #define FSMC_RS_PIN        PD11   // A0 | ||||
| #define TOUCH_CS           PC2 | ||||
|   #define LCD_BACKLIGHT_PIN PD13 | ||||
|  | ||||
| #define SD_DETECT_PIN      PD12 | ||||
|   #if ENABLED(TOUCH_BUTTONS) | ||||
|     #define BTN_ENC        PB3    // Not connected. TODO: Replace this hack to enable button code | ||||
|     #define FSMC_CS_PIN    PD7    // NE4 | ||||
|     #define FSMC_RS_PIN    PD11   // A0 | ||||
|     #define TOUCH_CS_PIN   PC2 | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| // Motor current PWM pins | ||||
| #define MOTOR_CURRENT_PWM_XY_PIN   PA6 | ||||
|   | ||||
| @@ -51,6 +51,10 @@ | ||||
| #define Z_MIN_PIN         PA11 | ||||
| #define Z_MAX_PIN         PC4 | ||||
|  | ||||
| #ifndef FIL_RUNOUT_PIN | ||||
|   #define FIL_RUNOUT_PIN   PA4   // MT_DET | ||||
| #endif | ||||
|  | ||||
| // | ||||
| // Steppers | ||||
| // | ||||
| @@ -90,29 +94,41 @@ | ||||
|  | ||||
| #define FAN_PIN            PB1   // FAN | ||||
|  | ||||
| #define BTN_ENC            PC13  // Pin is not connected. Real pin is needed to enable encoder's push button functionality used by touch screen | ||||
|  | ||||
| // | ||||
| // Thermocouples | ||||
| // | ||||
| //#define MAX6675_SS_PIN     PE5  // TC1 - CS1 | ||||
| //#define MAX6675_SS_PIN     PE6  // TC2 - CS2 | ||||
|  | ||||
| // | ||||
| // Misc. Functions | ||||
| // | ||||
| #define POWER_LOSS_PIN     PA2   // PW_DET | ||||
| #define PS_ON_PIN          PA3   // PW_OFF | ||||
| #define FIL_RUNOUT_PIN     PA4   // MT_DET | ||||
|  | ||||
| #define BEEPER_PIN         PC5 | ||||
| #define LED_PIN            PB2 | ||||
|  | ||||
| // | ||||
| // LCD / Controller | ||||
| // | ||||
| #define BEEPER_PIN         PC5 | ||||
| #define SD_DETECT_PIN      PD12 | ||||
|  | ||||
| /** | ||||
|  * Note: MKS Robin TFT screens use various TFT controllers. | ||||
|  * If the screen stays white, disable 'LCD_RESET_PIN' | ||||
|  * to let the bootloader init the screen. | ||||
|  */ | ||||
| #define LCD_RESET_PIN      PF6 | ||||
| #define NO_LCD_REINIT             // Suppress LCD re-initialization | ||||
| #if ENABLED(MKS_ROBIN_TFT) | ||||
|   #define LCD_RESET_PIN      PF6 | ||||
|   #define NO_LCD_REINIT             // Suppress LCD re-initialization | ||||
|  | ||||
| #define LCD_BACKLIGHT_PIN  PD13 | ||||
| #define FSMC_CS_PIN        PD7   // NE4 | ||||
| #define FSMC_RS_PIN        PD11  // A0 | ||||
| #define TOUCH_CS           PA7 | ||||
|   #define LCD_BACKLIGHT_PIN  PD13 | ||||
|  | ||||
| #define SD_DETECT_PIN      PD12 | ||||
|   #if ENABLED(TOUCH_BUTTONS) | ||||
|     #define BTN_ENC          PC13   // Not connected. TODO: Replace this hack to enable button code | ||||
|     #define FSMC_CS_PIN      PD7    // NE4 | ||||
|     #define FSMC_RS_PIN      PD11   // A0 | ||||
|     #define TOUCH_CS_PIN     PA7 | ||||
|   #endif | ||||
| #endif | ||||
|   | ||||
| @@ -143,7 +143,15 @@ | ||||
|     #endif | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(NEWPANEL) | ||||
|   #if ENABLED(TOUCH_BUTTONS) | ||||
|  | ||||
|     #define TOUCH_CS_PIN   PB12   // SPI2_NSS | ||||
|     #define TOUCH_SCK_PIN  PB13 | ||||
|     #define TOUCH_MOSI_PIN PB14 | ||||
|     #define TOUCH_MISO_PIN PB15 | ||||
|     #define TOUCH_INT_PIN  PC6   // (PenIRQ coming from ADS7843) | ||||
|  | ||||
|   #elif ENABLED(NEWPANEL) | ||||
|  | ||||
|     #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user