LVGL and Classic UI for STM32 (#20552)

This commit is contained in:
Victor Oliveira 2020-12-23 23:01:21 -03:00 committed by GitHub
parent f8c6de0cdc
commit 4d6b6bcffc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 113 additions and 133 deletions

View File

@ -157,7 +157,6 @@ static SPISettings spiConfig;
SPI.setMISO(MISO_PIN); SPI.setMISO(MISO_PIN);
SPI.setMOSI(MOSI_PIN); SPI.setMOSI(MOSI_PIN);
SPI.setSCLK(SCK_PIN); SPI.setSCLK(SCK_PIN);
SPI.setSSEL(SS_PIN);
#endif #endif
SPI.begin(); SPI.begin();

View File

@ -60,7 +60,6 @@ void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaH
_dmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; _dmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
} }
#ifdef STM32F4xx #ifdef STM32F4xx
_dmaHandle.Init.Channel = DMA_CHANNEL_3;
_dmaHandle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; _dmaHandle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
#endif #endif
@ -73,7 +72,8 @@ void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaH
_dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Channel3 : DMA1_Channel2; _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Channel3 : DMA1_Channel2;
#elif defined(STM32F4xx) #elif defined(STM32F4xx)
__HAL_RCC_DMA2_CLK_ENABLE(); __HAL_RCC_DMA2_CLK_ENABLE();
_dmaHandle.Instance = DMA2_Stream3; _dmaHandle.Init.Channel = DMA_CHANNEL_3;
_dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA2_Stream3 : DMA2_Stream0;
#endif #endif
} }
#endif #endif
@ -83,7 +83,9 @@ void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaH
__HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE();
_dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Channel5 : DMA1_Channel4; _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Channel5 : DMA1_Channel4;
#elif defined(STM32F4xx) #elif defined(STM32F4xx)
//TODO: f4 dma config __HAL_RCC_DMA1_CLK_ENABLE();
_dmaHandle.Init.Channel = DMA_CHANNEL_0;
_dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Stream4 : DMA1_Stream3;
#endif #endif
} }
#endif #endif
@ -93,7 +95,9 @@ void MarlinSPI::setupDma(SPI_HandleTypeDef &_spiHandle, DMA_HandleTypeDef &_dmaH
__HAL_RCC_DMA2_CLK_ENABLE(); __HAL_RCC_DMA2_CLK_ENABLE();
_dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA2_Channel2 : DMA2_Channel1; _dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA2_Channel2 : DMA2_Channel1;
#elif defined(STM32F4xx) #elif defined(STM32F4xx)
//TODO: f4 dma config __HAL_RCC_DMA1_CLK_ENABLE();
_dmaHandle.Init.Channel = DMA_CHANNEL_0;
_dmaHandle.Instance = (direction == DMA_MEMORY_TO_PERIPH) ? DMA1_Stream5 : DMA1_Stream2;
#endif #endif
} }
#endif #endif

View File

@ -154,29 +154,27 @@ uint32_t TFT_FSMC::ReadID(tft_data_t Reg) {
} }
bool TFT_FSMC::isBusy() { bool TFT_FSMC::isBusy() {
if (__IS_DMA_ENABLED(&DMAtx)) #if defined(STM32F1xx)
volatile bool dmaEnabled = (DMAtx.Instance->CCR & DMA_CCR_EN) != RESET;
#elif defined(STM32F4xx)
volatile bool dmaEnabled = DMAtx.Instance->CR & DMA_SxCR_EN;
#endif
if (dmaEnabled) {
if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0) if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0)
Abort(); Abort();
return __IS_DMA_ENABLED(&DMAtx); }
else
Abort();
return dmaEnabled;
} }
void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) {
DMAtx.Init.PeriphInc = MemoryIncrease; DMAtx.Init.PeriphInc = MemoryIncrease;
HAL_DMA_Init(&DMAtx); HAL_DMA_Init(&DMAtx);
DataTransferBegin();
__HAL_DMA_CLEAR_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)); HAL_DMA_Start(&DMAtx, (uint32_t)Data, (uint32_t)&(LCD->RAM), Count);
__HAL_DMA_CLEAR_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)); HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
Abort();
#ifdef STM32F1xx
DMAtx.Instance->CNDTR = Count;
DMAtx.Instance->CPAR = (uint32_t)Data;
DMAtx.Instance->CMAR = (uint32_t)&(LCD->RAM);
#elif defined(STM32F4xx)
DMAtx.Instance->NDTR = Count;
DMAtx.Instance->PAR = (uint32_t)Data;
DMAtx.Instance->M0AR = (uint32_t)&(LCD->RAM);
#endif
__HAL_DMA_ENABLE(&DMAtx);
} }
#endif // HAS_FSMC_TFT #endif // HAS_FSMC_TFT

