Dual-buffer for LCD
This commit is contained in:
+2
-2
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user