diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp
index 8e4f97d0a3..4dffe8b4fc 100644
--- a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp
+++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp
@@ -37,50 +37,61 @@ LCD_CONTROLLER_TypeDef *TFT_FSMC::LCD;
void TFT_FSMC::init() {
uint32_t controllerAddress;
- FSMC_NORSRAM_TimingTypeDef timing, extTiming;
+ FMC_OR_FSMC(NORSRAM_TimingTypeDef) timing, extTiming;
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.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
+ SRAMx.Instance = FMC_OR_FSMC(NORSRAM_DEVICE);
+ SRAMx.Extended = FMC_OR_FSMC(NORSRAM_EXTENDED_DEVICE);
+
// SRAMx.Init
SRAMx.Init.NSBank = nsBank;
- SRAMx.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
- SRAMx.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
- 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.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
- SRAMx.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
- SRAMx.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
- SRAMx.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
- SRAMx.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
- SRAMx.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE;
- SRAMx.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
- SRAMx.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
- #ifdef STM32F4xx
- SRAMx.Init.PageSize = FSMC_PAGE_SIZE_NONE;
+ SRAMx.Init.DataAddressMux = FMC_OR_FSMC(DATA_ADDRESS_MUX_DISABLE);
+ SRAMx.Init.MemoryType = FMC_OR_FSMC(MEMORY_TYPE_SRAM);
+ #ifdef STM32F446xx
+ SRAMx.Init.MemoryDataWidth = TERN(TFT_INTERFACE_FMC_8BIT, FMC_NORSRAM_MEM_BUS_WIDTH_8, FMC_NORSRAM_MEM_BUS_WIDTH_16);
+ #else
+ SRAMx.Init.MemoryDataWidth = TERN(TFT_INTERFACE_FSMC_8BIT, FSMC_NORSRAM_MEM_BUS_WIDTH_8, FSMC_NORSRAM_MEM_BUS_WIDTH_16);
#endif
+ SRAMx.Init.BurstAccessMode = FMC_OR_FSMC(BURST_ACCESS_MODE_DISABLE);
+ SRAMx.Init.WaitSignalPolarity = FMC_OR_FSMC(WAIT_SIGNAL_POLARITY_LOW);
+ SRAMx.Init.WrapMode = FMC_OR_FSMC(WRAP_MODE_DISABLE);
+ SRAMx.Init.WaitSignalActive = FMC_OR_FSMC(WAIT_TIMING_BEFORE_WS);
+ SRAMx.Init.WriteOperation = FMC_OR_FSMC(WRITE_OPERATION_ENABLE);
+ SRAMx.Init.WaitSignal = FMC_OR_FSMC(WAIT_SIGNAL_DISABLE);
+ SRAMx.Init.ExtendedMode = FMC_OR_FSMC(EXTENDED_MODE_ENABLE);
+ SRAMx.Init.AsynchronousWait = FMC_OR_FSMC(ASYNCHRONOUS_WAIT_DISABLE);
+ SRAMx.Init.WriteBurst = FMC_OR_FSMC(WRITE_BURST_DISABLE);
+ #if defined(STM32F446xx) || defined(STM32F4xx)
+ SRAMx.Init.PageSize = FMC_OR_FSMC(PAGE_SIZE_NONE);
+ #endif
+
// 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
- timing.AddressSetupTime = 15;
- timing.AddressHoldTime = 15;
- timing.DataSetupTime = 24;
- timing.BusTurnAroundDuration = 0;
- timing.CLKDivision = 16;
- timing.DataLatency = 17;
- timing.AccessMode = FSMC_ACCESS_MODE_A;
+ // Can be decreased from 15-15-24 to 4-4-8 with risk of stability loss
+ timing.AddressSetupTime = 15;
+ timing.AddressHoldTime = 15;
+ timing.DataSetupTime = 24;
+ timing.BusTurnAroundDuration = 0;
+ timing.CLKDivision = 16;
+ timing.DataLatency = 17;
+ timing.AccessMode = FMC_OR_FSMC(ACCESS_MODE_A);
+
// Write Timing
// Can be decreased from 8-15-8 to 0-0-1 with risk of stability loss
- extTiming.AddressSetupTime = 8;
- extTiming.AddressHoldTime = 15;
- extTiming.DataSetupTime = 8;
- extTiming.BusTurnAroundDuration = 0;
- extTiming.CLKDivision = 16;
- extTiming.DataLatency = 17;
- extTiming.AccessMode = FSMC_ACCESS_MODE_A;
+ extTiming.AddressSetupTime = 8;
+ extTiming.AddressHoldTime = 15;
+ extTiming.DataSetupTime = 8;
+ extTiming.BusTurnAroundDuration = 0;
+ extTiming.CLKDivision = 16;
+ extTiming.DataLatency = 17;
+ extTiming.AccessMode = FMC_OR_FSMC(ACCESS_MODE_A);
- __HAL_RCC_FSMC_CLK_ENABLE();
+ #ifdef STM32F446xx
+ __HAL_RCC_FMC_CLK_ENABLE();
+ #else
+ __HAL_RCC_FSMC_CLK_ENABLE();
+ #endif
for (uint16_t i = 0; pinMap_FSMC[i].pin != NC; i++)
pinmap_pinout(pinMap_FSMC[i].pin, pinMap_FSMC);
@@ -90,9 +101,9 @@ void TFT_FSMC::init() {
controllerAddress = FSMC_BANK1_1;
#ifdef PF0
switch (nsBank) {
- case FSMC_NORSRAM_BANK2: controllerAddress = FSMC_BANK1_2 ; break;
- case FSMC_NORSRAM_BANK3: controllerAddress = FSMC_BANK1_3 ; break;
- case FSMC_NORSRAM_BANK4: controllerAddress = FSMC_BANK1_4 ; break;
+ case FMC_OR_FSMC(NORSRAM_BANK2): controllerAddress = FSMC_BANK1_2; break;
+ case FMC_OR_FSMC(NORSRAM_BANK3): controllerAddress = FSMC_BANK1_3; break;
+ case FMC_OR_FSMC(NORSRAM_BANK4): controllerAddress = FSMC_BANK1_4; break;
}
#endif
@@ -100,49 +111,44 @@ void TFT_FSMC::init() {
HAL_SRAM_Init(&SRAMx, &timing, &extTiming);
+ __HAL_RCC_DMA2_CLK_ENABLE();
+
#ifdef STM32F1xx
- __HAL_RCC_DMA1_CLK_ENABLE();
- DMAtx.Instance = DMA1_Channel1;
+ DMAtx.Instance = DMA2_Channel1;
#elif defined(STM32F4xx)
- __HAL_RCC_DMA2_CLK_ENABLE();
- DMAtx.Instance = DMA2_Stream0;
- DMAtx.Init.Channel = DMA_CHANNEL_0;
- DMAtx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
- DMAtx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
- DMAtx.Init.MemBurst = DMA_MBURST_SINGLE;
- DMAtx.Init.PeriphBurst = DMA_PBURST_SINGLE;
+ DMAtx.Instance = DMA2_Stream0;
+ DMAtx.Init.Channel = DMA_CHANNEL_0;
+ DMAtx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
+ DMAtx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
+ DMAtx.Init.MemBurst = DMA_MBURST_SINGLE;
+ DMAtx.Init.PeriphBurst = DMA_PBURST_SINGLE;
#endif
- DMAtx.Init.Direction = DMA_MEMORY_TO_MEMORY;
- DMAtx.Init.MemInc = DMA_MINC_DISABLE;
- DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
- DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
- DMAtx.Init.Mode = DMA_NORMAL;
- DMAtx.Init.Priority = DMA_PRIORITY_HIGH;
+ DMAtx.Init.Direction = DMA_MEMORY_TO_MEMORY;
+ DMAtx.Init.MemInc = DMA_MINC_DISABLE;
+ DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
+ DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
+ DMAtx.Init.Mode = DMA_NORMAL;
+ DMAtx.Init.Priority = DMA_PRIORITY_HIGH;
LCD = (LCD_CONTROLLER_TypeDef *)controllerAddress;
}
uint32_t TFT_FSMC::getID() {
- uint32_t id;
writeReg(0);
- id = LCD->RAM;
-
- if (id == 0)
- id = readID(LCD_READ_ID);
- if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF)
- id = readID(LCD_READ_ID4);
+ uint32_t id = LCD->RAM;
+ if (id == 0) id = readID(LCD_READ_ID);
+ if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) id = readID(LCD_READ_ID4);
return id;
}
-uint32_t TFT_FSMC::readID(const tft_data_t inReg) {
- uint32_t id;
+uint32_t TFT_FSMC::readID(tft_data_t inReg) {
writeReg(inReg);
- id = LCD->RAM; // dummy read
+ uint32_t id = LCD->RAM; // dummy read
id = inReg << 24;
id |= (LCD->RAM & 0x00FF) << 16;
id |= (LCD->RAM & 0x00FF) << 8;
- id |= LCD->RAM & 0x00FF;
+ id |= (LCD->RAM & 0x00FF);
return id;
}
@@ -155,7 +161,9 @@ bool TFT_FSMC::isBusy() {
#define __IS_DMA_CONFIGURED(__HANDLE__) ((__HANDLE__)->Instance->PAR != 0)
#endif
- if (!__IS_DMA_CONFIGURED(&DMAtx)) return false;
+ #ifdef __IS_DMA_CONFIGURED
+ if (!__IS_DMA_CONFIGURED(&DMAtx)) return false;
+ #endif
// Check if DMA transfer error or transfer complete flags are set
if ((__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) == 0) && (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) == 0)) return true;
@@ -174,8 +182,6 @@ void TFT_FSMC::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t cou
DMAtx.Init.PeriphInc = memoryIncrease;
HAL_DMA_Init(&DMAtx);
HAL_DMA_Start(&DMAtx, (uint32_t)data, (uint32_t)&(LCD->RAM), count);
-
- TERN_(TFT_SHARED_IO, while (isBusy()));
}
void TFT_FSMC::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.h b/Marlin/src/HAL/STM32/tft/tft_fsmc.h
index 1776cbdb0f..2647923e8e 100644
--- a/Marlin/src/HAL/STM32/tft/tft_fsmc.h
+++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.h
@@ -28,11 +28,7 @@
#elif defined(STM32F4xx)
#include "stm32f4xx_hal.h"
#else
- #error "FSMC TFT is currently only supported on STM32F1 and STM32F4 hardware."
-#endif
-
-#ifndef HAL_SRAM_MODULE_ENABLED
- #error "SRAM module disabled for the STM32 framework (HAL_SRAM_MODULE_ENABLED)! Please consult the development team."
+ #error "FSMC/FMC TFT is currently only supported on STM32F1 and STM32F4 hardware."
#endif
#ifndef LCD_READ_ID
@@ -55,6 +51,12 @@ typedef struct {
__IO tft_data_t RAM;
} LCD_CONTROLLER_TypeDef;
+#ifdef STM32F446xx
+ #define FMC_OR_FSMC(N) _CAT(FMC_, N)
+#else
+ #define FMC_OR_FSMC(N) _CAT(FSMC_, N)
+#endif
+
class TFT_FSMC {
private:
static SRAM_HandleTypeDef SRAMx;
@@ -62,7 +64,7 @@ class TFT_FSMC {
static LCD_CONTROLLER_TypeDef *LCD;
- static uint32_t readID(const tft_data_t reg);
+ static uint32_t readID(tft_data_t inReg);
static void transmit(tft_data_t data) { LCD->RAM = data; __DSB(); }
static void transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count);
static void transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count);
@@ -94,7 +96,11 @@ class TFT_FSMC {
#ifdef STM32F1xx
#define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)
#elif defined(STM32F4xx)
- #define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FSMC)
+ #ifdef STM32F446xx
+ #define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)
+ #else
+ #define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FSMC)
+ #endif
#define FSMC_BANK1_1 0x60000000U
#define FSMC_BANK1_2 0x64000000U
#define FSMC_BANK1_3 0x68000000U
@@ -104,35 +110,35 @@ class TFT_FSMC {
#endif
const PinMap pinMap_FSMC[] = {
- {PD_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D00
- {PD_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D01
- {PD_0, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D02
- {PD_1, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D03
- {PE_7, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D04
- {PE_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D05
- {PE_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D06
- {PE_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D07
+ {PD_14, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D00
+ {PD_15, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D01
+ {PD_0, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D02
+ {PD_1, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D03
+ {PE_7, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D04
+ {PE_8, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D05
+ {PE_9, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D06
+ {PE_10, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D07
#if DISABLED(TFT_INTERFACE_FSMC_8BIT)
- {PE_11, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D08
- {PE_12, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D09
- {PE_13, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D10
- {PE_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D11
- {PE_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D12
- {PD_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D13
- {PD_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D14
- {PD_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D15
+ {PE_11, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D08
+ {PE_12, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D09
+ {PE_13, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D10
+ {PE_14, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D11
+ {PE_15, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D12
+ {PD_8, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D13
+ {PD_9, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D14
+ {PD_10, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D15
#endif
- {PD_4, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NOE
- {PD_5, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NWE
+ {PD_4, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_NOE
+ {PD_5, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_NWE
{NC, NP, 0}
};
const PinMap pinMap_FSMC_CS[] = {
- {PD_7, (void *)FSMC_NORSRAM_BANK1, FSMC_PIN_DATA}, // FSMC_NE1
+ {PD_7, (void *)FMC_OR_FSMC(NORSRAM_BANK1), FSMC_PIN_DATA}, // FSMC_NE1
#ifdef PF0
- {PG_9, (void *)FSMC_NORSRAM_BANK2, FSMC_PIN_DATA}, // FSMC_NE2
- {PG_10, (void *)FSMC_NORSRAM_BANK3, FSMC_PIN_DATA}, // FSMC_NE3
- {PG_12, (void *)FSMC_NORSRAM_BANK4, FSMC_PIN_DATA}, // FSMC_NE4
+ {PG_9, (void *)FMC_OR_FSMC(NORSRAM_BANK2), FSMC_PIN_DATA}, // FSMC_NE2
+ {PG_10, (void *)FMC_OR_FSMC(NORSRAM_BANK3), FSMC_PIN_DATA}, // FSMC_NE3
+ {PG_12, (void *)FMC_OR_FSMC(NORSRAM_BANK4), FSMC_PIN_DATA}, // FSMC_NE4
#endif
{NC, NP, 0}
};
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index 0895bb46a0..1dfcabdefb 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -459,7 +459,7 @@
#define BOARD_OPULO_LUMEN_REV4 5242 // Opulo Lumen PnP Controller REV4 (STM32F407VE / STM32F407VG)
#define BOARD_FYSETC_SPIDER_KING407 5243 // FYSETC Spider King407 (STM32F407ZG)
#define BOARD_MKS_SKIPR_V1 5244 // MKS SKIPR v1.0 all-in-one board (STM32F407VE)
-#define BOARD_TRONXY_V10 5245 // TRONXY V10 (STM32F446ZE)
+#define BOARD_TRONXY_CXY_446_V10 5245 // TRONXY CXY-446-V10-220413/CXY-V6-191121 (STM32F446ZE)
#define BOARD_CREALITY_F401RE 5246 // Creality CR4NS200141C13 (STM32F401RE) as found in the Ender-5 S1
#define BOARD_BLACKPILL_CUSTOM 5247 // Custom board based on STM32F401CDU6.
#define BOARD_I3DBEEZ9_V1 5248 // I3DBEEZ9 V1 (STM32F407ZG)
diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h
index af32d8c119..53d31c0168 100644
--- a/Marlin/src/pins/pins.h
+++ b/Marlin/src/pins/pins.h
@@ -806,8 +806,8 @@
#include "stm32f4/pins_FYSETC_SPIDER_KING407.h" // STM32F4 env:FYSETC_SPIDER_KING407
#elif MB(MKS_SKIPR_V1)
#include "stm32f4/pins_MKS_SKIPR_V1_0.h" // STM32F4 env:mks_skipr_v1 env:mks_skipr_v1_nobootloader
-#elif MB(TRONXY_V10)
- #include "stm32f4/pins_TRONXY_V10.h" // STM32F4 env:STM32F446_tronxy
+#elif MB(TRONXY_CXY_446_V10)
+ #include "stm32f4/pins_TRONXY_CXY_446_V10.h" // STM32F4 env:TRONXY_CXY_446_V10 env:TRONXY_CXY_446_V10_usb_flash_drive
#elif MB(CREALITY_F401RE)
#include "stm32f4/pins_CREALITY_F401.h" // STM32F4 env:STM32F401RE_creality
#elif MB(BLACKPILL_CUSTOM)
@@ -956,6 +956,7 @@
#define BOARD_LINUX_RAMPS 99926
#define BOARD_BTT_MANTA_M4P_V1_0 99927
#define BOARD_VAKE403D 99928
+ #define BOARD_TRONXY_V10 99929
#if MB(MKS_13)
#error "BOARD_MKS_13 is now BOARD_MKS_GEN_13. Please update your configuration."
@@ -1015,6 +1016,8 @@
#error "BOARD_LINUX_RAMPS is now BOARD_SIMULATED. Please update your configuration."
#elif MB(BTT_MANTA_M4P_V1_0)
#error "BOARD_BTT_MANTA_M4P_V1_0 is now BOARD_BTT_MANTA_M4P_V2_1. Please update your configuration."
+ #elif MB(TRONXY_V10)
+ #error "BOARD_TRONXY_V10 is now BOARD_TRONXY_CXY_446_V10. Please update your configuration."
#elif MB(VAKE403D)
#error "BOARD_VAKE403D is no longer supported in Marlin."
#elif defined(MOTHERBOARD)
@@ -1053,6 +1056,7 @@
#undef BOARD_LINUX_RAMPS
#undef BOARD_BTT_MANTA_M4P_V1_0
#undef BOARD_VAKE403D
+ #undef BOARD_TRONXY_V10
#endif
diff --git a/Marlin/src/pins/stm32f4/pins_TRONXY_CXY_446_V10.h b/Marlin/src/pins/stm32f4/pins_TRONXY_CXY_446_V10.h
new file mode 100644
index 0000000000..00bf9de934
--- /dev/null
+++ b/Marlin/src/pins/stm32f4/pins_TRONXY_CXY_446_V10.h
@@ -0,0 +1,256 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2024 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 .
+ *
+ */
+
+/**
+ * BOARD_TRONXY_CXY_446_V10
+ *
+ * CXY-V6-191121 / CXY-446-V10-220413
+ */
+
+#pragma once
+
+#include "env_validate.h"
+
+#if EXTRUDERS > 2 || E_STEPPERS > 2 || NUM_RUNOUT_SENSORS > 2
+ #error "TRONXY CXY 446 V10 only supports 2 Extruders / E steppers / Filament Runout sensors."
+#endif
+
+#define BOARD_INFO_NAME "BOARD_TRONXY_CXY_446_V10"
+#define DEFAULT_MACHINE_NAME "TRONXY CXY 446 V10"
+
+#define STEP_TIMER 6
+#define TEMP_TIMER 14
+
+//
+// EEPROM
+//
+#if NO_EEPROM_SELECTED
+ #define I2C_EEPROM
+ //#define FLASH_EEPROM_EMULATION
+ #undef NO_EEPROM_SELECTED
+#endif
+
+#if ENABLED(FLASH_EEPROM_EMULATION)
+ #define EEPROM_START_ADDRESS (0x8000000UL + (512 * 1024) - 2 * EEPROM_PAGE_SIZE)
+ #define EEPROM_PAGE_SIZE (0x800U) // 2K, but will use 2x more (4K)
+ #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE
+#else
+ #define MARLIN_EEPROM_SIZE 0x800 // 2K (FT24C16A)
+#endif
+
+//
+// SPI Flash
+//
+#define SPI_FLASH // W25Q16
+#if ENABLED(SPI_FLASH)
+ #define SPI_FLASH_SIZE 0x1000000 // 16MB
+ #define SPI_FLASH_CS_PIN PG15
+ #define SPI_FLASH_MOSI_PIN PB5
+ #define SPI_FLASH_MISO_PIN PB4
+ #define SPI_FLASH_SCK_PIN PB3
+#endif
+
+//
+// SD Card / Flash Drive
+//
+#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive Support
+
+//
+// SD Card
+//
+#define ONBOARD_SDIO
+#define SD_DETECT_PIN -1
+#define SDIO_CLOCK 4500000
+#define SDIO_READ_RETRIES 16
+
+#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
+
+//
+// Limit Switches
+//
+#define X_STOP_PIN PC15
+#define Y_STOP_PIN PC14
+
+#if ENABLED(FIX_MOUNTED_PROBE)
+ #define Z_STOP_PIN PE3
+#else
+ #define Z_STOP_PIN PC13
+#endif
+
+//
+// Filament Sensors
+//
+#if ENABLED(FILAMENT_RUNOUT_SENSOR)
+ #define FIL_RUNOUT_PIN PE6
+ #define FIL_RUNOUT2_PIN PF12
+#endif
+
+//
+// Steppers
+//
+#define X_ENABLE_PIN PF0
+#define X_STEP_PIN PE5
+#define X_DIR_PIN PF1
+
+#define Y_ENABLE_PIN PF5
+#define Y_STEP_PIN PF9
+#define Y_DIR_PIN PF3
+
+#define Z_ENABLE_PIN PA5
+#define Z_STEP_PIN PA6
+#define Z_DIR_PIN PF15
+
+#define E0_ENABLE_PIN PF14
+#define E0_STEP_PIN PB1
+#define E0_DIR_PIN PF13
+
+#define E1_ENABLE_PIN PG5
+#define E1_STEP_PIN PD12
+#define E1_DIR_PIN PG4
+
+//
+// Temperature Sensors
+//
+#define TEMP_0_PIN PC3
+#define TEMP_1_PIN PC0
+#define TEMP_BED_PIN PC2
+
+//
+// Heaters
+//
+#define HEATER_0_PIN PG7 // Hotend #1 Heater
+#define HEATER_1_PIN PA15 // Hotend #2 Heater
+#define HEATER_BED_PIN PE2
+
+//
+// Fans
+//
+#define FAN_SOFT_PWM_REQUIRED
+
+#define FAN0_PIN PG0 // Part Cooling Fan #1
+#define FAN1_PIN PB6 // Part Cooling Fan #2
+#define FAN2_PIN PG9 // Extruder/Hotend #1 Heatsink Fan
+#define FAN3_PIN PF10 // Extruder/Hotend #2 Heatsink Fan
+#define CONTROLLER_FAN_PIN PD7
+
+//
+// Laser / Servos
+//
+#define SPINDLE_LASER_ENA_PIN PB11 // WiFi Module TXD (Pin5)
+#define SPINDLE_LASER_PWM_PIN PB10 // WiFi Module RXD (Pin4)
+
+//
+// NOTE: The PWM pin definition const PinMap PinMap_PWM[] in PeripheralPins.c must be augmented here.
+// See PWM_PIN(x) definition for details.
+//
+
+//
+// TFT with FSMC interface
+//
+#if HAS_FSMC_TFT
+ #define TOUCH_CS_PIN PD11
+ #define TOUCH_SCK_PIN PB13
+ #define TOUCH_MISO_PIN PB14
+ #define TOUCH_MOSI_PIN PB15
+
+ #define TFT_RESET_PIN PB12
+ #define TFT_BACKLIGHT_PIN PG8
+
+ #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT
+ #define FSMC_DMA_DEV DMA2
+ #define FSMC_DMA_CHANNEL DMA_CH5
+ #define FSMC_CS_PIN PG12
+ #define FSMC_RS_PIN PG2
+
+ #define TFT_CS_PIN FSMC_CS_PIN
+ #define TFT_RS_PIN FSMC_RS_PIN
+
+ #if ENABLED(TFT_LVGL_UI)
+ #define HAS_SPI_FLASH_FONT 1
+ #define HAS_GCODE_PREVIEW 1
+ #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0
+ #define HAS_LANG_SELECT_SCREEN 1
+ #define HAS_BAK_VIEW_IN_FLASH 0
+ #define HAS_LOGO_IN_FLASH 0
+ #elif ANY(TFT_CLASSIC_UI, TFT_COLOR_UI)
+ //#define TFT_DRIVER ILI9488
+ #define TFT_BUFFER_WORDS 14400
+ #endif
+
+ // Touch Screen calibration
+ #if ENABLED(TFT_TRONXY_X5SA)
+ #ifndef TOUCH_CALIBRATION_X
+ #define TOUCH_CALIBRATION_X -17181
+ #endif
+ #ifndef TOUCH_CALIBRATION_Y
+ #define TOUCH_CALIBRATION_Y 11434
+ #endif
+ #ifndef TOUCH_OFFSET_X
+ #define TOUCH_OFFSET_X 501
+ #endif
+ #ifndef TOUCH_OFFSET_Y
+ #define TOUCH_OFFSET_Y -9
+ #endif
+ #ifndef TOUCH_ORIENTATION
+ #define TOUCH_ORIENTATION TOUCH_LANDSCAPE
+ #endif
+ #endif
+
+ #if ENABLED(MKS_ROBIN_TFT43)
+ #ifndef TOUCH_CALIBRATION_X
+ #define TOUCH_CALIBRATION_X 17184
+ #endif
+ #ifndef TOUCH_CALIBRATION_Y
+ #define TOUCH_CALIBRATION_Y 10604
+ #endif
+ #ifndef TOUCH_OFFSET_X
+ #define TOUCH_OFFSET_X -31
+ #endif
+ #ifndef TOUCH_OFFSET_Y
+ #define TOUCH_OFFSET_Y -29
+ #endif
+ #ifndef TOUCH_ORIENTATION
+ #define TOUCH_ORIENTATION TOUCH_LANDSCAPE
+ #endif
+ #endif
+#else
+ #error "TRONXY CXY 446 V10 only supports TFT with FSMC interface."
+#endif
+
+//
+// Power Loss
+//
+#if ENABLED(PSU_CONTROL)
+ #define PS_ON_PIN PG10
+ #define POWER_LOSS_PIN PE1
+#endif
+
+//
+// Misc. Functions
+//
+//#define LED_PIN PG10
+#define BEEPER_PIN PA8
diff --git a/Marlin/src/pins/stm32f4/pins_TRONXY_V10.h b/Marlin/src/pins/stm32f4/pins_TRONXY_V10.h
deleted file mode 100644
index 97580bf618..0000000000
--- a/Marlin/src/pins/stm32f4/pins_TRONXY_V10.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2022 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 .
- *
- */
-#pragma once
-
-#include "env_validate.h"
-
-#if HOTENDS > 3 || E_STEPPERS > 3
- #error "Tronxy V10 supports up to 3 hotends / E steppers."
-#endif
-
-#define BOARD_INFO_NAME "Tronxy V10"
-#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME
-
-#define STEP_TIMER 6
-#define TEMP_TIMER 14
-
-//
-// Servos
-//
-//#define SERVO0_PIN PB10
-
-//
-// EEPROM
-//
-#if NO_EEPROM_SELECTED
- #undef NO_EEPROM_SELECTED
- #if TRONXY_UI > 0
- #define EEPROM_AT24CXX
- #else
- #define FLASH_EEPROM_EMULATION
- #endif
-#endif
-
-#if ENABLED(FLASH_EEPROM_EMULATION)
- // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h)
- #define EEPROM_START_ADDRESS (0x8000000UL + (512 * 1024) - 2 * EEPROM_PAGE_SIZE)
- #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB)
- #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE
-#else
- #if ENABLED(EEPROM_AT24CXX)
- #define AT24CXX_SCL PB8
- #define AT24CXX_SDA PB9
- #define AT24CXX_WP PB7
- #else
- #define I2C_EEPROM // AT24C32
- #endif
- #define MARLIN_EEPROM_SIZE 0x1000 // 4K
-#endif
-
-//
-// SPI Flash
-//
-//#define SPI_FLASH
-#if ENABLED(SPI_FLASH)
- #define SPI_FLASH_SIZE 0x200000 // 2MB
- #define SPI_FLASH_CS_PIN PG15 // SPI2
- #define SPI_FLASH_SCK_PIN PB3
- #define SPI_FLASH_MISO_PIN PB4
- #define SPI_FLASH_MOSI_PIN PB5
-#endif
-
-//
-// Limit Switches
-//
-#define X_MIN_PIN PC15
-#define X_MAX_PIN PB0
-#define Y_STOP_PIN PC14
-
-#ifndef Z_MIN_PROBE_PIN
- #define Z_MIN_PROBE_PIN PE3
-#endif
-
-#if ENABLED(DUAL_Z_ENDSTOP_PROBE)
- #if NUM_Z_STEPPERS > 1 && Z_HOME_TO_MAX // Swap Z1/Z2 for dual Z with max homing
- #define Z_MIN_PIN PF11
- #define Z_MAX_PIN PC13
- #else
- #define Z_MIN_PIN PC13
- #define Z_MAX_PIN PF11
- #endif
-#else
- #ifndef Z_STOP_PIN
- #define Z_STOP_PIN PC13
- #endif
-#endif
-//
-// Filament Sensors
-//
-#ifndef FIL_RUNOUT_PIN
- #define FIL_RUNOUT_PIN PE6 // MT_DET
-#endif
-#ifndef FIL_RUNOUT2_PIN
- #define FIL_RUNOUT2_PIN PF12
-#endif
-
-//
-// Steppers
-//
-#define X_ENABLE_PIN PF0
-#define X_STEP_PIN PE5
-#define X_DIR_PIN PF1
-
-#define Y_ENABLE_PIN PF5
-#define Y_STEP_PIN PF9
-#define Y_DIR_PIN PF3
-
-#define Z_ENABLE_PIN PA5
-#define Z_STEP_PIN PA6
-#define Z_DIR_PIN PF15
-
-#define E0_ENABLE_PIN PF14
-#define E0_STEP_PIN PB1
-#define E0_DIR_PIN PF13
-
-#define E1_ENABLE_PIN PG5
-#define E1_STEP_PIN PD12
-#define E1_DIR_PIN PG4
-
-#define E2_ENABLE_PIN PF7
-#define E2_STEP_PIN PF6
-#define E2_DIR_PIN PF4
-
-//
-// Temperature Sensors
-//
-#define TEMP_0_PIN PC3 // TH1
-#define TEMP_BED_PIN PC2 // TB1
-
-//
-// Heaters / Fans
-//
-#define HEATER_0_PIN PG7 // HEATER1
-#define HEATER_BED_PIN PE2 // HOT BED
-//#define HEATER_BED_INVERTING true
-
-#define FAN0_PIN PG0 // FAN0
-#define FAN1_PIN PB6 // FAN1
-#define FAN2_PIN PG9 // FAN2
-#define FAN3_PIN PF10 // FAN3
-#define CONTROLLER_FAN_PIN PD7 // BOARD FAN
-#define FAN_SOFT_PWM_REQUIRED
-
-//
-// Laser / Spindle
-//
-#if HAS_CUTTER
- #define SPINDLE_LASER_ENA_PIN PB11 // wifi:TX
- #if ENABLED(SPINDLE_LASER_USE_PWM)
- #define SPINDLE_LASER_PWM_PIN PB10 // wifi:RX-TIM2_CH3
- // The PWM pin definition const PinMap PinMap_PWM[] in PeripheralPins.c must be compounded here
- // See PWM_PIN(x) definition for details
- #endif
-#endif
-
-//
-// Misc
-//
-#define BEEPER_PIN PA8
-
-//#define LED_PIN PG10
-#define PS_ON_PIN PG10 // Temporarily switch the machine with LED simulation
-
-#if ENABLED(TRONXY_BACKUP_POWER)
- #define POWER_LOSS_PIN PF11 // Configure as drop-down input
-#else
- #define POWER_LOSS_PIN PE1 // Output of LM393 comparator, configured as pullup
-#endif
-//#define POWER_LM393_PIN PE0 // +V for the LM393 comparator, configured as output high
-
-#if ENABLED(TFT_TRONXY_X5SA)
- #error "TFT_TRONXY_X5SA is not yet supported."
-#endif
-
-#if 0
-
-//
-// TFT with FSMC interface
-//
-#if HAS_FSMC_TFT
- #define TFT_RESET_PIN PB12
- #define TFT_BACKLIGHT_PIN PG8
-
- #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT
-
- #define TFT_CS_PIN PG12
- #define TFT_RS_PIN PG2
-
- //#define TFT_WIDTH 480
- //#define TFT_HEIGHT 320
- //#define TFT_PIXEL_OFFSET_X 48
- //#define TFT_PIXEL_OFFSET_Y 32
- //#define TFT_DRIVER ILI9488
- //#define TFT_BUFFER_WORDS 14400
-
- #if NEED_TOUCH_PINS
- #define TOUCH_CS_PIN PD11 // SPI1_NSS
- #define TOUCH_SCK_PIN PB13 // SPI1_SCK
- #define TOUCH_MISO_PIN PB14 // SPI1_MISO
- #define TOUCH_MOSI_PIN PB15 // SPI1_MOSI
- #endif
-
- #if (LCD_CHIP_INDEX == 1 && (TRONXY_UI == 1 || TRONXY_UI == 2)) || LCD_CHIP_INDEX == 3
- #define TOUCH_CALIBRATION_X -17181
- #define TOUCH_CALIBRATION_Y 11434
- #define TOUCH_OFFSET_X 501
- #define TOUCH_OFFSET_Y -9
- #elif LCD_CHIP_INDEX == 1 && TRONXY_UI == 4
- #define TOUCH_CALIBRATION_X 11166
- #define TOUCH_CALIBRATION_Y 17162
- #define TOUCH_OFFSET_X -10
- #define TOUCH_OFFSET_Y -16
- #elif LCD_CHIP_INDEX == 4 && TRONXY_UI == 3
- //#define TOUCH_CALIBRATION_X 8781
- //#define TOUCH_CALIBRATION_Y 11773
- //#define TOUCH_OFFSET_X -17
- //#define TOUCH_OFFSET_Y -16
- // Upside-down
- #define TOUCH_CALIBRATION_X -8553
- #define TOUCH_CALIBRATION_Y -11667
- #define TOUCH_OFFSET_X 253
- #define TOUCH_OFFSET_Y 331
- #elif LCD_CHIP_INDEX == 2
- #define TOUCH_CALIBRATION_X 17184
- #define TOUCH_CALIBRATION_Y 10604
- #define TOUCH_OFFSET_X -31
- #define TOUCH_OFFSET_Y -29
- #endif
-#endif
-
-#endif
-
-//
-// SD Card
-//
-#define ONBOARD_SDIO
-#define SD_DETECT_PIN -1 // PF0, but not connected
-#define SDIO_CLOCK 4500000
-#define SDIO_READ_RETRIES 16
diff --git a/buildroot/share/PlatformIO/scripts/tronxy_cxy_446_v10.py b/buildroot/share/PlatformIO/scripts/tronxy_cxy_446_v10.py
new file mode 100644
index 0000000000..f3cb94a062
--- /dev/null
+++ b/buildroot/share/PlatformIO/scripts/tronxy_cxy_446_v10.py
@@ -0,0 +1,41 @@
+#
+# tronxy_cxy_446_v10.py
+# Build customizations for env:TRONXY_CXY_446_V10
+#
+import pioutil
+if pioutil.is_pio_build():
+
+ import marlin, os
+
+ from SCons.Script import DefaultEnvironment
+
+ env = DefaultEnvironment()
+
+ # Check whether the "update" folder exists
+ outpath = "update"
+ if not os.path.exists(outpath): os.makedirs(outpath)
+
+ # Build "fmw_tronxy.hex" and place in "update" folder
+ def output_target_hex():
+ tar_hex = f"{outpath}/fmw_tronxy.hex"
+ env.AddPostAction(
+ "$BUILD_DIR/${PROGNAME}.elf",
+ env.VerboseAction(" ".join([
+ "$OBJCOPY", "-O", "ihex", "-R", ".eeprom",
+ "$BUILD_DIR/${PROGNAME}.elf", tar_hex
+ ]), "Building %s" % tar_hex)
+ )
+
+ # Build "fmw_tronxy.bin" and place in "update" folder
+ def output_target_bin():
+ tar_bin = f"{outpath}/fmw_tronxy.bin"
+ env.AddPostAction(
+ "$BUILD_DIR/${PROGNAME}.elf",
+ env.VerboseAction(" ".join([
+ "$OBJCOPY", "-O", "binary", "-R", ".eeprom",
+ "$BUILD_DIR/${PROGNAME}.elf", tar_bin
+ ]), "Building %s" % tar_bin)
+ )
+
+ output_target_hex()
+ output_target_bin()
diff --git a/ini/renamed.ini b/ini/renamed.ini
index 84f6acd7fa..85f2df2862 100644
--- a/ini/renamed.ini
+++ b/ini/renamed.ini
@@ -95,3 +95,6 @@ extends = renamed
[env:STM32F407ZE_btt_USB] ;=> STM32F407ZE_btt_usb_flash_drive
extends = renamed
+
+[env:STM32F446_tronxy] ;=> TRONXY_CXY_446_V10
+extends = renamed
diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini
index 2ba5742f4f..fb8e9109cf 100644
--- a/ini/stm32f4.ini
+++ b/ini/stm32f4.ini
@@ -812,17 +812,29 @@ upload_protocol = dfu
upload_command = dfu-util -a 0 -s 0x08000000:leave -D "$SOURCE"
#
-# STM32F446ZET6 ARM Cortex-M4
+# TRONXY_CXY_446_V10 (STM32F446ZET6 ARM Cortex-M4)
#
-[env:STM32F446_tronxy]
-extends = stm32_variant
-board = marlin_STM32F446ZET_tronxy
-board_build.offset = 0x10000
-board_build.rename = fmw_tronxy.bin
-build_flags = ${stm32_variant.build_flags}
- -DSTM32F4xx
-build_unflags = ${stm32_variant.build_unflags} -fno-rtti
- -DUSBCON -DUSBD_USE_CDC
+[env:TRONXY_CXY_446_V10]
+extends = stm32_variant
+board = marlin_STM32F446ZET_tronxy
+board_build.ldscript = buildroot/share/PlatformIO/variants/MARLIN_F446Zx_TRONXY/ldscript.ld
+board_build.offset = 0x10000
+board_build.rename = fmw_tronxy.bin
+build_flags = ${stm32_variant.build_flags}
+ -DSTM32F4xx -DUSE_USB_HS
+ -DUSE_USB_HS_IN_FS
+build_unflags = ${stm32_variant.build_unflags} -fno-rtti
+ -fno-threadsafe-statics -fno-exceptions
+ -DUSBD_USE_CDC -DUSBCON
+extra_scripts = ${stm32_variant.extra_scripts}
+ buildroot/share/PlatformIO/scripts/tronxy_cxy_446_v10.py
+
+#
+# TRONXY_CXY_446_V10 (STM32F446ZET6 ARM Cortex-M4) with USB Flash Drive Support
+#
+[env:TRONXY_CXY_446_V10_usb_flash_drive]
+extends = env:TRONXY_CXY_446_V10
+platform_packages = ${stm_flash_drive.platform_packages}
#
# Blackpill