View File

@ -25,10 +25,8 @@
#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)
#else #else
#error "FSMC TFT is currently only supported on STM32F1 and STM32F4 hardware." #error "FSMC TFT is currently only supported on STM32F1 and STM32F4 hardware."
#endif #endif
@ -77,6 +75,13 @@ class TFT_FSMC {
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); }
static void WriteMultiple(uint16_t Color, uint32_t Count) {
static uint16_t Data; Data = Color;
while (Count > 0) {
TransmitDMA(DMA_MINC_DISABLE, &Data, Count > 0xFFFF ? 0xFFFF : Count);
Count = Count > 0xFFFF ? Count - 0xFFFF : 0;
}
}
}; };

View File

@ -88,7 +88,7 @@ void TFT_SPI::Init() {
#elif defined(STM32F4xx) #elif defined(STM32F4xx)
__HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE();
DMAtx.Instance = DMA1_Stream4; DMAtx.Instance = DMA1_Stream4;
DMAtx.Init.Channel = DMA_CHANNEL_4; DMAtx.Init.Channel = DMA_CHANNEL_0;
#endif #endif
} }
#endif #endif
@ -101,7 +101,7 @@ void TFT_SPI::Init() {
#elif defined(STM32F4xx) #elif defined(STM32F4xx)
__HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE();
DMAtx.Instance = DMA1_Stream5; DMAtx.Instance = DMA1_Stream5;
DMAtx.Init.Channel = DMA_CHANNEL_5; DMAtx.Init.Channel = DMA_CHANNEL_0;
#endif #endif
} }
#endif #endif
@ -183,6 +183,9 @@ bool TFT_SPI::isBusy() {
} }
void TFT_SPI::Abort() { void TFT_SPI::Abort() {
// Wait for any running spi
while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {}
while ((SPIx.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY) {}
// First, abort any running dma // First, abort any running dma
HAL_DMA_Abort(&DMAtx); HAL_DMA_Abort(&DMAtx);
// DeInit objects // DeInit objects
@ -223,6 +226,9 @@ void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Coun
__HAL_SPI_ENABLE(&SPIx); __HAL_SPI_ENABLE(&SPIx);
SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); /* Enable Tx DMA Request */ SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); /* Enable Tx DMA Request */
HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
Abort();
} }
#endif // HAS_SPI_TFT #endif // HAS_SPI_TFT

View File

@ -64,4 +64,11 @@ public:
static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); }
static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); }
static void WriteMultiple(uint16_t Color, uint32_t Count) {
static uint16_t Data; Data = Color;
while (Count > 0) {
TransmitDMA(DMA_MINC_DISABLE, &Data, Count > 0xFFFF ? 0xFFFF : Count);
Count = Count > 0xFFFF ? Count - 0xFFFF : 0;
}
}
}; };

View File

