diff --git a/radio/src/Makefile b/radio/src/Makefile index d2b63b1a5..8237687e9 100644 --- a/radio/src/Makefile +++ b/radio/src/Makefile @@ -678,11 +678,11 @@ ifeq ($(PCB), TARANIS) CPPDEFS = -DREV4a SWR = YES else ifeq ($(PCBREV), REVPLUS) - CPPDEFS = -DREVPLUS + CPPDEFS = -DREVPLUS -DLCD_DUAL_BUFFER HAPTIC = YES SWR = NO else ifeq ($(PCBREV), REV9E) - CPPDEFS = -DREVPLUS -DREV9E + CPPDEFS = -DREVPLUS -DREV9E -DLCD_DUAL_BUFFER HAPTIC = YES SWR = YES else diff --git a/radio/src/lcd.h b/radio/src/lcd.h index c6f71e7e1..b28d18647 100644 --- a/radio/src/lcd.h +++ b/radio/src/lcd.h @@ -161,7 +161,13 @@ #define DISPLAY_BUF_SIZE (LCD_W*((LCD_H+7)/8)) #endif +#if defined(LCD_DUAL_BUFFER) +extern display_t displayBuf1[DISPLAY_BUF_SIZE]; +extern display_t displayBuf2[DISPLAY_BUF_SIZE]; +extern display_t * displayBuf; +#else extern display_t displayBuf[DISPLAY_BUF_SIZE]; +#endif extern coord_t lcdLastPos; extern coord_t lcdNextPos; diff --git a/radio/src/lcd_common.cpp b/radio/src/lcd_common.cpp index cd05611a1..e3adc9cc4 100644 --- a/radio/src/lcd_common.cpp +++ b/radio/src/lcd_common.cpp @@ -36,11 +36,20 @@ #include "opentx.h" + +#if defined(LCD_DUAL_BUFFER) +display_t displayBuf1[DISPLAY_BUF_SIZE]; +display_t displayBuf2[DISPLAY_BUF_SIZE]; +display_t * displayBuf = displayBuf1; +#define DISPLAY_BUFER_SIZE sizeof(displayBuf1) +#else display_t displayBuf[DISPLAY_BUF_SIZE]; +#define DISPLAY_BUFER_SIZE sizeof(displayBuf) +#endif void lcd_clear() { - memset(displayBuf, 0, sizeof(displayBuf)); + memset(displayBuf, 0, DISPLAY_BUFER_SIZE); } coord_t lcdLastPos; diff --git a/radio/src/targets/taranis/lcd_driver.cpp b/radio/src/targets/taranis/lcd_driver.cpp index b05274575..c16584189 100644 --- a/radio/src/targets/taranis/lcd_driver.cpp +++ b/radio/src/targets/taranis/lcd_driver.cpp @@ -193,11 +193,17 @@ void lcdRefresh(bool wait) DMA1_Stream7->CR &= ~DMA_SxCR_EN ; // Disable DMA DMA1->HIFCR = DMA_HIFCR_CTCIF7 | DMA_HIFCR_CHTIF7 | DMA_HIFCR_CTEIF7 | DMA_HIFCR_CDMEIF7 | DMA_HIFCR_CFEIF7 ; // Write ones to clear bits + +#if defined(LCD_DUAL_BUFFER) + //switch LCD buffer + DMA1_Stream7->M0AR = (uint32_t)displayBuf; + displayBuf = (displayBuf == displayBuf1) ? displayBuf2 : displayBuf1; +#endif + DMA1_Stream7->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA & tXe interrupt SPI3->CR2 |= SPI_CR2_TXDMAEN ; } -// #if !defined(SIMU) extern "C" void DMA1_Stream7_IRQHandler() { //clear interrupt flag @@ -207,15 +213,14 @@ extern "C" void DMA1_Stream7_IRQHandler() DMA1_Stream7->CR &= ~DMA_SxCR_EN ; // Disable DMA while ( SPI3->SR & SPI_SR_BSY ) { - /* Wait for SPI to finis sending data - The DMA Tx End interrupt comes two bytes before the end of SPI transmission, + /* Wait for SPI to finish sending data + The DMA TX End interrupt comes two bytes before the end of SPI transmission, therefore we have to wait here. */ } LCD_NCS_HIGH(); lcd_busy = false; } -// #endif // #if !defined(SIMU) #else // #if defined(REVPLUS) void lcdRefresh()