✨ TFT_COLOR_UI async DMA SPI (#24980)
This commit is contained in:
committed by
Scott Lahteine
parent
d082223fee
commit
ec6349f2ac
@ -65,9 +65,9 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if TFT_BUFFER_SIZE > 65535
|
||||
#if TFT_BUFFER_SIZE > DMA_MAX_SIZE
|
||||
// DMA Count parameter is uint16_t
|
||||
#error "TFT_BUFFER_SIZE can not exceed 65535"
|
||||
#error "TFT_BUFFER_SIZE can not exceed DMA_MAX_SIZE"
|
||||
#endif
|
||||
|
||||
class TFT {
|
||||
@ -86,8 +86,8 @@ class TFT {
|
||||
|
||||
static bool is_busy() { return io.isBusy(); }
|
||||
static void abort() { io.Abort(); }
|
||||
static void write_multiple(uint16_t Data, uint16_t Count) { io.WriteMultiple(Data, Count); }
|
||||
static void write_sequence(uint16_t *Data, uint16_t Count) { io.WriteSequence(Data, Count); }
|
||||
static void write_multiple(uint16_t Data, uint16_t Count) { io.WriteMultipleDMA(Data, Count); }
|
||||
static void write_sequence(uint16_t *Data, uint16_t Count) { io.WriteSequenceDMA(Data, Count); }
|
||||
static void set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { io.set_window(Xmin, Ymin, Xmax, Ymax); }
|
||||
|
||||
static void fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.fill(x, y, width, height, color); }
|
||||
|
@ -86,9 +86,9 @@ void TFT_Queue::fill(queueTask_t *task) {
|
||||
task->state = TASK_STATE_IN_PROGRESS;
|
||||
}
|
||||
|
||||
if (task_parameters->count > 65535) {
|
||||
count = 65535;
|
||||
task_parameters->count -= 65535;
|
||||
if (task_parameters->count > DMA_MAX_SIZE) {
|
||||
count = DMA_MAX_SIZE;
|
||||
task_parameters->count -= DMA_MAX_SIZE;
|
||||
}
|
||||
else {
|
||||
count = task_parameters->count;
|
||||
|
@ -135,6 +135,7 @@ class TFT_Queue {
|
||||
static void reset();
|
||||
static void async();
|
||||
static void sync() { while (current_task != nullptr) async(); }
|
||||
static bool is_empty() { return current_task == nullptr; }
|
||||
|
||||
static void fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color);
|
||||
static void canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height);
|
||||
|
@ -57,7 +57,8 @@ void MarlinUI::tft_idle() {
|
||||
#endif
|
||||
|
||||
tft.queue.async();
|
||||
TERN_(TOUCH_SCREEN, touch.idle());
|
||||
|
||||
TERN_(TOUCH_SCREEN, if (tft.queue.is_empty()) touch.idle()); // Touch driver is not DMA-aware, so only check for touch controls after screen drawing is completed
|
||||
}
|
||||
|
||||
#if ENABLED(SHOW_BOOTSCREEN)
|
||||
@ -325,7 +326,10 @@ void MarlinUI::draw_status_screen() {
|
||||
|
||||
#if ENABLED(TOUCH_SCREEN)
|
||||
add_control(900, y, menu_main, imgSettings);
|
||||
TERN_(SDSUPPORT, add_control(12, y, menu_media, imgSD, !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED));
|
||||
#if ENABLED(SDSUPPORT)
|
||||
const bool cm = card.isMounted(), pa = printingIsActive();
|
||||
add_control(12, y, menu_media, imgSD, cm && !pa, COLOR_CONTROL_ENABLED, cm && pa ? COLOR_BUSY : COLOR_CONTROL_DISABLED);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
y += 100;
|
||||
|
@ -57,7 +57,8 @@ void MarlinUI::tft_idle() {
|
||||
#endif
|
||||
|
||||
tft.queue.async();
|
||||
TERN_(TOUCH_SCREEN, touch.idle());
|
||||
|
||||
TERN_(TOUCH_SCREEN, if (tft.queue.is_empty()) touch.idle()); // Touch driver is not DMA-aware, so only check for touch controls after screen drawing is completed
|
||||
}
|
||||
|
||||
#if ENABLED(SHOW_BOOTSCREEN)
|
||||
@ -342,7 +343,10 @@ void MarlinUI::draw_status_screen() {
|
||||
|
||||
#if ENABLED(TOUCH_SCREEN)
|
||||
add_control(256, 130, menu_main, imgSettings);
|
||||
TERN_(SDSUPPORT, add_control(0, 130, menu_media, imgSD, !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED));
|
||||
#if ENABLED(SDSUPPORT)
|
||||
const bool cm = card.isMounted(), pa = printingIsActive();
|
||||
add_control(0, 130, menu_media, imgSD, cm && !pa, COLOR_CONTROL_ENABLED, cm && pa ? COLOR_BUSY : COLOR_CONTROL_DISABLED);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,8 @@ void MarlinUI::tft_idle() {
|
||||
#endif
|
||||
|
||||
tft.queue.async();
|
||||
TERN_(TOUCH_SCREEN, touch.idle());
|
||||
|
||||
TERN_(TOUCH_SCREEN, if (tft.queue.is_empty()) touch.idle()); // Touch driver is not DMA-aware, so only check for touch controls after screen drawing is completed
|
||||
}
|
||||
|
||||
#if ENABLED(SHOW_BOOTSCREEN)
|
||||
@ -319,7 +320,10 @@ void MarlinUI::draw_status_screen() {
|
||||
|
||||
#if ENABLED(TOUCH_SCREEN)
|
||||
add_control(404, y, menu_main, imgSettings);
|
||||
TERN_(SDSUPPORT, add_control(12, y, menu_media, imgSD, !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED));
|
||||
#if ENABLED(SDSUPPORT)
|
||||
const bool cm = card.isMounted(), pa = printingIsActive();
|
||||
add_control(12, y, menu_media, imgSD, cm && !pa, COLOR_CONTROL_ENABLED, cm && pa ? COLOR_BUSY : COLOR_CONTROL_DISABLED);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
y += TERN(HAS_UI_480x272, 36, 44);
|
||||
|
@ -60,7 +60,7 @@ TFT_IO_DRIVER TFT_IO::io;
|
||||
uint32_t TFT_IO::lcd_id = 0xFFFFFFFF;
|
||||
|
||||
void TFT_IO::InitTFT() {
|
||||
if (lcd_id != 0xFFFFFFFF) return;
|
||||
if (lcd_id != 0xFFFFFFFF) return;
|
||||
|
||||
#if PIN_EXISTS(TFT_BACKLIGHT)
|
||||
OUT_WRITE(TFT_BACKLIGHT_PIN, LOW);
|
||||
@ -243,7 +243,7 @@ void TFT_IO::write_esc_sequence(const uint16_t *Sequence) {
|
||||
continue;
|
||||
}
|
||||
data = *Sequence++;
|
||||
if (data == 0x7FFF) return;
|
||||
if (data == 0x7FFF) break;
|
||||
if (data == 0xFFFF)
|
||||
io.WriteData(0xFFFF);
|
||||
else if (data & 0x8000)
|
||||
|
@ -30,7 +30,11 @@
|
||||
#elif HAS_LTDC_TFT
|
||||
#include HAL_PATH(../../HAL, tft/tft_ltdc.h)
|
||||
#else
|
||||
#error "TFT IO only supports SPI, FSMC or LTDC interface"
|
||||
#error "TFT IO only supports SPI, FSMC or LTDC interface."
|
||||
#endif
|
||||
|
||||
#ifndef DMA_MAX_SIZE
|
||||
#error "MAX_DMA_SIZE is not configured for this platform."
|
||||
#endif
|
||||
|
||||
#define TFT_EXCHANGE_XY _BV32(1)
|
||||
@ -108,27 +112,33 @@ public:
|
||||
static void write_esc_sequence(const uint16_t *Sequence);
|
||||
|
||||
// Deletaged methods
|
||||
inline static void Init() { io.Init(); io.Abort(); };
|
||||
inline static bool isBusy() { return io.isBusy(); };
|
||||
inline static void Abort() { io.Abort(); };
|
||||
inline static uint32_t GetID() { return io.GetID(); };
|
||||
inline static void Init() { io.Init(); }
|
||||
inline static bool isBusy() { return io.isBusy(); }
|
||||
inline static void Abort() { io.Abort(); }
|
||||
inline static uint32_t GetID() { return io.GetID(); }
|
||||
|
||||
inline static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) { io.DataTransferBegin(DataWidth); }
|
||||
inline static void DataTransferEnd() { io.DataTransferEnd(); };
|
||||
// inline static void DataTransferAbort() { io.DataTransferAbort(); };
|
||||
inline static void DataTransferEnd() { io.DataTransferEnd(); }
|
||||
|
||||
inline static void WriteData(uint16_t Data) { io.WriteData(Data); };
|
||||
inline static void WriteReg(uint16_t Reg) { io.WriteReg(Reg); };
|
||||
inline static void WriteData(uint16_t Data) { io.WriteData(Data); }
|
||||
inline static void WriteReg(uint16_t Reg) { io.WriteReg(Reg); }
|
||||
|
||||
inline static void WriteSequence(uint16_t *Data, uint16_t Count) { io.WriteSequence(Data, Count); };
|
||||
// Blocking IO used by TFT_CLASSIC_UI and TFT_LVGL_UI
|
||||
// These functions start data transfer and WAIT for data transfer completion
|
||||
inline static void WriteSequence(uint16_t *Data, uint16_t Count) { io.WriteSequence(Data, Count); }
|
||||
inline static void WriteMultiple(uint16_t Color, uint32_t Count) { io.WriteMultiple(Color, Count); }
|
||||
|
||||
// Non-blocking DMA-based IO used by TFT_COLOR_UI only
|
||||
// These functions start data transfer using DMA and do NOT wait for data transfer completion
|
||||
inline static void WriteSequenceDMA(uint16_t *Data, uint16_t Count) { io.WriteSequence_DMA(Data, Count); }
|
||||
inline static void WriteMultipleDMA(uint16_t Color, uint16_t Count) { io.WriteMultiple_DMA(Color, Count); }
|
||||
|
||||
// Non-blocking DMA-based IO with IRQ callback used by TFT_LVGL_UI only
|
||||
// This function starts data transfer using DMA and does NOT wait for data transfer completion
|
||||
#if ENABLED(USE_SPI_DMA_TC)
|
||||
inline static void WriteSequenceIT(uint16_t *Data, uint16_t Count) { io.WriteSequenceIT(Data, Count); };
|
||||
inline static void WriteSequenceIT(uint16_t *Data, uint16_t Count) { io.WriteSequenceIT(Data, Count); }
|
||||
#endif
|
||||
|
||||
// static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); }
|
||||
inline static void WriteMultiple(uint16_t Color, uint32_t Count) { io.WriteMultiple(Color, Count); };
|
||||
|
||||
protected:
|
||||
static uint32_t lcd_id;
|
||||
};
|
||||
|
Reference in New Issue
Block a user