@ -23,7 +23,7 @@
#include "../../../inc/MarlinConfig.h" #include "../../../inc/MarlinConfig.h"
#if HAS_TFT_XPT2046 #if HAS_TFT_XPT2046 || HAS_TOUCH_BUTTONS
#include "xpt2046.h" #include "xpt2046.h"
#include "pinconfig.h" #include "pinconfig.h"
@ -31,7 +31,6 @@
uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; }
SPI_HandleTypeDef XPT2046::SPIx; SPI_HandleTypeDef XPT2046::SPIx;
DMA_HandleTypeDef XPT2046::DMAtx;
void XPT2046::Init() { void XPT2046::Init() {
SPI_TypeDef *spiInstance; SPI_TypeDef *spiInstance;
@ -71,34 +70,16 @@ void XPT2046::Init() {
if (SPIx.Instance == SPI1) { if (SPIx.Instance == SPI1) {
__HAL_RCC_SPI1_CLK_ENABLE(); __HAL_RCC_SPI1_CLK_ENABLE();
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
#ifdef STM32F1xx
DMAtx.Instance = DMA1_Channel3;
#elif defined(STM32F4xx)
DMAtx.Instance = DMA2_Stream3; // DMA2_Stream5
#endif
//SERIAL_ECHO_MSG(" Touch Screen on SPI1");
} }
#endif #endif
#ifdef SPI2_BASE #ifdef SPI2_BASE
if (SPIx.Instance == SPI2) { if (SPIx.Instance == SPI2) {
__HAL_RCC_SPI2_CLK_ENABLE(); __HAL_RCC_SPI2_CLK_ENABLE();
#ifdef STM32F1xx
DMAtx.Instance = DMA1_Channel5;
#elif defined(STM32F4xx)
DMAtx.Instance = DMA1_Stream4;
#endif
//SERIAL_ECHO_MSG(" Touch Screen on SPI2");
} }
#endif #endif
#ifdef SPI3_BASE #ifdef SPI3_BASE
if (SPIx.Instance == SPI3) { if (SPIx.Instance == SPI3) {
__HAL_RCC_SPI3_CLK_ENABLE(); __HAL_RCC_SPI3_CLK_ENABLE();
#ifdef STM32F1xx
DMAtx.Instance = DMA2_Channel2;
#elif defined(STM32F4xx)
DMAtx.Instance = DMA1_Stream5; // DMA1_Stream7
#endif
//SERIAL_ECHO_MSG(" Touch Screen on SPI3");
} }
#endif #endif
} }
@ -107,7 +88,6 @@ void XPT2046::Init() {
SET_INPUT(TOUCH_MISO_PIN); SET_INPUT(TOUCH_MISO_PIN);
SET_OUTPUT(TOUCH_MOSI_PIN); SET_OUTPUT(TOUCH_MOSI_PIN);
SET_OUTPUT(TOUCH_SCK_PIN); SET_OUTPUT(TOUCH_SCK_PIN);
//SERIAL_ECHO_MSG(" Touch Screen on Software SPI");
} }
getRawData(XPT2046_Z1); getRawData(XPT2046_Z1);

View File

