diff --git a/radio/src/targets/nv14/battery_driver.cpp b/radio/src/targets/nv14/battery_driver.cpp index 6ef43f042..ca6b11854 100644 --- a/radio/src/targets/nv14/battery_driver.cpp +++ b/radio/src/targets/nv14/battery_driver.cpp @@ -182,7 +182,6 @@ void handle_battery_charge(uint32_t last_press_time) lcdOn(); } updateTime = get_tmr10ms(); - lcdNextLayer(); lcd->clear(); drawChargingInfo(chargeState); lcdRefresh(); diff --git a/radio/src/targets/nv14/board.h b/radio/src/targets/nv14/board.h index 56d04e499..b1901434a 100644 --- a/radio/src/targets/nv14/board.h +++ b/radio/src/targets/nv14/board.h @@ -390,6 +390,9 @@ uint32_t pwrPressedDuration();; #define UNEXPECTED_SHUTDOWN() (powerupReason == DIRTY_SHUTDOWN) #endif +#define AUX_SERIAL_POWER_ON() +#define AUX_SERIAL_POWER_OFF() + // LCD driver #define LCD_W 320 #define LCD_H 480 diff --git a/radio/src/targets/nv14/bootloader/boot_menu.cpp b/radio/src/targets/nv14/bootloader/boot_menu.cpp index a689cacab..907f8d460 100644 --- a/radio/src/targets/nv14/bootloader/boot_menu.cpp +++ b/radio/src/targets/nv14/bootloader/boot_menu.cpp @@ -56,9 +56,6 @@ static void bootloaderDrawFooter() void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) { -#if defined(COLORLCD) - lcdNextLayer(); -#endif // clear screen lcd->drawSolidFilledRect(0, 0, LCD_W-1, LCD_H-1, DEFAULT_BGCOLOR); int center = LCD_W/2; @@ -162,6 +159,9 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) lcd->drawText(DOUBLE_PADDING, LCD_H - DEFAULT_PADDING, "[L TRIM] to exit"); } } +#if defined(COLORLCD) + lcdRefresh(); +#endif } void bootloaderDrawFilename(const char* str, uint8_t line, bool selected) diff --git a/radio/src/targets/nv14/lcd_driver.cpp b/radio/src/targets/nv14/lcd_driver.cpp index 007d7e446..6606a7af7 100644 --- a/radio/src/targets/nv14/lcd_driver.cpp +++ b/radio/src/targets/nv14/lcd_driver.cpp @@ -19,12 +19,12 @@ */ #include "opentx.h" - +#define LTDC_DOUBLELAYER uint8_t LCD_FIRST_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; uint8_t LCD_SECOND_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; uint8_t LCD_BACKUP_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; uint8_t LCD_SCRATCH_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; -uint8_t currentLayer = LCD_FIRST_LAYER; +bool secondFrame = false; lcdSpiInitFucPtr lcdInitFunction; lcdSpiInitFucPtr lcdOffFunction; @@ -1179,24 +1179,37 @@ void LCD_Init_LTDC() { LTDC_Init(<DC_InitStruct); -#if 0 + //Configure IRQ + // LTDC_ITConfig(LTDC_IER_RRIE, ENABLE); + // NVIC_InitTypeDef NVIC_InitStructure; + // NVIC_InitStructure.NVIC_IRQChannel = LTDC_IRQn; + // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = LTDC_IRQ_PRIO; + // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + // NVIC_Init(&NVIC_InitStructure); + LTDC_ITConfig(LTDC_IER_LIE, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = LTDC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = LTDC_IRQ_PRIO; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pr e-emption priority. */; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pre-emption priority. */; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init( &NVIC_InitStructure ); + NVIC_Init(&NVIC_InitStructure); + LTDC_LIPConfig(LCD_H); +#if 0 DMA2D_ITConfig(DMA2D_CR_TCIE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = DMA2D_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = DMA_SCREEN_IRQ_PRIO; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pr e-emption priority. */; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( &NVIC_InitStructure ); - DMA2D->IFCR = (unsigned long)DMA2D_IFSR_CTCIF; #endif + + // Enable LTDC IRQ in NVIC + NVIC_EnableIRQ(LTDC_IRQn); + NVIC_SetPriority(LTDC_IRQn, 7); } void LCD_LayerInit() { @@ -1247,25 +1260,29 @@ void LCD_LayerInit() { /* Initialize LTDC layer 1 */ LTDC_LayerInit(LTDC_Layer1, <DC_Layer_InitStruct); - /* Configure Layer 2 */ +#if defined(LTDC_DOUBLELAYER) + /* 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; - + LTDC_Layer_InitStruct.LTDC_CFBStartAdress = (uint32_t) LCD_SECOND_FRAME_BUFFER; + /* Initialize LTDC layer 2 */ LTDC_LayerInit(LTDC_Layer2, <DC_Layer_InitStruct); - +#endif /* LTDC configuration reload */ - LTDC_ReloadConfig (LTDC_IMReload); - - LTDC_LayerCmd(LTDC_Layer1, ENABLE); - LTDC_LayerCmd(LTDC_Layer2, ENABLE); - LTDC_ReloadConfig(LTDC_IMReload); + LTDC_LayerCmd(LTDC_Layer1, ENABLE); + LTDC_LayerAlpha(LTDC_Layer1, 255); + +#if defined(LTDC_DOUBLELAYER) + LTDC_LayerCmd(LTDC_Layer2, ENABLE); + LTDC_LayerAlpha(LTDC_Layer2, 0); +#endif + + LTDC_ReloadConfig(LTDC_IMReload); /* dithering activation */ LTDC_DitherCmd(ENABLE); } @@ -1277,27 +1294,11 @@ BitmapBuffer lcdBuffer2(BMP_RGB565, LCD_W, LCD_H, BitmapBuffer * lcdFront = &lcdBuffer1; BitmapBuffer * lcd = &lcdBuffer2; -void LCD_SetLayer(uint32_t layer) { - if (layer == LCD_FIRST_LAYER) { - lcd = &lcdBuffer1; - } else { - lcd = &lcdBuffer2; - } - currentLayer = layer; -} - -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); -} - extern void loadFonts(); void lcdInit(void) { + // 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)); loadFonts(); /* Configure the LCD SPI+RESET pins */ @@ -1308,7 +1309,7 @@ void lcdInit(void) { /* Configure the LCD Control pins */ LCD_AF_GPIOConfig(); - + /* Send LCD initializaiton commands */ if (LCD_ILI9481_ReadID() == LCD_ILI9481_ID) { TRACE("LCD INIT: ILI9481"); @@ -1339,23 +1340,11 @@ void lcdInit(void) { } lcdInitFunction(); - + LCD_Init_LTDC(); - LCD_LayerInit(); - - /* Enable LCD display */ LTDC_Cmd(ENABLE); - - /* Set Background layer */ - LCD_SetLayer (LCD_FIRST_LAYER); - // lcdClear(); - LCD_SetTransparency(0); - - /* Set Foreground layer */ - LCD_SetLayer (LCD_SECOND_LAYER); - lcd->clear(); - LCD_SetTransparency(255); + LTDC_ReloadConfig(LTDC_IMReload); } 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) @@ -1460,7 +1449,6 @@ void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_ // same as DMACopyAlphaBitmap(), but with an 8 bit mask for each pixel (used by fonts) void DMACopyAlphaMask(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint8_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h, uint16_t bg_color) { - TRACE("++++++"); DMA2D_DeInit(); DMA2D_InitTypeDef DMA2D_InitStruct; @@ -1592,27 +1580,27 @@ uint16_t* lcdGetScratchBuffer() return (uint16_t*)LCD_SCRATCH_FRAME_BUFFER; } +static volatile uint8_t refreshRequested = 0; + +extern "C" void LTDC_IRQHandler(void) +{ + LTDC_ClearFlag(LTDC_ICR_CLIF); + if (refreshRequested) { +#if defined(LTDC_DOUBLELAYER) + LTDC_LayerAlpha(LTDC_Layer1, (lcd == &lcdBuffer2) ? 255 : 0); + LTDC_LayerAlpha(LTDC_Layer2, (lcd == &lcdBuffer1) ? 255 : 0); +#else + LTDC_Layer1->CFBAR = (uint32_t)((lcd == &lcdBuffer2) ? &lcdBuffer1 : &lcdBuffer2)->getData(); +#endif + LTDC_ReloadConfig(LTDC_IMReload); + refreshRequested = false; + } +} + 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); + while(refreshRequested) {} //block if last frame was not painted yet + lcd = (lcd == &lcdBuffer2) ? &lcdBuffer1 : &lcdBuffer2; + refreshRequested = true; } -void lcdNextLayer() -{ - if (currentLayer == LCD_FIRST_LAYER) { - LCD_SetLayer(LCD_SECOND_LAYER); - } - else { - LCD_SetLayer(LCD_FIRST_LAYER); - } -} - - diff --git a/radio/src/targets/nv14/lcd_driver.h b/radio/src/targets/nv14/lcd_driver.h index bc348984e..32b9d7079 100644 --- a/radio/src/targets/nv14/lcd_driver.h +++ b/radio/src/targets/nv14/lcd_driver.h @@ -32,9 +32,6 @@ #define HFP ( 140 - HBP ) #define VFP ( 22 - VBP ) -#define LCD_FIRST_LAYER ( 0 ) -#define LCD_SECOND_LAYER ( 1 ) - #define PORT_LCD_CS ( GPIOE ) #define LCD_CS_PIN ( GPIO_Pin_4 )