diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 793f6709855d7..4a848a068e2dc 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1509,10 +1509,9 @@ #endif // -// FSMC / SPI Graphical TFT +// FSMC Graphical TFT // -#if TFT_SCALED_DOGLCD - //#define GRAPHICAL_TFT_ROTATE_180 +#if ENABLED(FSMC_GRAPHICAL_TFT) //#define TFT_MARLINUI_COLOR 0xFFFF // White //#define TFT_MARLINBG_COLOR 0x0000 // Black //#define TFT_DISABLED_COLOR 0x0003 // Almost black diff --git a/Marlin/src/HAL/STM32F1/SPI.h b/Marlin/src/HAL/STM32F1/SPI.h index 0d20a46577e75..dc2a21586560b 100644 --- a/Marlin/src/HAL/STM32F1/SPI.h +++ b/Marlin/src/HAL/STM32F1/SPI.h @@ -208,8 +208,6 @@ class SPIClass { */ void setDataSize(uint32_t ds); - uint32_t getDataSize() { return _currentSetting->dataSize; } - /* Victor Perez 2017. Added to set and clear callback functions for callback * on DMA transfer completion. * onReceive used to set the callback in case of dmaTransfer (tx/rx), once rx is completed diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp deleted file mode 100644 index 286dcfb5d0dca..0000000000000 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 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 . - * - */ -#ifdef __STM32F1__ - -#include "../../../inc/MarlinConfig.h" - -#if BOTH(HAS_GRAPHICAL_LCD, SPI_GRAPHICAL_TFT) && DISABLED(FORCE_SOFT_SPI) - -#include "../HAL.h" -#include -#include - -#define SPI_TFT_CS_H OUT_WRITE(SPI_TFT_CS_PIN, HIGH) -#define SPI_TFT_CS_L OUT_WRITE(SPI_TFT_CS_PIN, LOW) - -#define SPI_TFT_DC_H OUT_WRITE(SPI_TFT_DC_PIN, HIGH) -#define SPI_TFT_DC_L OUT_WRITE(SPI_TFT_DC_PIN, LOW) - -#define SPI_TFT_RST_H OUT_WRITE(SPI_TFT_RST_PIN, HIGH) -#define SPI_TFT_RST_L OUT_WRITE(SPI_TFT_RST_PIN, LOW) - -#define SPI_TFT_BLK_H OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH) -#define SPI_TFT_BLK_L OUT_WRITE(LCD_BACKLIGHT_PIN, LOW) - -void LCD_IO_Init(uint8_t cs, uint8_t rs); -void LCD_IO_WriteData(uint16_t RegValue); -void LCD_IO_WriteReg(uint16_t Reg); -uint16_t LCD_IO_ReadData(uint16_t RegValue); -uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); -#ifdef LCD_USE_DMA_SPI - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); -#endif - -void LCD_WR_REG(uint8_t cmd) { - SPI_TFT_CS_L; - SPI_TFT_DC_L; - SPI.send(cmd); - SPI_TFT_CS_H; -} -void LCD_WR_DATA(uint8_t data) { - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.send(data); - SPI_TFT_CS_H; -} - -void spi1Init(uint8_t spiRate) { - SPI_TFT_CS_H; - - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - uint8_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - SPI.setModule(1); - SPI.begin(); - SPI.setClockDivider(clock); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); -} - -void LCD_IO_Init(uint8_t cs, uint8_t rs) { - spi1Init(SPI_FULL_SPEED); -} - -void LCD_IO_WriteData(uint16_t RegValue) { - LCD_WR_DATA(RegValue); -} - -void LCD_IO_WriteReg(uint16_t Reg) { - LCD_WR_REG(Reg); -} - -uint16_t LCD_IO_ReadData(uint16_t RegValue) { - uint16_t d = 0; - SPI_TFT_CS_L; - - SPI_TFT_DC_L; - SPI.send(RegValue); - SPI_TFT_DC_H; - - SPI.read((uint8_t*)&d, 1); //dummy read - SPI.read((uint8_t*)&d, 1); - - SPI_TFT_CS_H; - return d >> 7; -} - -uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { - uint32_t data = 0; - uint8_t d = 0; - SPI_TFT_CS_L; - - SPI_TFT_DC_L; - SPI.send(RegValue); - SPI_TFT_DC_H; - - SPI.read((uint8_t*)&d, 1); //dummy read - SPI.read((uint8_t*)&d, 1); - data = d; - while (--ReadSize) { - data <<= 8; - SPI.read((uint8_t*)&d, 1); - data |= (d & 0xFF); - } - - SPI_TFT_CS_H; - return uint32_t(data >> 7); -} - -#ifdef LCD_USE_DMA_SPI - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count) { - if (SPI.getDataSize() == DATA_SIZE_8BIT) { - count *= 2; - } - while (count > 0) { - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(&data, 1, true); - SPI_TFT_CS_H; - count--; - } - } - - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { - if (SPI.getDataSize() == DATA_SIZE_8BIT) { - length *= 2; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(data, length, true); - SPI_TFT_CS_H; - } - - void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length) { - if (SPI.getDataSize() == DATA_SIZE_8BIT) { - length *= 2; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSendAsync(data, length, true); - SPI_TFT_CS_H; - } - - void LCD_IO_WaitSequence_Async() { - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSendAsync(NULL, 0, true); - SPI_TFT_CS_H; - } -#endif - -static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT - -#ifndef LCD_READ_ID - #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) -#endif - -uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - if (msgInitCount) { - if (msg == U8G_COM_MSG_INIT) msgInitCount--; - if (msgInitCount) return -1; - } - - static uint8_t isCommand; - - LCD_IO_Init(-1, -1); - - switch (msg) { - case U8G_COM_MSG_STOP: break; - case U8G_COM_MSG_INIT: - u8g_SetPIOutput(u8g, U8G_PI_RESET); - - u8g_Delay(50); - - if (arg_ptr) { - spi1Init(SPI_EIGHTH_SPEED); - *((uint32_t *)arg_ptr) = (LCD_READ_ID << 24) | LCD_IO_ReadData(LCD_READ_ID, 3); - spi1Init(SPI_FULL_SPEED); - } - isCommand = 0; - break; - - case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1) - isCommand = arg_val == 0 ? 1 : 0; - break; - - case U8G_COM_MSG_RESET: - u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); - break; - - case U8G_COM_MSG_WRITE_BYTE: - if (isCommand) - LCD_IO_WriteReg(arg_val); - else - LCD_IO_WriteData((uint16_t)arg_val); - 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; - - } - return 1; -} - -#endif // HAS_GRAPHICAL_LCD -#endif // STM32F1 diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/feature/touch/xpt2046.cpp index d613fbc89a986..235c17b50c850 100644 --- a/Marlin/src/feature/touch/xpt2046.cpp +++ b/Marlin/src/feature/touch/xpt2046.cpp @@ -23,14 +23,10 @@ #include "xpt2046.h" #include "../../inc/MarlinConfig.h" - -#if TFT_SCALED_DOGLCD +#if ENABLED(FSMC_GRAPHICAL_TFT) #include "../../lcd/dogm/ultralcd_DOGM.h" // for LCD_FULL_PIXEL_WIDTH, etc. #endif -#ifndef XPT2046_Z1_THRESHOLD - #define XPT2046_Z1_THRESHOLD 10 -#endif /* * Draw and Touch processing @@ -121,15 +117,10 @@ uint8_t XPT2046::read_buttons() { // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible. if (!isTouched()) return 0; - 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]; + const uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1], + y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3]; if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read. - #if ENABLED(GRAPHICAL_TFT_ROTATE_180) - x = TOUCH_SCREEN_WIDTH - x; - y = TOUCH_SCREEN_HEIGHT - y; - #endif - // Touch within the button area simulates an encoder button if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) return WITHIN(x, 14, 77) ? EN_D @@ -160,69 +151,30 @@ bool XPT2046::isTouched() { ); } -#if ENABLED(TOUCH_BUTTONS_HW_SPI) - #include - - static void touch_spi_init(uint8_t spiRate) { - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - uint8_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - SPI.setModule(TOUCH_BUTTONS_HW_SPI_DEVICE); - SPI.begin(); - SPI.setClockDivider(clock); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); - } -#endif // TOUCH_BUTTONS_HW_SPI - uint16_t XPT2046::getInTouch(const XPTCoordinate coordinate) { uint16_t data[3]; - const uint8_t coord = uint8_t(coordinate) | XPT2046_CONTROL | XPT2046_DFR_MODE; - #if ENABLED(TOUCH_BUTTONS_HW_SPI) + OUT_WRITE(TOUCH_CS_PIN, LOW); - touch_spi_init(SPI_SPEED_6); - for (uint16_t i = 0; i < 3; i++) { - OUT_WRITE(TOUCH_CS_PIN, LOW); - SPI.transfer(coord); - data[i] = (((SPI.transfer(0xFF) << 8) | SPI.transfer(0xFF)) >> 3) & 0x0FFF; - WRITE(TOUCH_CS_PIN, HIGH); + 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); } - #else // !TOUCH_BUTTONS_HW_SPI - - OUT_WRITE(TOUCH_CS_PIN, LOW); - 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); - } + data[i] = 0; + for (uint16_t j = 0x8000; j; j >>= 1) { WRITE(TOUCH_SCK_PIN, LOW); - data[i] >>= 4; + if (READ(TOUCH_MISO_PIN)) data[i] |= j; + WRITE(TOUCH_SCK_PIN, HIGH); } - WRITE(TOUCH_CS_PIN, HIGH); + WRITE(TOUCH_SCK_PIN, LOW); + data[i] >>= 4; + } - #endif // !TOUCH_BUTTONS_HW_SPI + 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]), diff --git a/Marlin/src/feature/touch/xpt2046.h b/Marlin/src/feature/touch/xpt2046.h index 467317901b2b4..347881e0addcc 100644 --- a/Marlin/src/feature/touch/xpt2046.h +++ b/Marlin/src/feature/touch/xpt2046.h @@ -34,6 +34,10 @@ enum XPTCoordinate : uint8_t { XPT2046_Z2 = 0x40 }; +#ifndef XPT2046_Z1_THRESHOLD + #define XPT2046_Z1_THRESHOLD 10 +#endif + class XPT2046 { public: static void init(); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 1605ced3c8a01..992a788eb54ec 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -261,11 +261,7 @@ #endif // FSMC/SPI TFT Panels -#if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) - #define TFT_SCALED_DOGLCD 1 -#endif - -#if TFT_SCALED_DOGLCD +#if ENABLED(FSMC_GRAPHICAL_TFT) #define DOGLCD #define IS_ULTIPANEL #define DELAYED_BACKLIGHT_INIT diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index c7171b06d8065..e12310e07c51a 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -373,7 +373,7 @@ #endif -#if ANY(LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) +#if EITHER(LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) #define NO_LCD_REINIT 1 // Suppress LCD re-initialization #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 9fb742f505726..9fde639b0f26f 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -451,6 +451,8 @@ #error "MKS_ROBIN_TFT is now FSMC_GRAPHICAL_TFT. Please update your configuration." #elif defined(TFT_LVGL_UI) #error "TFT_LVGL_UI is now TFT_LVGL_UI_FSMC. Please update your configuration." +#elif defined(SPI_GRAPHICAL_TFT) + #error "SPI_GRAPHICAL_TFT is now TFT_LVGL_UI_SPI. Please update your configuration." #elif defined(SDPOWER) #error "SDPOWER is now SDPOWER_PIN. Please update your configuration and/or pins." #elif defined(STRING_SPLASH_LINE1) || defined(STRING_SPLASH_LINE2) @@ -3034,27 +3036,11 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif /** - * Stepper Chunk support + * Sanity checks for stepper chunk support */ -#if BOTH(DIRECT_STEPPING, LIN_ADVANCE) - #error "DIRECT_STEPPING is incompatible with LIN_ADVANCE. Enable in external planner if possible." -#endif - -/** - * Touch Buttons - */ -#if ENABLED(TOUCH_BUTTONS) - #ifndef XPT2046_X_CALIBRATION - #error "XPT2046_X_CALIBRATION must be defined with TOUCH_BUTTONS." - #endif - #ifndef XPT2046_Y_CALIBRATION - #error "XPT2046_Y_CALIBRATION must be defined with TOUCH_BUTTONS." - #endif - #ifndef XPT2046_X_OFFSET - #error "XPT2046_X_OFFSET must be defined with TOUCH_BUTTONS." - #endif - #ifndef XPT2046_Y_OFFSET - #error "XPT2046_Y_OFFSET must be defined with TOUCH_BUTTONS." +#if ENABLED(DIRECT_STEPPING) + #if ENABLED(LIN_ADVANCE) + #error "DIRECT_STEPPING is incompatible with LIN_ADVANCE. Enable in external planner if possible." #endif #endif diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h index 1f9621e9c05e0..df7f8dd44b8ff 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -87,11 +87,6 @@ #define U8G_COM_HAL_FSMC_FN u8g_com_stm32duino_fsmc_fn #endif - #if ENABLED(SPI_GRAPHICAL_TFT) - uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_FSMC_FN u8g_com_stm32duino_spi_fn - #endif - #elif defined(TARGET_LPC1768) uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index 33cd5ecca6d2e..fc7a22b261432 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -57,21 +57,14 @@ #include "../../inc/MarlinConfig.h" -#if HAS_GRAPHICAL_LCD && (PIN_EXISTS(FSMC_CS) || ENABLED(SPI_GRAPHICAL_TFT)) +#if HAS_GRAPHICAL_LCD && PIN_EXISTS(FSMC_CS) #include "HAL_LCD_com_defines.h" #include "ultralcd_DOGM.h" #include -#if EITHER(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI) - #define HAS_LCD_IO 1 -#endif - -#if HAS_LCD_IO - extern void LCD_IO_Init(uint8_t cs, uint8_t rs); - extern uint16_t LCD_IO_ReadData(uint16_t Reg); - extern uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); +#ifdef LCD_USE_DMA_FSMC extern void LCD_IO_WriteReg(uint16_t Reg); extern void LCD_IO_WriteData(uint16_t RegValue); extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); @@ -155,34 +148,46 @@ static uint32_t lcd_id = 0; static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { - #if HAS_LCD_IO - #define IO_REG_DATA(R,D) do { LCD_IO_WriteReg(R); LCD_IO_WriteData(D); }while(0) - #else - #define IO_REG_DATA(R,D) do { u8g_WriteByte(u8g, dev, R); u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&D); }while(0) - #endif + #ifdef LCD_USE_DMA_FSMC + LCD_IO_WriteReg(ILI9328_HASTART); + LCD_IO_WriteData(Ymin); + LCD_IO_WriteReg(ILI9328_HAEND); + LCD_IO_WriteData(Ymax); + LCD_IO_WriteReg(ILI9328_VASTART); + LCD_IO_WriteData(Xmin); + LCD_IO_WriteReg(ILI9328_VAEND); + LCD_IO_WriteData(Xmax); + + LCD_IO_WriteReg(ILI9328_HASET); + LCD_IO_WriteData(Ymin); + LCD_IO_WriteReg(ILI9328_VASET); + LCD_IO_WriteData(Xmin); - #if NONE(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI) + LCD_IO_WriteReg(ILI9328_WRITE_RAM); + #else u8g_SetAddress(u8g, dev, 0); - #endif - IO_REG_DATA(ILI9328_HASTART, Ymin); - IO_REG_DATA(ILI9328_HAEND, Ymax); - IO_REG_DATA(ILI9328_VASTART, Xmin); - IO_REG_DATA(ILI9328_VAEND, Xmax); + u8g_WriteByte(u8g, dev, ILI9328_HASTART); + u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Ymin); + u8g_WriteByte(u8g, dev, ILI9328_HAEND); + u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Ymax); + u8g_WriteByte(u8g, dev, ILI9328_VASTART); + u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Xmin); + u8g_WriteByte(u8g, dev, ILI9328_VAEND); + u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Xmax); - IO_REG_DATA(ILI9328_HASET, Ymin); - IO_REG_DATA(ILI9328_VASET, Xmin); + u8g_WriteByte(u8g, dev, ILI9328_HASET); + u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Ymin); + u8g_WriteByte(u8g, dev, ILI9328_VASET); + u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Xmin); - #if HAS_LCD_IO - LCD_IO_WriteReg(ILI9328_WRITE_RAM); - #else u8g_WriteByte(u8g, dev, ILI9328_WRITE_RAM); u8g_SetAddress(u8g, dev, 1); #endif } static void setWindow_st7789v(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { - #if HAS_LCD_IO + #ifdef LCD_USE_DMA_FSMC LCD_IO_WriteReg(ST7789V_CASET); LCD_IO_WriteData((Xmin >> 8) & 0xFF); LCD_IO_WriteData(Xmin & 0xFF); @@ -222,7 +227,7 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint #define ESC_END 0xFFFF, 0x7FFF #define ESC_FFFF 0xFFFF, 0xFFFF -#if HAS_LCD_IO +#ifdef LCD_USE_DMA_FSMC void writeEscSequence(const uint16_t *sequence) { uint16_t data; for (;;) { @@ -242,7 +247,6 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint } } } - #define WRITE_ESC_SEQUENCE(V) writeEscSequence(V) #else void writeEscSequence8(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) { uint16_t data; @@ -267,8 +271,6 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint } } - #define WRITE_ESC_SEQUENCE(V) writeEscSequence8(u8g, dev, V) - void writeEscSequence16(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) { uint16_t data; u8g_SetAddress(u8g, dev, 0); @@ -379,30 +381,6 @@ static const uint16_t ili9341_init[] = { ESC_END }; -static const uint16_t st9677_init[] = { - ESC_REG(0x0010), ESC_DELAY(120), - ESC_REG(0x0001), ESC_DELAY(120), - ESC_REG(0x0011), ESC_DELAY(120), - ESC_REG(0x00F0), 0x00C3, - ESC_REG(0x00F0), 0x0096, - ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x00E8, 0x0028), - ESC_REG(0x003A), 0x0055, - ESC_REG(0x00B4), 0x0001, - ESC_REG(0x00B7), 0x00C6, - ESC_REG(0x00E8), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, - ESC_REG(0x00C1), 0x0006, - ESC_REG(0x00C2), 0x00A7, - ESC_REG(0x00C5), 0x0018, - ESC_REG(0x00E0), 0x00F0, 0x0009, 0x000B, 0x0006, 0x0004, 0x0015, 0x002F, 0x0054, 0x0042, 0x003C, 0x0017, 0x0014, 0x0018, 0x001B, - ESC_REG(0x00E1), 0x00F0, 0x0009, 0x000B, 0x0006, 0x0004, 0x0003, 0x002D, 0x0043, 0x0042, 0x003B, 0x0016, 0x0014, 0x0017, 0x001B, - ESC_REG(0x00F0), 0x003C, - ESC_REG(0x00F0), 0x0069, ESC_DELAY(120), - ESC_REG(0x0029), - ESC_REG(0x0011), - ESC_DELAY(100), - ESC_END -}; - #if ENABLED(TOUCH_BUTTONS) static const uint8_t buttonD[] = { @@ -582,7 +560,7 @@ static const uint16_t st9677_init[] = { v = TFT_MARLINBG_COLOR; LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = v; } - #if HAS_LCD_IO + #ifdef LCD_USE_DMA_FSMC LOOP_S_L_N(n, 1, FSMC_UPSCALE) for (uint16_t l = 0; l < length * (FSMC_UPSCALE); l++) buffer[l + (length * (FSMC_UPSCALE) * n)] = buffer[l]; @@ -608,39 +586,41 @@ 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); - - #if ENABLED(SPI_GRAPHICAL_TFT) - LCD_IO_Init(-1, -1); - #endif - - #if HAS_LCD_IO + #ifdef LCD_USE_DMA_FSMC static uint16_t bufferA[WIDTH * sq(FSMC_UPSCALE)], bufferB[WIDTH * sq(FSMC_UPSCALE)]; uint16_t* buffer = &bufferA[0]; - bool allow_async = DISABLED(SPI_GRAPHICAL_TFT); + bool allow_async = true; #else uint16_t buffer[WIDTH*2]; // 16-bit RGB 565 pixel line buffer #endif - switch (msg) { case U8G_DEV_MSG_INIT: dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, &lcd_id); switch (lcd_id & 0xFFFF) { case 0x8552: // ST7789V - WRITE_ESC_SEQUENCE(st7789v_init); + #ifdef LCD_USE_DMA_FSMC + writeEscSequence(st7789v_init); + #else + writeEscSequence8(u8g, dev, st7789v_init); + #endif setWindow = setWindow_st7789v; break; case 0x9328: // ILI9328 - WRITE_ESC_SEQUENCE(ili9328_init); + #ifdef LCD_USE_DMA_FSMC + writeEscSequence(ili9328_init); + #else + writeEscSequence16(u8g, dev, ili9328_init); + #endif setWindow = setWindow_ili9328; break; case 0x9341: // ILI9341 case 0x8066: // Anycubic / TronXY TFTs (480x320) - WRITE_ESC_SEQUENCE(ili9341_init); - setWindow = setWindow_st7789v; - break; - case 0x7796: - WRITE_ESC_SEQUENCE(TERN(HAS_LCD_IO, st9677_init, ili9341_init)); + #ifdef LCD_USE_DMA_FSMC + writeEscSequence(ili9341_init); + #else + writeEscSequence8(u8g, dev, ili9341_init); + #endif setWindow = setWindow_st7789v; break; case 0x0404: // No connected display on FSMC @@ -650,7 +630,10 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u lcd_id = 0; return 0; default: - setWindow = (lcd_id & 0xFF000000) ? setWindow_st7789v : setWindow_ili9328; + if (lcd_id && 0xFF000000) + setWindow = setWindow_st7789v; + else + setWindow = setWindow_ili9328; break; } @@ -661,7 +644,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u // Clear Screen setWindow(u8g, dev, 0, 0, LCD_FULL_PIXEL_WIDTH - 1, LCD_FULL_PIXEL_HEIGHT - 1); - #if HAS_LCD_IO + #ifdef LCD_USE_DMA_FSMC LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, LCD_FULL_PIXEL_WIDTH * LCD_FULL_PIXEL_HEIGHT); #else memset2(buffer, TFT_MARLINBG_COLOR, 160); @@ -698,7 +681,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u LOOP_L_N(y, PAGE_HEIGHT) { uint32_t k = 0; - #if HAS_LCD_IO + #ifdef LCD_USE_DMA_FSMC buffer = (y & 1) ? bufferB : bufferA; #endif for (uint16_t i = 0; i < (uint32_t)pb->width; i++) { @@ -706,7 +689,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u const uint16_t c = TEST(b, y) ? TFT_MARLINUI_COLOR : TFT_MARLINBG_COLOR; LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = c; } - #if HAS_LCD_IO + #ifdef LCD_USE_DMA_FSMC LOOP_S_L_N(n, 1, FSMC_UPSCALE) for (uint16_t l = 0; l < WIDTH * (FSMC_UPSCALE); l++) buffer[l + WIDTH * (FSMC_UPSCALE) * n] = buffer[l]; diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index 5ebff37edfd16..1b6dd0b9def8f 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -182,16 +182,12 @@ #define U8G_CLASS U8GLIB_SH1106_128X64 #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS -#elif TFT_SCALED_DOGLCD +#elif ENABLED(FSMC_GRAPHICAL_TFT) // Unspecified 320x240 TFT pre-initialized by built-in bootloader #define U8G_CLASS U8GLIB_TFT_320X240_UPSCALE_FROM_128X64 - #if ENABLED(FSMC_GRAPHICAL_TFT) - #define U8G_PARAM FSMC_CS_PIN, FSMC_RS_PIN - #else - #define U8G_PARAM -1, -1 - #endif + #define U8G_PARAM FSMC_CS_PIN, FSMC_RS_PIN #else @@ -214,18 +210,18 @@ // LCD_FULL_PIXEL_WIDTH = // LCD_PIXEL_OFFSET_X + (LCD_PIXEL_WIDTH * 2) + LCD_PIXEL_OFFSET_X -#if TFT_SCALED_DOGLCD +#if ENABLED(FSMC_GRAPHICAL_TFT) #ifndef LCD_FULL_PIXEL_WIDTH #define LCD_FULL_PIXEL_WIDTH 320 #endif #ifndef LCD_PIXEL_OFFSET_X - #define LCD_PIXEL_OFFSET_X 32 + #define LCD_PIXEL_OFFSET_X 32 #endif #ifndef LCD_FULL_PIXEL_HEIGHT #define LCD_FULL_PIXEL_HEIGHT 240 #endif #ifndef LCD_PIXEL_OFFSET_Y - #define LCD_PIXEL_OFFSET_Y 32 + #define LCD_PIXEL_OFFSET_Y 32 #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 5a672d29b173a..0a733049b87e1 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -112,10 +112,10 @@ #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 + #define LCD_FULL_PIXEL_WIDTH 480 + #define LCD_PIXEL_OFFSET_X 48 + #define LCD_FULL_PIXEL_HEIGHT 320 + #define LCD_PIXEL_OFFSET_Y 48 #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -135,19 +135,10 @@ #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12316 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8981 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 340 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -20 - #endif - + #define XPT2046_X_CALIBRATION -12316 + #define XPT2046_Y_CALIBRATION 8981 + #define XPT2046_X_OFFSET 340 + #define XPT2046_Y_OFFSET -20 #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index be71d3f2c2463..0fb3a9a8799e6 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -118,10 +118,10 @@ // #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 + #define LCD_FULL_PIXEL_WIDTH 480 + #define LCD_PIXEL_OFFSET_X 48 + #define LCD_FULL_PIXEL_HEIGHT 320 + #define LCD_PIXEL_OFFSET_Y 48 #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -141,18 +141,10 @@ #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12316 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8981 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 340 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -20 - #endif + #define XPT2046_X_CALIBRATION -12316 + #define XPT2046_Y_CALIBRATION 8981 + #define XPT2046_X_OFFSET 340 + #define XPT2046_Y_OFFSET -20 #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index afbcc8f32a053..ee88962e12bf2 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -207,13 +207,6 @@ #define MT_DET_2_PIN PE6 #define MT_DET_PIN_INVERTING false -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN MT_DET_1_PIN -#endif -#ifndef FIL_RUNOUT2_PIN - #define FIL_RUNOUT2_PIN MT_DET_2_PIN -#endif - #define WIFI_IO0_PIN PC13 // @@ -231,9 +224,7 @@ // // LCD / Controller // -#ifndef BEEPER_PIN - #define BEEPER_PIN PC5 -#endif +#define BEEPER_PIN PC5 /** * Note: MKS Robin TFT screens use various TFT controllers. @@ -259,6 +250,7 @@ #define BTN_EN1 PE8 #define BTN_EN2 PE11 + #define BEEPER_PIN PC5 #define BTN_ENC PE13 #elif ENABLED(TFT_LITTLE_VGL_UI) @@ -277,71 +269,16 @@ #if HAS_SPI_LCD - #if ENABLED(SPI_GRAPHICAL_TFT) // Emulated DOGM SPI - #define SPI_TFT_CS_PIN PD11 - #define SPI_TFT_SCK_PIN PA5 - #define SPI_TFT_MISO_PIN PA6 - #define SPI_TFT_MOSI_PIN PA7 - #define SPI_TFT_DC_PIN PD10 - #define SPI_TFT_RST_PIN PC6 - - #define LCD_BACKLIGHT_PIN PD13 - - #define LCD_READ_ID 0xD3 - #define LCD_USE_DMA_SPI - - #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - - //#define TOUCH_BUTTONS - #if ENABLED(TOUCH_BUTTONS) - #define TOUCH_CS_PIN PE14 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -5481 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 4000 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 343 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 0 - #endif - #endif - - #ifndef FSMC_UPSCALE - #define FSMC_UPSCALE 3 - #endif - #ifndef LCD_FULL_PIXEL_WIDTH - #define LCD_FULL_PIXEL_WIDTH 480 - #endif - #ifndef LCD_PIXEL_OFFSET_X - #define LCD_PIXEL_OFFSET_X 48 - #endif - #ifndef LCD_FULL_PIXEL_HEIGHT - #define LCD_FULL_PIXEL_HEIGHT 320 - #endif - #ifndef LCD_PIXEL_OFFSET_Y - #define LCD_PIXEL_OFFSET_Y 32 - #endif - - #define BTN_ENC PE13 - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - - #define LCD_PINS_ENABLE PD13 - #define LCD_PINS_RS PC6 - - #elif ENABLED(MKS_MINI_12864) - - // MKS MINI12864 and MKS LCD12864B - // If using MKS LCD12864A (Need to remove RPK2 resistor) + #define BEEPER_PIN PC5 + #define BTN_ENC PE13 + #define LCD_PINS_ENABLE PD13 + #define LCD_PINS_RS PC6 + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + #define LCD_BACKLIGHT_PIN -1 + // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor) + #if ENABLED(MKS_MINI_12864) #define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN -1 #define DOGLCD_A0 PD11 @@ -383,7 +320,3 @@ #define W25QXX_MISO_PIN PB14 #define W25QXX_SCK_PIN PB13 #endif - -#if ENABLED(SPEAKER) && BEEPER_PIN == PC5 - #error "MKS Robin nano default BEEPER_PIN is not a SPEAKER." -#endif