From 95aa02ceddf0b5633f0c260df1c459ae74b8faef Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 22 May 2021 12:42:20 +0200 Subject: [PATCH] Switch the framebuffer address rather than using 2 LTDC layers --- radio/src/gui/colorlcd/draw_functions.cpp | 4 +- radio/src/main.cpp | 1 - .../targets/horus/bootloader/boot_menu.cpp | 6 -- radio/src/targets/horus/lcd_driver.cpp | 96 +++++++------------ radio/src/targets/simu/simpgmspace.cpp | 18 ---- radio/src/targets/simu/simulcd.cpp | 6 ++ radio/src/thirdparty/libopenui | 2 +- 7 files changed, 40 insertions(+), 93 deletions(-) diff --git a/radio/src/gui/colorlcd/draw_functions.cpp b/radio/src/gui/colorlcd/draw_functions.cpp index f79c9b0dd..8b028ea6f 100644 --- a/radio/src/gui/colorlcd/draw_functions.cpp +++ b/radio/src/gui/colorlcd/draw_functions.cpp @@ -76,7 +76,6 @@ void drawValueOrGVar(BitmapBuffer * dc, coord_t x, coord_t y, gvar_t value, gvar void drawSleepBitmap() { - lcdNextLayer(); lcd->reset(); lcd->clear(); @@ -97,7 +96,6 @@ void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration, const char static const BitmapBuffer * shutdown = BitmapBuffer::loadBitmap(OpenTxTheme::instance()->getFilePath("shutdown.bmp")); - lcdNextLayer(); lcd->reset(); if (shutdown) { @@ -431,4 +429,4 @@ void drawHexNumber(BitmapBuffer * dc, coord_t x, coord_t y, uint32_t val, LcdFla c += (c >= 10 ? 'A' - 10 : '0'); x = dc->drawSizedText(x, y, &c, 1, flags); } -} \ No newline at end of file +} diff --git a/radio/src/main.cpp b/radio/src/main.cpp index dfc742c5a..66610cf3e 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -475,7 +475,6 @@ void perMain() if (usbPlugged() && getSelectedUsbMode() == USB_MASS_STORAGE_MODE) { #if defined(LIBOPENUI) // draw some image showing USB - lcdNextLayer(); lcd->reset(); OpenTxTheme::instance()->drawUsbPluggedScreen(lcd); lcdRefresh(); diff --git a/radio/src/targets/horus/bootloader/boot_menu.cpp b/radio/src/targets/horus/bootloader/boot_menu.cpp index 310b5fbb7..a9a0e5aa3 100644 --- a/radio/src/targets/horus/bootloader/boot_menu.cpp +++ b/radio/src/targets/horus/bootloader/boot_menu.cpp @@ -95,12 +95,6 @@ static void bootloaderDrawBackground() void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) { - // shows current layer on LCD - lcdRefresh(); - - // swap back & front buffers - lcdNextLayer(); - bootloaderDrawBackground(); if (st == ST_START) { diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp index 6275ca903..cf5e8755d 100644 --- a/radio/src/targets/horus/lcd_driver.cpp +++ b/radio/src/targets/horus/lcd_driver.cpp @@ -51,7 +51,9 @@ uint8_t currentLayer = LCD_FIRST_LAYER; BitmapBuffer lcdBuffer1(BMP_RGB565, LCD_W, LCD_H, (uint16_t *)LCD_FIRST_FRAME_BUFFER); BitmapBuffer lcdBuffer2(BMP_RGB565, LCD_W, LCD_H, (uint16_t *)LCD_SECOND_FRAME_BUFFER); -BitmapBuffer * lcd = &lcdBuffer1; + +BitmapBuffer * lcdFront = &lcdBuffer1; +BitmapBuffer * lcd = &lcdBuffer2; inline void LCD_NRST_LOW() { @@ -63,11 +65,6 @@ inline void LCD_NRST_HIGH() LCD_GPIO_NRST->BSRRL = LCD_GPIO_PIN_NRST; } -inline bool coordsWithinScreen(coord_t x, coord_t y, coord_t w, coord_t h) -{ - return x >= 0 && y >= 0 && x + w <= LCD_W && y + h <= LCD_H; -} - static void LCD_AF_GPIOConfig() { GPIO_InitTypeDef GPIO_InitStructure; @@ -262,8 +259,10 @@ void LCD_LayerInit() /* Pixel Format configuration*/ LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565; + /* Alpha constant (255 totally opaque) */ LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 255; + /* Default Color configuration (configure A,R,G,B component values) */ LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0; LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0; @@ -294,26 +293,15 @@ void LCD_LayerInit() /* Initialize LTDC layer 1 */ LTDC_LayerInit(LTDC_Layer1, <DC_Layer_InitStruct); - /* Configure Layer 2 */ - LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA; - LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA; - - /* Start Address configuration : the LCD Frame buffer is defined on SDRAM w/ Offset */ - LTDC_Layer_InitStruct.LTDC_CFBStartAdress = (uint32_t)LCD_SECOND_FRAME_BUFFER; - - /* Initialize LTDC layer 2 */ - LTDC_LayerInit(LTDC_Layer2, <DC_Layer_InitStruct); - /* LTDC configuration reload */ LTDC_ReloadConfig(LTDC_IMReload); + // Enable layer and reload LTDC_LayerCmd(LTDC_Layer1, ENABLE); - LTDC_LayerCmd(LTDC_Layer2, ENABLE); - LTDC_ReloadConfig(LTDC_IMReload); /* dithering activation */ - LTDC_DitherCmd(ENABLE); + LTDC_DitherCmd(ENABLE); // ???? } void LCD_Init(void) @@ -331,49 +319,28 @@ void LCD_Init(void) void LCD_SetLayer(uint32_t layer) { if (layer == LCD_FIRST_LAYER) { - lcd = &lcdBuffer1; + lcdFront = &lcdBuffer1; + lcd = &lcdBuffer2; } else { - lcd = &lcdBuffer2; + lcdFront = &lcdBuffer2; + lcd = &lcdBuffer1; } currentLayer = layer; } -/** - * @brief Configure the transparency. - * @param transparency: specifies the transparency, - * This parameter must range from 0x00 to 0xFF. - * @retval None - */ -void LCD_SetTransparency(uint8_t transparency) -{ - if (currentLayer == LCD_FIRST_LAYER) { - LTDC_LayerAlpha(LTDC_Layer1, transparency); - } - else { - LTDC_LayerAlpha(LTDC_Layer2, transparency); - } - LTDC_ReloadConfig(LTDC_IMReload); -} - void lcdInit() { - /* Initialize the LCD */ + // Clear buffers first + memset(LCD_FIRST_FRAME_BUFFER, 0, sizeof(LCD_FIRST_FRAME_BUFFER)); + memset(LCD_SECOND_FRAME_BUFFER, 0, sizeof(LCD_SECOND_FRAME_BUFFER)); + + // Initialize the LCD LCD_Init(); LCD_LayerInit(); - /* Enable LCD display */ + // Enable LCD display LTDC_Cmd(ENABLE); - - /* Set Background layer */ - memset(LCD_FIRST_FRAME_BUFFER, 0, sizeof(LCD_FIRST_FRAME_BUFFER)); - LCD_SetLayer(LCD_FIRST_LAYER); - LCD_SetTransparency(0); - - /* Set Foreground layer */ - memset(LCD_SECOND_FRAME_BUFFER, 0, sizeof(LCD_SECOND_FRAME_BUFFER)); - LCD_SetLayer(LCD_SECOND_LAYER); - LCD_SetTransparency(255); } void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) @@ -637,25 +604,26 @@ uint16_t* lcdGetScratchBuffer() return (uint16_t*)LCD_SCRATCH_FRAME_BUFFER; } -void lcdRefresh() -{ - if (currentLayer == LCD_FIRST_LAYER) { - LTDC_LayerAlpha(LTDC_Layer1, 255); - LTDC_LayerAlpha(LTDC_Layer2, 0); - } - else { - LTDC_LayerAlpha(LTDC_Layer1, 0); - LTDC_LayerAlpha(LTDC_Layer2, 255); - } - LTDC_ReloadConfig(LTDC_IMReload); -} - -void lcdNextLayer() +static void lcdSwitchLayers() { if (currentLayer == LCD_FIRST_LAYER) { + LTDC_Layer1->CFBAR = (uint32_t)LCD_SECOND_FRAME_BUFFER; LCD_SetLayer(LCD_SECOND_LAYER); } else { + LTDC_Layer1->CFBAR = (uint32_t)LCD_FIRST_FRAME_BUFFER; LCD_SetLayer(LCD_FIRST_LAYER); } + + // reload shadow registers on vertical blank + LTDC->SRCR = LTDC_SRCR_VBR; + + // wait for reload + // TODO: replace through some smarter mechanism without busy wait + while ((LTDC->CDSR & LTDC_CDSR_VSYNCS) == 0); +} + +void lcdRefresh() +{ + lcdSwitchLayers(); } diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 2b96aa06d..c06cc7ce6 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -89,24 +89,6 @@ Adc Adc0; FATFS g_FATFS_Obj; -void lcdInit() -{ -} - -void lcdCopy(void * dest, void * src) -{ - -} - -void lcdNextLayer() -{ - -} - -void toplcdOff() -{ -} - uint64_t simuTimerMicros(void) { #if SIMPGMSPC_USE_QT diff --git a/radio/src/targets/simu/simulcd.cpp b/radio/src/targets/simu/simulcd.cpp index c92ace74d..754743f6c 100644 --- a/radio/src/targets/simu/simulcd.cpp +++ b/radio/src/targets/simu/simulcd.cpp @@ -28,6 +28,12 @@ pixel_t scratchBuf[DISPLAY_BUFFER_SIZE]; BitmapBuffer _lcd(BMP_RGB565, LCD_W, LCD_H, displayBuf); BitmapBuffer * lcd = &_lcd; +BitmapBuffer * lcdFront = &_lcd; + +void lcdInit() {} +void lcdCopy(void *dest, void *src) {} +void lcdNextLayer() {} +void toplcdOff() {} uint16_t * lcdGetScratchBuffer() { diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index fdf289100..1c558559e 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit fdf289100013928330c08be5c74a05419e836ec5 +Subproject commit 1c558559eba805233b1876c43dd8ffb46673191e