Anet ET4 / ET4P and Anet TFT28 / TFT35 (#20280)

This commit is contained in:
Keith Bennett 2020-12-22 04:51:29 -08:00 committed by Scott Lahteine
parent 59b5cb6fe2
commit aa65c6e477
17 changed files with 407 additions and 84 deletions

View file

@ -2368,6 +2368,16 @@
// //
//#define LONGER_LK_TFT28 //#define LONGER_LK_TFT28
//
// 320x240, 2.8", FSMC Stock Display from ET4
//
//#define ANET_ET4_TFT28
//
// 480x320, 3.5", FSMC Stock Display from ET5
//
//#define ANET_ET5_TFT35
// //
// Generic TFT with detailed options // Generic TFT with detailed options
// //

View file

@ -48,13 +48,14 @@ void TFT_FSMC::Init() {
uint32_t NSBank = (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS); uint32_t NSBank = (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS);
// Perform the SRAM1 memory initialization sequence
SRAMx.Instance = FSMC_NORSRAM_DEVICE; SRAMx.Instance = FSMC_NORSRAM_DEVICE;
SRAMx.Extended = FSMC_NORSRAM_EXTENDED_DEVICE; SRAMx.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
/* SRAMx.Init */ // SRAMx.Init
SRAMx.Init.NSBank = NSBank; SRAMx.Init.NSBank = NSBank;
SRAMx.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; SRAMx.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
SRAMx.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM; SRAMx.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
SRAMx.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16; SRAMx.Init.MemoryDataWidth = TERN(TFT_INTERFACE_FSMC_8BIT, FSMC_NORSRAM_MEM_BUS_WIDTH_8, FSMC_NORSRAM_MEM_BUS_WIDTH_16);
SRAMx.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE; SRAMx.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
SRAMx.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW; SRAMx.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
SRAMx.Init.WrapMode = FSMC_WRAP_MODE_DISABLE; SRAMx.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
@ -67,8 +68,8 @@ void TFT_FSMC::Init() {
#ifdef STM32F4xx #ifdef STM32F4xx
SRAMx.Init.PageSize = FSMC_PAGE_SIZE_NONE; SRAMx.Init.PageSize = FSMC_PAGE_SIZE_NONE;
#endif #endif
/* Read Timing - relatively slow to ensure ID information is correctly read from TFT controller */ // Read Timing - relatively slow to ensure ID information is correctly read from TFT controller
/* Can be decreases from 15-15-24 to 4-4-8 with risk of stability loss */ // Can be decreases from 15-15-24 to 4-4-8 with risk of stability loss
Timing.AddressSetupTime = 15; Timing.AddressSetupTime = 15;
Timing.AddressHoldTime = 15; Timing.AddressHoldTime = 15;
Timing.DataSetupTime = 24; Timing.DataSetupTime = 24;
@ -76,8 +77,8 @@ void TFT_FSMC::Init() {
Timing.CLKDivision = 16; Timing.CLKDivision = 16;
Timing.DataLatency = 17; Timing.DataLatency = 17;
Timing.AccessMode = FSMC_ACCESS_MODE_A; Timing.AccessMode = FSMC_ACCESS_MODE_A;
/* Write Timing */ // Write Timing
/* Can be decreases from 8-15-8 to 0-0-1 with risk of stability loss */ // Can be decreases from 8-15-8 to 0-0-1 with risk of stability loss
ExtTiming.AddressSetupTime = 8; ExtTiming.AddressSetupTime = 8;
ExtTiming.AddressHoldTime = 15; ExtTiming.AddressHoldTime = 15;
ExtTiming.DataSetupTime = 8; ExtTiming.DataSetupTime = 8;
@ -131,7 +132,7 @@ void TFT_FSMC::Init() {
uint32_t TFT_FSMC::GetID() { uint32_t TFT_FSMC::GetID() {
uint32_t id; uint32_t id;
WriteReg(0x0000); WriteReg(0);
id = LCD->RAM; id = LCD->RAM;
if (id == 0) if (id == 0)
@ -141,16 +142,16 @@ uint32_t TFT_FSMC::GetID() {
return id; return id;
} }
uint32_t TFT_FSMC::ReadID(uint16_t Reg) { uint32_t TFT_FSMC::ReadID(tft_data_t Reg) {
uint32_t id; uint32_t id;
WriteReg(Reg); WriteReg(Reg);
id = LCD->RAM; // dummy read id = LCD->RAM; // dummy read
id = Reg << 24; id = Reg << 24;
id |= (LCD->RAM & 0x00FF) << 16; id |= (LCD->RAM & 0x00FF) << 16;
id |= (LCD->RAM & 0x00FF) << 8; id |= (LCD->RAM & 0x00FF) << 8;
id |= LCD->RAM & 0x00FF; id |= LCD->RAM & 0x00FF;
return id; return id;
} }
bool TFT_FSMC::isBusy() { bool TFT_FSMC::isBusy() {
if (__IS_DMA_ENABLED(&DMAtx)) if (__IS_DMA_ENABLED(&DMAtx))

View file

@ -44,9 +44,12 @@
#define DATASIZE_16BIT SPI_DATASIZE_16BIT #define DATASIZE_16BIT SPI_DATASIZE_16BIT
#define TFT_IO_DRIVER TFT_FSMC #define TFT_IO_DRIVER TFT_FSMC
#define TFT_DATASIZE TERN(TFT_INTERFACE_FSMC_8BIT, DATASIZE_8BIT, DATASIZE_16BIT)
typedef TERN(TFT_INTERFACE_FSMC_8BIT, uint8_t, uint16_t) tft_data_t;
typedef struct { typedef struct {
__IO uint16_t REG; __IO tft_data_t REG;
__IO uint16_t RAM; __IO tft_data_t RAM;
} LCD_CONTROLLER_TypeDef; } LCD_CONTROLLER_TypeDef;
class TFT_FSMC { class TFT_FSMC {
@ -56,8 +59,8 @@ class TFT_FSMC {
static LCD_CONTROLLER_TypeDef *LCD; static LCD_CONTROLLER_TypeDef *LCD;
static uint32_t ReadID(uint16_t Reg); static uint32_t ReadID(tft_data_t Reg);
static void Transmit(uint16_t Data) { LCD->RAM = Data; __DSB(); } static void Transmit(tft_data_t Data) { LCD->RAM = Data; __DSB(); }
static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count);
public: public:
@ -66,11 +69,11 @@ class TFT_FSMC {
static bool isBusy(); static bool isBusy();
static void Abort() { __HAL_DMA_DISABLE(&DMAtx); } static void Abort() { __HAL_DMA_DISABLE(&DMAtx); }
static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) {} static void DataTransferBegin(uint16_t DataWidth = TFT_DATASIZE) {}
static void DataTransferEnd() {}; static void DataTransferEnd() {};
static void WriteData(uint16_t Data) { Transmit(Data); } static void WriteData(uint16_t Data) { Transmit(tft_data_t(Data)); }
static void WriteReg(uint16_t Reg) { LCD->REG = Reg; __DSB(); } static void WriteReg(uint16_t Reg) { LCD->REG = tft_data_t(Reg); __DSB(); }
static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_ENABLE, Data, Count); } static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_ENABLE, Data, Count); }
static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_PINC_DISABLE, &Data, Count); } static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_PINC_DISABLE, &Data, Count); }
@ -98,14 +101,16 @@ const PinMap PinMap_FSMC[] = {
{PE_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D05 {PE_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D05
{PE_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D06 {PE_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D06
{PE_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D07 {PE_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D07
{PE_11, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D08 #if DISABLED(TFT_INTERFACE_FSMC_8BIT)
{PE_12, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D09 {PE_11, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D08
{PE_13, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D10 {PE_12, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D09
{PE_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D11 {PE_13, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D10
{PE_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D12 {PE_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D11
{PD_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D13 {PE_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D12
{PD_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D14 {PD_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D13
{PD_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D15 {PD_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D14
{PD_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D15
#endif
{PD_4, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NOE {PD_4, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NOE
{PD_5, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NWE {PD_5, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NWE
{NC, NP, 0} {NC, NP, 0}
@ -121,7 +126,11 @@ const PinMap PinMap_FSMC_CS[] = {
{NC, NP, 0} {NC, NP, 0}
}; };
#define FSMC_RS(A) (void *)((2 << A) - 2) #if ENABLED(TFT_INTERFACE_FSMC_8BIT)
#define FSMC_RS(A) (void *)((2 << (A-1)) - 1)
#else
#define FSMC_RS(A) (void *)((2 << A) - 2)
#endif
const PinMap PinMap_FSMC_RS[] = { const PinMap PinMap_FSMC_RS[] = {
#ifdef PF0 #ifdef PF0

View file

@ -23,8 +23,10 @@
#ifdef STM32F1xx #ifdef STM32F1xx
#include <stm32f1xx_hal.h> #include <stm32f1xx_hal.h>
#define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN)
#elif defined(STM32F4xx) #elif defined(STM32F4xx)
#include <stm32f4xx_hal.h> #include <stm32f4xx_hal.h>
#define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN)
#endif #endif
#include "../../../inc/MarlinConfig.h" #include "../../../inc/MarlinConfig.h"
@ -60,13 +62,6 @@ enum XPTCoordinate : uint8_t {
#define XPT2046_Z1_THRESHOLD 10 #define XPT2046_Z1_THRESHOLD 10
#endif #endif
#ifdef STM32F1xx
#define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN)
#elif defined(STM32F4xx)
#define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN)
#endif
class XPT2046 { class XPT2046 {
private: private:
static SPI_HandleTypeDef SPIx; static SPI_HandleTypeDef SPIx;

View file

@ -370,6 +370,8 @@
#define BOARD_MKS_ROBIN2 4218 // MKS_ROBIN2 (STM32F407ZE) #define BOARD_MKS_ROBIN2 4218 // MKS_ROBIN2 (STM32F407ZE)
#define BOARD_MKS_ROBIN_PRO_V2 4219 // MKS Robin Pro V2 (STM32F407VE) #define BOARD_MKS_ROBIN_PRO_V2 4219 // MKS Robin Pro V2 (STM32F407VE)
#define BOARD_MKS_ROBIN_NANO_V3 4220 // MKS Robin Nano V3 (STM32F407VG) #define BOARD_MKS_ROBIN_NANO_V3 4220 // MKS Robin Nano V3 (STM32F407VG)
#define BOARD_ANET_ET4 4221 // ANET ET4 V1.x (STM32F407VGT6)
#define BOARD_ANET_ET4P 4222 // ANET ET4P V1.x (STM32F407VGT6)
// //
// ARM Cortex M7 // ARM Cortex M7

View file

@ -151,7 +151,7 @@
#endif #endif
// Macros to chain up to 12 conditions // Macros to chain up to 14 conditions
#define _DO_1(W,C,A) (_##W##_1(A)) #define _DO_1(W,C,A) (_##W##_1(A))
#define _DO_2(W,C,A,B) (_##W##_1(A) C _##W##_1(B)) #define _DO_2(W,C,A,B) (_##W##_1(A) C _##W##_1(B))
#define _DO_3(W,C,A,V...) (_##W##_1(A) C _DO_2(W,C,V)) #define _DO_3(W,C,A,V...) (_##W##_1(A) C _DO_2(W,C,V))
@ -164,6 +164,8 @@
#define _DO_10(W,C,A,V...) (_##W##_1(A) C _DO_9(W,C,V)) #define _DO_10(W,C,A,V...) (_##W##_1(A) C _DO_9(W,C,V))
#define _DO_11(W,C,A,V...) (_##W##_1(A) C _DO_10(W,C,V)) #define _DO_11(W,C,A,V...) (_##W##_1(A) C _DO_10(W,C,V))
#define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V)) #define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V))
#define _DO_13(W,C,A,V...) (_##W##_1(A) C _DO_12(W,C,V))
#define _DO_14(W,C,A,V...) (_##W##_1(A) C _DO_13(W,C,V))
#define __DO_N(W,C,N,V...) _DO_##N(W,C,V) #define __DO_N(W,C,N,V...) _DO_##N(W,C,V)
#define _DO_N(W,C,N,V...) __DO_N(W,C,N,V) #define _DO_N(W,C,N,V...) __DO_N(W,C,N,V)
#define DO(W,C,V...) (_DO_N(W,C,NUM_ARGS(V),V)) #define DO(W,C,V...) (_DO_N(W,C,NUM_ARGS(V),V))

View file

@ -1073,28 +1073,23 @@
* - TFT_COLOR * - TFT_COLOR
* - GRAPHICAL_TFT_UPSCALE * - GRAPHICAL_TFT_UPSCALE
*/ */
#if ENABLED(MKS_TS35_V2_0) #if ENABLED(MKS_TS35_V2_0) // Most common: ST7796
// Most common: ST7796
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY)
#define TFT_RES_480x320 #define TFT_RES_480x320
#define TFT_INTERFACE_SPI #define TFT_INTERFACE_SPI
#elif ENABLED(MKS_ROBIN_TFT24) #elif ENABLED(MKS_ROBIN_TFT24) // Most common: ST7789
// Most common: ST7789
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y)
#define TFT_RES_320x240 #define TFT_RES_320x240
#define TFT_INTERFACE_FSMC #define TFT_INTERFACE_FSMC
#elif ENABLED(MKS_ROBIN_TFT28) #elif ENABLED(MKS_ROBIN_TFT28) // Most common: ST7789
// Most common: ST7789
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y)
#define TFT_RES_320x240 #define TFT_RES_320x240
#define TFT_INTERFACE_FSMC #define TFT_INTERFACE_FSMC
#elif ENABLED(MKS_ROBIN_TFT32) #elif ENABLED(MKS_ROBIN_TFT32) // Most common: ST7789
// Most common: ST7789
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y)
#define TFT_RES_320x240 #define TFT_RES_320x240
#define TFT_INTERFACE_FSMC #define TFT_INTERFACE_FSMC
#elif ENABLED(MKS_ROBIN_TFT35) #elif ENABLED(MKS_ROBIN_TFT35) // Most common: ILI9488
// Most common: ILI9488
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y)
#define TFT_RES_480x320 #define TFT_RES_480x320
#define TFT_INTERFACE_FSMC #define TFT_INTERFACE_FSMC
@ -1103,12 +1098,11 @@
#define TFT_DRIVER SSD1963 #define TFT_DRIVER SSD1963
#define TFT_RES_480x272 #define TFT_RES_480x272
#define TFT_INTERFACE_FSMC #define TFT_INTERFACE_FSMC
#elif ENABLED(MKS_ROBIN_TFT_V1_1R) #elif ENABLED(MKS_ROBIN_TFT_V1_1R) // ILI9328 or R61505
// ILI9328 or R61505
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y)
#define TFT_RES_320x240 #define TFT_RES_320x240
#define TFT_INTERFACE_FSMC #define TFT_INTERFACE_FSMC
#elif EITHER(TFT_TRONXY_X5SA, ANYCUBIC_TFT35) #elif EITHER(TFT_TRONXY_X5SA, ANYCUBIC_TFT35) // ILI9488
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y)
#define TFT_DRIVER ILI9488 #define TFT_DRIVER ILI9488
#define TFT_RES_480x320 #define TFT_RES_480x320
@ -1117,6 +1111,14 @@
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y)
#define TFT_RES_320x240 #define TFT_RES_320x240
#define TFT_INTERFACE_FSMC #define TFT_INTERFACE_FSMC
#elif ENABLED(ANET_ET4_TFT28) // ST7789
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y)
#define TFT_RES_320x240
#define TFT_INTERFACE_FSMC
#elif ENABLED(ANET_ET5_TFT35) // ST7796
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY)
#define TFT_RES_480x320
#define TFT_INTERFACE_FSMC
#elif ENABLED(TFT_GENERIC) #elif ENABLED(TFT_GENERIC)
#define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y)
#if NONE(TFT_RES_320x240, TFT_RES_480x272, TFT_RES_480x320) #if NONE(TFT_RES_320x240, TFT_RES_480x272, TFT_RES_480x320)
@ -1197,11 +1199,9 @@
#define TOUCH_OFFSET_X XPT2046_X_OFFSET #define TOUCH_OFFSET_X XPT2046_X_OFFSET
#define TOUCH_OFFSET_Y XPT2046_Y_OFFSET #define TOUCH_OFFSET_Y XPT2046_Y_OFFSET
#define TOUCH_ORIENTATION TOUCH_LANDSCAPE #define TOUCH_ORIENTATION TOUCH_LANDSCAPE
#else
#define TOUCH_CALIBRATION_X 0
#define TOUCH_CALIBRATION_Y 0
#define TOUCH_OFFSET_X 0
#define TOUCH_OFFSET_Y 0
#define TOUCH_ORIENTATION TOUCH_ORIENTATION_NONE
#endif #endif
#endif #endif
#if MB(ANET_ET4, ANET_ET4P)
#define IS_ANET_ET 1
#endif

View file

@ -2303,7 +2303,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
+ COUNT_ENABLED(FYSETC_MINI_12864_X_X, FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1, FYSETC_GENERIC_12864_1_1) \ + COUNT_ENABLED(FYSETC_MINI_12864_X_X, FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1, FYSETC_GENERIC_12864_1_1) \
+ COUNT_ENABLED(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) \ + COUNT_ENABLED(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) \
+ COUNT_ENABLED(MKS_12864OLED, MKS_12864OLED_SSD1306) \ + COUNT_ENABLED(MKS_12864OLED, MKS_12864OLED_SSD1306) \
+ COUNT_ENABLED(MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R) \ + COUNT_ENABLED(MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, ANET_ET4_TFT28, ANET_ET5_TFT35) \
+ COUNT_ENABLED(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) \ + COUNT_ENABLED(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) \
+ COUNT_ENABLED(VIKI2, miniVIKI) \ + COUNT_ENABLED(VIKI2, miniVIKI) \
+ COUNT_ENABLED(ZONESTAR_12864LCD, ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) \ + COUNT_ENABLED(ZONESTAR_12864LCD, ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) \
@ -2347,7 +2347,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
#undef IS_EXTUI #undef IS_EXTUI
#undef IS_LEGACY_TFT #undef IS_LEGACY_TFT
#if ANY(TFT_GENERIC, MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, TFT_TRONXY_X5SA, ANYCUBIC_TFT35, ANYCUBIC_TFT35, LONGER_LK_TFT28) #if ANY(TFT_GENERIC, MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, TFT_TRONXY_X5SA, ANYCUBIC_TFT35, ANYCUBIC_TFT35, LONGER_LK_TFT28, ANET_ET4_TFT28, ANET_ET5_TFT35)
#if NONE(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI) #if NONE(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI)
#error "TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI is required for your TFT. Please enable one." #error "TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI is required for your TFT. Please enable one."
#elif 1 < ENABLED(TFT_COLOR_UI) + ENABLED(TFT_CLASSIC_UI) + ENABLED(TFT_LVGL_UI) #elif 1 < ENABLED(TFT_COLOR_UI) + ENABLED(TFT_CLASSIC_UI) + ENABLED(TFT_LVGL_UI)

View file

@ -95,7 +95,7 @@ void CANVAS::AddImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors)
if (line >= startLine && line < endLine) { if (line >= startLine && line < endLine) {
uint16_t *pixel = buffer + x + (line - startLine) * width; uint16_t *pixel = buffer + x + (line - startLine) * width;
for (int16_t j = 0; j < image_width; j++) { for (int16_t j = 0; j < image_width; j++) {
if ((x + j >= 0) && (x + j < width)) *pixel = *data; if ((x + j >= 0) && (x + j < width)) *pixel = ENDIAN_COLOR(*data);
pixel++; pixel++;
data++; data++;
} }

View file

@ -30,6 +30,13 @@
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if TFT_INTERFACE_FSMC_8BIT
// When we have a 8 bit interface, we need to invert the bytes of the color
#define ENDIAN_COLOR(C) (((C) >> 8) | ((C) << 8))
#else
#define ENDIAN_COLOR(C) (C)
#endif
#if HAS_UI_320x240 #if HAS_UI_320x240
#define TFT_WIDTH 320 #define TFT_WIDTH 320
#define TFT_HEIGHT 240 #define TFT_HEIGHT 240

View file

@ -158,7 +158,7 @@ void TFT_Queue::fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, ui
task_parameters->y = y; task_parameters->y = y;
task_parameters->width = width; task_parameters->width = width;
task_parameters->height = height; task_parameters->height = height;
task_parameters->color = color; task_parameters->color = ENDIAN_COLOR(color);
task_parameters->count = width * height; task_parameters->count = width * height;
*end_of_queue = TASK_END_OF_QUEUE; *end_of_queue = TASK_END_OF_QUEUE;
@ -200,7 +200,7 @@ void TFT_Queue::set_background(uint16_t color) {
last_parameter = end_of_queue; last_parameter = end_of_queue;
parameters->type = CANVAS_SET_BACKGROUND; parameters->type = CANVAS_SET_BACKGROUND;
parameters->color = color; parameters->color = ENDIAN_COLOR(color);
end_of_queue += sizeof(parametersCanvasBackground_t); end_of_queue += sizeof(parametersCanvasBackground_t);
task_parameters->count++; task_parameters->count++;
@ -227,7 +227,7 @@ void TFT_Queue::add_text(uint16_t x, uint16_t y, uint16_t color, uint8_t *string
parameters->type = CANVAS_ADD_TEXT; parameters->type = CANVAS_ADD_TEXT;
parameters->x = x; parameters->x = x;
parameters->y = y; parameters->y = y;
parameters->color = color; parameters->color = ENDIAN_COLOR(color);
parameters->stringLength = 0; parameters->stringLength = 0;
parameters->maxWidth = maxWidth; parameters->maxWidth = maxWidth;
@ -261,18 +261,19 @@ void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *col
if (color_mode == HIGHCOLOR) return; if (color_mode == HIGHCOLOR) return;
uint16_t *color = (uint16_t *)end_of_queue; uint16_t *color = (uint16_t *)end_of_queue;
uint8_t number_of_color = 0; uint8_t color_count = 0;
switch (color_mode) { switch (color_mode) {
case GREYSCALE1: number_of_color = 1; break; case GREYSCALE1: color_count = 1; break;
case GREYSCALE2: number_of_color = 3; break; case GREYSCALE2: color_count = 3; break;
case GREYSCALE4: number_of_color = 15; break; case GREYSCALE4: color_count = 15; break;
default: default: break;
break;
} }
while (number_of_color--) { uint16_t tmp;
*color++ = *colors++; while (color_count--) {
tmp = *colors++;
*color++ = ENDIAN_COLOR(tmp);
} }
end_of_queue = (uint8_t *)color; end_of_queue = (uint8_t *)color;
@ -326,7 +327,7 @@ void TFT_Queue::add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
parameters->y = y; parameters->y = y;
parameters->width = width; parameters->width = width;
parameters->height = height; parameters->height = height;
parameters->color = color; parameters->color = ENDIAN_COLOR(color);
end_of_queue += sizeof(parametersCanvasBar_t); end_of_queue += sizeof(parametersCanvasBar_t);
task_parameters->count++; task_parameters->count++;
@ -344,7 +345,7 @@ void TFT_Queue::add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t h
parameters->y = y; parameters->y = y;
parameters->width = width; parameters->width = width;
parameters->height = height; parameters->height = height;
parameters->color = color; parameters->color = ENDIAN_COLOR(color);
end_of_queue += sizeof(parametersCanvasRectangle_t); end_of_queue += sizeof(parametersCanvasRectangle_t);
task_parameters->count++; task_parameters->count++;

View file

@ -414,21 +414,21 @@ void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const valu
extern screenFunc_t _manual_move_func_ptr; extern screenFunc_t _manual_move_func_ptr;
if (ui.currentScreen != _manual_move_func_ptr && !ui.external_control) { if (ui.currentScreen != _manual_move_func_ptr && !ui.external_control) {
#define SLIDER_LENGHT 224 #define SLIDER_LENGTH 224
#define SLIDER_Y_POSITION 140 #define SLIDER_Y_POSITION 140
tft.canvas((TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION, SLIDER_LENGHT, 16); tft.canvas((TFT_WIDTH - SLIDER_LENGTH) / 2, SLIDER_Y_POSITION, SLIDER_LENGTH, 16);
tft.set_background(COLOR_BACKGROUND); tft.set_background(COLOR_BACKGROUND);
int16_t position = (SLIDER_LENGHT - 2) * ui.encoderPosition / maxEditValue; int16_t position = (SLIDER_LENGTH - 2) * ui.encoderPosition / maxEditValue;
tft.add_bar(0, 7, 1, 2, ui.encoderPosition == 0 ? COLOR_SLIDER_INACTIVE : COLOR_SLIDER); tft.add_bar(0, 7, 1, 2, ui.encoderPosition == 0 ? COLOR_SLIDER_INACTIVE : COLOR_SLIDER);
tft.add_bar(1, 6, position, 4, COLOR_SLIDER); tft.add_bar(1, 6, position, 4, COLOR_SLIDER);
tft.add_bar(position + 1, 6, SLIDER_LENGHT - 2 - position, 4, COLOR_SLIDER_INACTIVE); tft.add_bar(position + 1, 6, SLIDER_LENGTH - 2 - position, 4, COLOR_SLIDER_INACTIVE);
tft.add_bar(SLIDER_LENGHT - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE); tft.add_bar(SLIDER_LENGTH - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE);
#if ENABLED(TOUCH_SCREEN) #if ENABLED(TOUCH_SCREEN)
tft.add_image((SLIDER_LENGHT - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER); tft.add_image((SLIDER_LENGTH - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER);
touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGHT, 32, maxEditValue); touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGTH) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGTH, 32, maxEditValue);
#endif #endif
} }

View file

@ -75,8 +75,20 @@
#define TOUCH_LANDSCAPE 1 #define TOUCH_LANDSCAPE 1
#define TOUCH_PORTRAIT 2 #define TOUCH_PORTRAIT 2
#ifndef TOUCH_CALIBRATION_X
#define TOUCH_CALIBRATION_X 0
#endif
#ifndef TOUCH_CALIBRATION_Y
#define TOUCH_CALIBRATION_Y 0
#endif
#ifndef TOUCH_OFFSET_X
#define TOUCH_OFFSET_X 0
#endif
#ifndef TOUCH_OFFSET_Y
#define TOUCH_OFFSET_Y 0
#endif
#ifndef TOUCH_ORIENTATION #ifndef TOUCH_ORIENTATION
#define TOUCH_ORIENTATION TOUCH_LANDSCAPE #define TOUCH_ORIENTATION TOUCH_LANDSCAPE
#endif #endif
#define SSD1963 0x5761 #define SSD1963 0x5761

View file

@ -598,6 +598,10 @@
#include "stm32f4/pins_MKS_ROBIN_PRO_V2.h" // STM32F4 env:mks_robin_pro2 #include "stm32f4/pins_MKS_ROBIN_PRO_V2.h" // STM32F4 env:mks_robin_pro2
#elif MB(MKS_ROBIN_NANO_V3) #elif MB(MKS_ROBIN_NANO_V3)
#include "stm32f4/pins_MKS_ROBIN_NANO_V3.h" // STM32F4 env:mks_robin_nano_v3 #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h" // STM32F4 env:mks_robin_nano_v3
#elif MB(ANET_ET4)
#include "stm32f4/pins_ANET_ET4.h" // STM32F4 env:Anet_ET4_OpenBLT
#elif MB(ANET_ET4P)
#include "stm32f4/pins_ANET_ET4P.h" // STM32F4 env:Anet_ET4_OpenBLT
// //
// ARM Cortex M7 // ARM Cortex M7

View file

@ -0,0 +1,223 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
*
* 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
#if NOT_TARGET(STM32F4)
#error "Oops! Select an STM32F4 board in 'Tools > Board.'"
#elif HOTENDS > 1 || E_STEPPERS > 1
#error "Anet ET4 only supports one hotend / E-stepper. Comment out this line to continue."
#endif
#ifndef BOARD_INFO_NAME
#define BOARD_INFO_NAME "Anet ET4 1.x"
#endif
//
// EEPROM
//
// Use one of these or SDCard-based Emulation will be used
#if NO_EEPROM_SELECTED
//#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation
#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation
//#define IIC_BL24CXX_EEPROM // Use I2C EEPROM onboard IC (AT24C04C, Size 4KB, PageSize 16B)
#endif
#if ENABLED(FLASH_EEPROM_EMULATION)
// Decrease delays and flash wear by spreading writes across the
// 128 kB sector allocated for EEPROM emulation.
#define FLASH_EEPROM_LEVELING
#elif ENABLED(IIC_BL24CXX_EEPROM)
#define IIC_EEPROM_SDA PB11
#define IIC_EEPROM_SCL PB10
#define EEPROM_DEVICE_ADDRESS 0xA0
#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
#endif
//
// Limit Switches
//
#define X_STOP_PIN PC13
#define Y_STOP_PIN PE12
#define Z_STOP_PIN PE11
//
// Z Probe
//
#if ENABLED(BLTOUCH)
#error "You will need to use 24V to 5V converter and remove one resistor and capacitor from the motherboard. See https://github.com/davidtgbe/Marlin/blob/bugfix-2.0.x/docs/Tutorials/bltouch-en.md for more information. Comment out this line to proceed at your own risk."
#define SERVO0_PIN PC3
#elif !defined(Z_MIN_PROBE_PIN)
#define Z_MIN_PROBE_PIN PC3
#endif
//
// Filament Runout Sensor
//
#ifndef FIL_RUNOUT_PIN
#define FIL_RUNOUT_PIN PA2
#endif
//
// Power Loss Detection
//
#ifndef POWER_LOSS_PIN
#define POWER_LOSS_PIN PA8
#endif
//
// LED PIN
//
#define LED_PIN PD12
//
// Steppers
//
#define X_STEP_PIN PB6
#define X_DIR_PIN PB5
#define X_ENABLE_PIN PB7
#define Y_STEP_PIN PB3
#define Y_DIR_PIN PD6
#define Y_ENABLE_PIN PB4
#define Z_STEP_PIN PA12
#define Z_DIR_PIN PA11
#define Z_ENABLE_PIN PA15
#define E0_STEP_PIN PB9
#define E0_DIR_PIN PB8
#define E0_ENABLE_PIN PE0
//
// Temperature Sensors
//
#define TEMP_0_PIN PA1
#define TEMP_BED_PIN PA4
//
// Heaters
//
#define HEATER_0_PIN PA0
#define HEATER_BED_PIN PE2
//
// Fans
//
#define FAN_PIN PE3 // Layer fan
#define FAN1_PIN PE1 // Hotend fan
#ifndef E0_AUTO_FAN_PIN
#define E0_AUTO_FAN_PIN FAN1_PIN
#endif
//
// LCD / Controller
//
#define TFT_RESET_PIN PE6
#define TFT_CS_PIN PD7
#define TFT_RS_PIN PD13
#define TFT_INTERFACE_FSMC_8BIT
//
// Touch Screen
// https://ldm-systems.ru/f/doc/catalog/HY-TFT-2,8/XPT2046.pdf
//
#if ENABLED(TOUCH_SCREEN)
#define TOUCH_CS_PIN PB2
#define TOUCH_SCK_PIN PB0
#define TOUCH_MOSI_PIN PE5
#define TOUCH_MISO_PIN PE4
#define TOUCH_INT_PIN PB1
#endif
// Touchscreen calibration does not work correctly with ANET_ET5_TFT35 or ANET_ET4_TFT28
#if ENABLED(TOUCH_SCREEN_CALIBRATION)
#undef TOUCH_SCREEN_CALIBRATION
#endif
#if ENABLED(ANET_ET5_TFT35)
#ifndef TOUCH_CALIBRATION_X
#define TOUCH_CALIBRATION_X 17125
#endif
#ifndef TOUCH_CALIBRATION_Y
#define TOUCH_CALIBRATION_Y -11307
#endif
#ifndef TOUCH_OFFSET_X
#define TOUCH_OFFSET_X -26
#endif
#ifndef TOUCH_OFFSET_Y
#define TOUCH_OFFSET_Y 337
#endif
#ifndef TOUCH_ORIENTATION
#define TOUCH_ORIENTATION TOUCH_PORTRAIT
#endif
#elif ENABLED(ANET_ET4_TFT28)
#ifndef TOUCH_CALIBRATION_X
#define TOUCH_CALIBRATION_X -11838
#endif
#ifndef TOUCH_CALIBRATION_Y
#define TOUCH_CALIBRATION_Y 8776
#endif
#ifndef TOUCH_OFFSET_X
#define TOUCH_OFFSET_X 333
#endif
#ifndef TOUCH_OFFSET_Y
#define TOUCH_OFFSET_Y -17
#endif
#ifndef TOUCH_ORIENTATION
#define TOUCH_ORIENTATION TOUCH_PORTRAIT
#endif
#endif
//
// SD Card
//
//#define SDIO_SUPPORT
#ifndef SDCARD_CONNECTION
#define SDCARD_CONNECTION CUSTOM_CABLE
#endif
#if ENABLED(SDSUPPORT)
#define SDIO_D0_PIN PC8
#define SDIO_D1_PIN PC9
#define SDIO_D2_PIN PC10
#define SDIO_D3_PIN PC11
#define SDIO_CK_PIN PC12
#define SDIO_CMD_PIN PD2
#if DISABLED(SDIO_SUPPORT)
#define SOFTWARE_SPI
#define SDSS SDIO_D3_PIN
#define SCK_PIN SDIO_CK_PIN
#define MISO_PIN SDIO_D0_PIN
#define MOSI_PIN SDIO_CMD_PIN
#endif
#ifndef SD_DETECT_PIN
#define SD_DETECT_PIN PD3
#endif
#endif

View file

@ -0,0 +1,34 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
*
* 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
#define BOARD_INFO_NAME "Anet ET4P 1.x"
//
// TMC2208 Configuration_adv defaults for Anet ET4P-MB_V1.x
//
#if !AXIS_DRIVER_TYPE_X(TMC2208_STANDALONE) || !AXIS_DRIVER_TYPE_Y(TMC2208_STANDALONE) || !AXIS_DRIVER_TYPE_Z(TMC2208_STANDALONE) || !AXIS_DRIVER_TYPE_E0(TMC2208_STANDALONE)
#error "ANET_ET4P requires ([XYZ]|E0)_DRIVER_TYPE set to TMC2208_STANDALONE."
#endif
#include "pins_ANET_ET4.h"

View file

@ -1241,6 +1241,29 @@ build_flags = ${common_stm32.build_flags}
extra_scripts = ${common.extra_scripts} extra_scripts = ${common.extra_scripts}
pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
#
# Anet ET4-MB_V1.x/ET4P-MB_V1.x (STM32F407VGT6 ARM Cortex-M4)
# For use with with davidtgbe's OpenBLT bootloader https://github.com/davidtgbe/openblt/releases
# Comment out board_build.offset = 0x10000 if you don't plan to use OpenBLT/flashing directly to 0x08000000.
#
[env:Anet_ET4_OpenBLT]
platform = ${common_stm32.platform}
extends = common_stm32
build_flags = ${common_stm32.build_flags} -DHAL_SD_MODULE_ENABLED -DHAL_SRAM_MODULE_ENABLED
board = genericSTM32F407VGT6
board_build.core = stm32
board_build.variant = MARLIN_F4x7Vx
board_build.ldscript = ldscript.ld
board_build.firmware = firmware.srec
board_build.offset = 0x10000
board_upload.offset_address = 0x08010000
build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483
debug_tool = jlink
upload_protocol = jlink
extra_scripts = ${common.extra_scripts}
pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
buildroot/share/PlatformIO/scripts/stm32_bootloader.py
# #
# BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) # BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4)
# #