@ -23,10 +23,8 @@
#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"
@ -65,9 +63,8 @@ enum XPTCoordinate : uint8_t {
class XPT2046 { class XPT2046 {
private: private:
static SPI_HandleTypeDef SPIx; static SPI_HandleTypeDef SPIx;
static DMA_HandleTypeDef DMAtx;
static bool isBusy() { return SPIx.Instance ? __IS_DMA_ENABLED(&DMAtx) : false; } static bool isBusy() { return false; }
static uint16_t getRawData(const XPTCoordinate coordinate); static uint16_t getRawData(const XPTCoordinate coordinate);
static bool isTouched(); static bool isTouched();

View File

@ -1187,7 +1187,7 @@
// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' // This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046'
#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT #if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT
#undef TOUCH_SCREEN #undef TOUCH_SCREEN
#if !HAS_TFT_LVGL_UI #if ENABLED(TFT_CLASSIC_UI)
#define HAS_TOUCH_BUTTONS 1 #define HAS_TOUCH_BUTTONS 1
#endif #endif
#endif #endif

View File

@ -3242,7 +3242,7 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
/** /**
* Touch Buttons * Touch Buttons
*/ */
#if ENABLED(TOUCH_SCREEN) #if ENABLED(TOUCH_SCREEN) && DISABLED(TOUCH_SCREEN_CALIBRATION)
#ifndef TOUCH_CALIBRATION_X #ifndef TOUCH_CALIBRATION_X
#error "TOUCH_CALIBRATION_X must be defined with TOUCH_SCREEN." #error "TOUCH_CALIBRATION_X must be defined with TOUCH_SCREEN."
#endif #endif

View File

@ -339,6 +339,8 @@ static uint8_t page;
} }
#endif // HAS_TOUCH_BUTTONS #endif // HAS_TOUCH_BUTTONS
static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT
uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { 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); u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
@ -352,19 +354,21 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
switch (msg) { switch (msg) {
case U8G_DEV_MSG_INIT: case U8G_DEV_MSG_INIT:
dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, nullptr); dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, nullptr);
tftio.Init();
tftio.InitTFT();
TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset());
if (preinit) { if (preinit) {
preinit = false; preinit = false;
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
} }
if (msgInitCount) return -1;
tftio.Init();
tftio.InitTFT();
TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset());
// Clear Screen // Clear Screen
setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1); setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1);
#if HAS_LCD_IO #if HAS_LCD_IO
tftio.WriteMultiple(TFT_MARLINBG_COLOR, uint32_t(TFT_WIDTH) * (TFT_HEIGHT)); tftio.WriteMultiple(TFT_MARLINBG_COLOR, (TFT_WIDTH) * (TFT_HEIGHT));
#else #else
memset2(buffer, TFT_MARLINBG_COLOR, (TFT_WIDTH) / 2); memset2(buffer, TFT_MARLINBG_COLOR, (TFT_WIDTH) / 2);
for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++) for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++)
@ -420,8 +424,6 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg);
} }
static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT
uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
if (msgInitCount) { if (msgInitCount) {
if (msg == U8G_COM_MSG_INIT) msgInitCount--; if (msg == U8G_COM_MSG_INIT) msgInitCount--;
@ -433,8 +435,6 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p
switch (msg) { switch (msg) {
case U8G_COM_MSG_STOP: break; case U8G_COM_MSG_STOP: break;
case U8G_COM_MSG_INIT: case U8G_COM_MSG_INIT:
u8g_SetPIOutput(u8g, U8G_PI_RESET);
u8g_Delay(50);
isCommand = 0; isCommand = 0;
break; break;
@ -443,7 +443,6 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p
break; break;
case U8G_COM_MSG_RESET: case U8G_COM_MSG_RESET:
u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
break; break;
case U8G_COM_MSG_WRITE_BYTE: case U8G_COM_MSG_WRITE_BYTE:

View File

@ -30,7 +30,7 @@
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if TFT_INTERFACE_FSMC_8BIT #if ENABLED(TFT_INTERFACE_FSMC_8BIT)
// When we have a 8 bit interface, we need to invert the bytes of the color // When we have a 8 bit interface, we need to invert the bytes of the color
#define ENDIAN_COLOR(C) (((C) >> 8) | ((C) << 8)) #define ENDIAN_COLOR(C) (((C) >> 8) | ((C) << 8))
#else #else

View File

@ -121,7 +121,7 @@ public:
static void write_esc_sequence(const uint16_t *Sequence); static void write_esc_sequence(const uint16_t *Sequence);
// Deletaged methods // Deletaged methods
inline static void Init() { io.Init(); }; inline static void Init() { io.Init(); io.Abort(); };
inline static bool isBusy() { return io.isBusy(); }; inline static bool isBusy() { return io.isBusy(); };
inline static void Abort() { io.Abort(); }; inline static void Abort() { io.Abort(); };
inline static uint32_t GetID() { return io.GetID(); }; inline static uint32_t GetID() { return io.GetID(); };

View File

@ -32,6 +32,7 @@ XPT2046 touchIO;
#endif #endif
#include "../marlinui.h" // For EN_C bit mask #include "../marlinui.h" // For EN_C bit mask
#include "../tft_io/tft_io.h"
#define DOGM_AREA_LEFT TFT_PIXEL_OFFSET_X #define DOGM_AREA_LEFT TFT_PIXEL_OFFSET_X
#define DOGM_AREA_TOP TFT_PIXEL_OFFSET_Y #define DOGM_AREA_TOP TFT_PIXEL_OFFSET_Y
@ -49,7 +50,8 @@ uint8_t TouchButtons::read_buttons() {
#ifdef HAS_WIRED_LCD #ifdef HAS_WIRED_LCD
int16_t x, y; int16_t x, y;
if (!touchIO.getRawPoint(&x, &y)) return 0; const bool is_touched = (TERN(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration.orientation, TOUCH_ORIENTATION) == TOUCH_PORTRAIT ? touchIO.getRawPoint(&y, &x) : touchIO.getRawPoint(&x, &y));
if (!is_touched) return 0;
#if ENABLED(TOUCH_SCREEN_CALIBRATION) #if ENABLED(TOUCH_SCREEN_CALIBRATION)
const calibrationState state = touch_calibration.get_calibration_state(); const calibrationState state = touch_calibration.get_calibration_state();

View File

@ -139,11 +139,15 @@
#define TFT_RS_PIN PD13 #define TFT_RS_PIN PD13
#define TFT_INTERFACE_FSMC_8BIT #define TFT_INTERFACE_FSMC_8BIT
#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT
#define FSMC_CS_PIN TFT_CS_PIN
#define FSMC_RS_PIN TFT_RS_PIN
// //
// Touch Screen // Touch Screen
// https://ldm-systems.ru/f/doc/catalog/HY-TFT-2,8/XPT2046.pdf // https://ldm-systems.ru/f/doc/catalog/HY-TFT-2,8/XPT2046.pdf
// //
#if ENABLED(TOUCH_SCREEN) #if NEED_TOUCH_PINS
#define TOUCH_CS_PIN PB2 #define TOUCH_CS_PIN PB2
#define TOUCH_SCK_PIN PB0 #define TOUCH_SCK_PIN PB0
#define TOUCH_MOSI_PIN PE5 #define TOUCH_MOSI_PIN PE5

View File

@ -32,7 +32,7 @@
#define BOARD_INFO_NAME "MKS Robin Nano V3" #define BOARD_INFO_NAME "MKS Robin Nano V3"
// Avoid conflict with TIMER_TONE // Avoid conflict with TIMER_TONE
#define STEP_TIMER 13 #define STEP_TIMER 10
// Use one of these or SDCard-based Emulation will be used // Use one of these or SDCard-based Emulation will be used
//#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation
@ -255,7 +255,7 @@
* EXP1 EXP2 * EXP1 EXP2
*/ */
#if EITHER(TFT_480x320_SPI, TFT_LVGL_UI_SPI) #if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI)
#ifndef TOUCH_CALIBRATION_X #ifndef TOUCH_CALIBRATION_X
#define TOUCH_CALIBRATION_X -17253 #define TOUCH_CALIBRATION_X -17253
#endif #endif
@ -345,26 +345,6 @@
#define BOARD_ST7920_DELAY_3 DELAY_NS(600) #define BOARD_ST7920_DELAY_3 DELAY_NS(600)
#endif // !MKS_MINI_12864 #endif // !MKS_MINI_12864
#elif ENABLED(SPI_GRAPHICAL_TFT)
#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 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
#define BTN_EN1 PE8
#define BTN_EN2 PE11
#define BEEPER_PIN PC5
#define BTN_ENC PE13
#endif // HAS_SPI_LCD #endif // HAS_SPI_LCD
#define HAS_OTG_USB_HOST_SUPPORT #define HAS_OTG_USB_HOST_SUPPORT

View File

@ -30,7 +30,7 @@
#define BOARD_INFO_NAME "MKS Robin PRO V2" #define BOARD_INFO_NAME "MKS Robin PRO V2"
// Avoid conflict with TIMER_TONE // Avoid conflict with TIMER_TONE
#define STEP_TIMER 13 #define STEP_TIMER 10
// Use one of these or SDCard-based Emulation will be used // Use one of these or SDCard-based Emulation will be used
//#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation
@ -243,7 +243,7 @@
// //
// LCD / Controller // LCD / Controller
#define SPI_FLASH #define SPI_FLASH
// #define HAS_SPI_FLASH 1 #define HAS_SPI_FLASH 1
#define SPI_DEVICE 2 #define SPI_DEVICE 2
#define SPI_FLASH_SIZE 0x1000000 #define SPI_FLASH_SIZE 0x1000000
#if ENABLED(SPI_FLASH) #if ENABLED(SPI_FLASH)
@ -264,7 +264,7 @@
* EXP1 EXP2 * EXP1 EXP2
*/ */
#if EITHER(TFT_480x320_SPI, TFT_LVGL_UI_SPI) #if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI)
#ifndef TOUCH_CALIBRATION_X #ifndef TOUCH_CALIBRATION_X
#define TOUCH_CALIBRATION_X -17253 #define TOUCH_CALIBRATION_X -17253
#endif #endif
@ -361,24 +361,4 @@
#endif #endif
#endif // !MKS_MINI_12864 #endif // !MKS_MINI_12864
#elif ENABLED(SPI_GRAPHICAL_TFT)
#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 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
#define BTN_EN1 PE8
#define BTN_EN2 PE11
#define BEEPER_PIN PC5
#define BTN_ENC PE13
#endif // HAS_SPI_LCD #endif // HAS_SPI_LCD

View File

@ -0,0 +1,14 @@
# Generate the firmware as OpenBLT needs
import os,sys
from os.path import join
Import("env")
env.AddPostAction(
"$BUILD_DIR/${PROGNAME}.elf",
env.VerboseAction(" ".join([
"$OBJCOPY", "-O", "srec",
"\"$BUILD_DIR/${PROGNAME}.elf\"", "\"$BUILD_DIR/${PROGNAME}.srec\""
]), "Building " + join("$BUILD_DIR","${PROGNAME}.srec"))
)

View File

@ -6,8 +6,6 @@ board = DefaultEnvironment().BoardConfig()
def noencrypt(source, target, env): def noencrypt(source, target, env):
firmware = os.path.join(target[0].dir.path, board.get("build.firmware")) firmware = os.path.join(target[0].dir.path, board.get("build.firmware"))
# do not overwrite encrypted firmware if present
if not os.path.isfile(firmware):
shutil.copy(target[0].path, firmware) shutil.copy(target[0].path, firmware)
if 'offset' in board.get("build").keys(): if 'offset' in board.get("build").keys():
@ -26,5 +24,7 @@ if 'offset' in board.get("build").keys():
if "-Wl,--defsym=LD_MAX_DATA_SIZE" in flag: if "-Wl,--defsym=LD_MAX_DATA_SIZE" in flag:
env["LINKFLAGS"][i] = "-Wl,--defsym=LD_MAX_DATA_SIZE=" + str(maximum_ram_size - 40) env["LINKFLAGS"][i] = "-Wl,--defsym=LD_MAX_DATA_SIZE=" + str(maximum_ram_size - 40)
if 'firmware' in board.get("build").keys(): board_keys = board.get("build").keys()
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", noencrypt); # Only copy file if there's no encryptation
if 'firmware' in board_keys and not 'encrypt' in board_keys:
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", noencrypt)

View File

@ -254,7 +254,7 @@ WEAK const PinMap PinMap_SPI_MOSI[] = {
{PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
// {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
{PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
// {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
{PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
{PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
{NC, NP, 0} {NC, NP, 0}
@ -266,7 +266,7 @@ WEAK const PinMap PinMap_SPI_MISO[] = {
{PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
// {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
{PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
// {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
{PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
{PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
{NC, NP, 0} {NC, NP, 0}

View File

@ -970,6 +970,7 @@ board_build.core = stm32
board_build.variant = MARLIN_F103Zx board_build.variant = MARLIN_F103Zx
board_build.ldscript = ldscript.ld board_build.ldscript = ldscript.ld
board_build.offset = 0x7000 board_build.offset = 0x7000
board_build.encrypt = Yes
board_build.firmware = Robin.bin board_build.firmware = Robin.bin
build_flags = ${common_stm32.build_flags} build_flags = ${common_stm32.build_flags}
-DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 -DTIMER_SERIAL=TIM5 -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 -DTIMER_SERIAL=TIM5
@ -1155,6 +1156,7 @@ board_build.variant = MARLIN_F103Vx
board_build.ldscript = ldscript.ld board_build.ldscript = ldscript.ld
board_build.offset = 0x7000 board_build.offset = 0x7000
board_build.firmware = Robin_mini.bin board_build.firmware = Robin_mini.bin
board_build.encrypt = Yes
board_upload.offset_address = 0x08007000 board_upload.offset_address = 0x08007000
build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC
extra_scripts = ${common.extra_scripts} extra_scripts = ${common.extra_scripts}
@ -1247,6 +1249,8 @@ board_build.core = stm32
board_build.variant = MARLIN_F4x7Vx board_build.variant = MARLIN_F4x7Vx
board_build.ldscript = ldscript.ld board_build.ldscript = ldscript.ld
board_build.firmware = firmware.srec board_build.firmware = firmware.srec
# Just anet_et4_openblt.py generates the file, not stm32_bootloader.py
board_build.encrypt = Yes
board_build.offset = 0x10000 board_build.offset = 0x10000
board_upload.offset_address = 0x08010000 board_upload.offset_address = 0x08010000
build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483
@ -1255,6 +1259,7 @@ upload_protocol = jlink
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
buildroot/share/PlatformIO/scripts/stm32_bootloader.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py
buildroot/share/PlatformIO/scripts/anet_et4_openblt.py
# #
# BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) # BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4)
@ -1308,6 +1313,7 @@ platform = ${common_stm32.platform}
extends = common_stm32 extends = common_stm32
board = LERDGE board = LERDGE
board_build.offset = 0x10000 board_build.offset = 0x10000
board_build.encrypt = Yes
extra_scripts = ${common.extra_scripts} extra_scripts = ${common.extra_scripts}
pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py
buildroot/share/PlatformIO/scripts/stm32_bootloader.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py
@ -1369,6 +1375,7 @@ board_build.core = stm32
board_build.variant = MARLIN_F103Vx board_build.variant = MARLIN_F103Vx
board_build.ldscript = ldscript.ld board_build.ldscript = ldscript.ld
board_build.offset = 0x7000 board_build.offset = 0x7000
board_build.encrypt = Yes
board_build.firmware = Robin_nano35.bin board_build.firmware = Robin_nano35.bin
board_upload.offset_address = 0x08007000 board_upload.offset_address = 0x08007000
build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC
@ -1385,19 +1392,18 @@ extra_scripts = ${common.extra_scripts}
[env:mks_robin_pro2] [env:mks_robin_pro2]
platform = ${common_stm32.platform} platform = ${common_stm32.platform}
extends = common_stm32 extends = common_stm32
build_flags = ${common_stm32.build_flags} -DHAL_HCD_MODULE_ENABLED -DUSBHOST -DARDUINO_BLACK_F407VE build_flags = ${common_stm32.build_flags} -DHAL_HCD_MODULE_ENABLED -DUSBHOST
board = genericSTM32F407VET6 board = genericSTM32F407VET6
board_build.core = stm32 board_build.core = stm32
board_build.variant = MARLIN_F407VE board_build.variant = MARLIN_F4x7Vx
board_build.ldscript = ldscript.ld board_build.ldscript = ldscript.ld
board_build.firmware = Robin_nano35.bin board_build.firmware = firmware.bin
build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC
debug_tool = jlink debug_tool = jlink
upload_protocol = jlink upload_protocol = jlink
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
buildroot/share/PlatformIO/scripts/stm32_bootloader.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py
buildroot/share/PlatformIO/scripts/mks_encrypt.py
# #
# MKS Robin Nano V3 # MKS Robin Nano V3
@ -1419,7 +1425,6 @@ upload_protocol = jlink
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
buildroot/share/PlatformIO/scripts/stm32_bootloader.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py
buildroot/share/PlatformIO/scripts/mks_encrypt.py
################################# #################################
# # # #