diff options
author | inmarket <andrewh@inmarket.com.au> | 2017-10-01 18:00:49 +1000 |
---|---|---|
committer | inmarket <andrewh@inmarket.com.au> | 2017-10-01 18:00:49 +1000 |
commit | 82047b1ac6e56361abac0c4b01f06c405e941d19 (patch) | |
tree | 85c199ec82a65f0db2e944f309a93b2b7655724f /boards/base/STM32F469i-Discovery/board_STM32LTDC.h | |
parent | 70222f8c8ddaccf1362f97f4c595d1d06ef680ef (diff) | |
download | uGFX-82047b1ac6e56361abac0c4b01f06c405e941d19.tar.gz uGFX-82047b1ac6e56361abac0c4b01f06c405e941d19.tar.bz2 uGFX-82047b1ac6e56361abac0c4b01f06c405e941d19.zip |
STM32LTDC 2nd layer support with alpha
Diffstat (limited to 'boards/base/STM32F469i-Discovery/board_STM32LTDC.h')
-rw-r--r-- | boards/base/STM32F469i-Discovery/board_STM32LTDC.h | 92 |
1 files changed, 53 insertions, 39 deletions
diff --git a/boards/base/STM32F469i-Discovery/board_STM32LTDC.h b/boards/base/STM32F469i-Discovery/board_STM32LTDC.h index e58f566a..cd87d89e 100644 --- a/boards/base/STM32F469i-Discovery/board_STM32LTDC.h +++ b/boards/base/STM32F469i-Discovery/board_STM32LTDC.h @@ -27,6 +27,8 @@ static DSI_VidCfgTypeDef hdsivideo_handle; DSI_HandleTypeDef hdsi_eval; +#define ALLOW_2ND_LAYER FALSE // Do we really have the RAM bandwidth for this? + // Panel parameters // This panel is a KoD KM-040TMP-02-0621 DSI LCD Display. @@ -45,8 +47,8 @@ static const ltdcConfig driverCfg = { LTDC_PIXELFORMAT, // Pixel format 0, 0, // Start pixel position (x, y) 800, 480, // Size of virtual layer (cx, cy) - LTDC_COLOR_FUCHSIA, // Default color (ARGB8888) - 0x980088, // Color key (RGB888) + 0x00000000, // Default color (ARGB8888) + 0x000000, // Color key (RGB888) LTDC_BLEND_FIX1_FIX2, // Blending factors 0, // Palette (RGB888, can be NULL) 0, // Palette length @@ -54,18 +56,34 @@ static const ltdcConfig driverCfg = { LTDC_LEF_ENABLE // Layer configuration flags }, - LTDC_UNUSED_LAYER_CONFIG // Foreground layer config +#if ALLOW_2ND_LAYER + { // Foreground layer config (if turned on) + (LLDCOLOR_TYPE *)(SDRAM_DEVICE_ADDR+(800 * 480 * LTDC_PIXELBYTES)), // Frame buffer address + 800, 480, // Width, Height (pixels) + 800 * LTDC_PIXELBYTES, // Line pitch (bytes) + LTDC_PIXELFORMAT, // Pixel format + 0, 0, // Start pixel position (x, y) + 800, 480, // Size of virtual layer (cx, cy) + 0x00000000, // Default color (ARGB8888) + 0x000000, // Color key (RGB888) + LTDC_BLEND_MOD1_MOD2, // Blending factors + 0, // Palette (RGB888, can be NULL) + 0, // Palette length + 0xFF, // Constant alpha factor + LTDC_LEF_ENABLE // Layer configuration flags + } +#else + LTDC_UNUSED_LAYER_CONFIG +#endif }; /* Display timing */ #define KoD_FREQUENCY_DIVIDER 7 static GFXINLINE void init_board(GDisplay *g) { + (void) g; - // As we are not using multiple displays we set g->board to NULL as we don't use it - g->board = 0; - - DSI_PLLInitTypeDef dsiPllInit; + DSI_PLLInitTypeDef dsiPllInit; DSI_PHY_TimerTypeDef PhyTimings; // static RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; uint32_t LcdClock = 30000;//27429; /*!< LcdClk = 27429 kHz */ @@ -89,8 +107,8 @@ static GFXINLINE void init_board(GDisplay *g) { uint32_t HBP; /*!< Horizontal Back Porch time in units of lcdClk */ uint32_t HFP; /*!< Horizontal Front Porch time in units of lcdClk */ uint32_t HACT; /*!< Horizontal Active time in units of lcdClk = imageSize X in pixels to display */ - - + + /* Toggle Hardware Reset of the DSI LCD using * its XRES signal (active low) */ BSP_LCD_Reset(); @@ -102,19 +120,19 @@ static GFXINLINE void init_board(GDisplay *g) { * - NVIC IRQ related to IP blocks enabled */ BSP_LCD_MspInit(); - - /*************************DSI Initialization***********************************/ - + + /*************************DSI Initialization***********************************/ + /* Base address of DSI Host/Wrapper registers to be set before calling De-Init */ hdsi_eval.Instance = DSI; - + HAL_DSI_DeInit(&(hdsi_eval)); - + #if !defined(USE_STM32469I_DISCO_REVA) dsiPllInit.PLLNDIV = 125; dsiPllInit.PLLIDF = DSI_PLL_IN_DIV2; dsiPllInit.PLLODF = DSI_PLL_OUT_DIV1; - #else + #else dsiPllInit.PLLNDIV = 100; dsiPllInit.PLLIDF = DSI_PLL_IN_DIV5; dsiPllInit.PLLODF = DSI_PLL_OUT_DIV1; @@ -123,10 +141,10 @@ static GFXINLINE void init_board(GDisplay *g) { /* Set number of Lanes */ hdsi_eval.Init.NumberOfLanes = DSI_TWO_DATA_LANES; - + /* TXEscapeCkdiv = f(LaneByteClk)/15.62 = 4 */ - hdsi_eval.Init.TXEscapeCkdiv = laneByteClk_kHz/15620; - + hdsi_eval.Init.TXEscapeCkdiv = laneByteClk_kHz/15620; + HAL_DSI_Init(&(hdsi_eval), &(dsiPllInit)); /* Timing parameters for all Video modes @@ -139,7 +157,7 @@ static GFXINLINE void init_board(GDisplay *g) { HACT = lcd_x_size; VACT = lcd_y_size; - + /* The following values are same for portrait and landscape orientations */ VSA = 12;//OTM8009A_480X800_VSYNC; /* 12 */ VBP = 12;//OTM8009A_480X800_VBP; /* 12 */ @@ -152,11 +170,11 @@ static GFXINLINE void init_board(GDisplay *g) { hdsivideo_handle.ColorCoding = LCD_DSI_PIXEL_DATA_FMT_RBG888; hdsivideo_handle.VSPolarity = DSI_VSYNC_ACTIVE_HIGH; hdsivideo_handle.HSPolarity = DSI_HSYNC_ACTIVE_HIGH; - hdsivideo_handle.DEPolarity = DSI_DATA_ENABLE_ACTIVE_HIGH; + hdsivideo_handle.DEPolarity = DSI_DATA_ENABLE_ACTIVE_HIGH; hdsivideo_handle.Mode = DSI_VID_MODE_BURST; /* Mode Video burst ie : one LgP per line */ hdsivideo_handle.NullPacketSize = 0xFFF; hdsivideo_handle.NumberOfChunks = 0; - hdsivideo_handle.PacketSize = HACT; /* Value depending on display orientation choice portrait/landscape */ + hdsivideo_handle.PacketSize = HACT; /* Value depending on display orientation choice portrait/landscape */ hdsivideo_handle.HorizontalSyncActive = (HSA * laneByteClk_kHz) / LcdClock; hdsivideo_handle.HorizontalBackPorch = (HBP * laneByteClk_kHz) / LcdClock; hdsivideo_handle.HorizontalLine = ((HACT + HSA + HBP + HFP) * laneByteClk_kHz) / LcdClock; /* Value depending on display orientation choice portrait/landscape */ @@ -164,10 +182,10 @@ static GFXINLINE void init_board(GDisplay *g) { hdsivideo_handle.VerticalBackPorch = VBP; hdsivideo_handle.VerticalFrontPorch = VFP; hdsivideo_handle.VerticalActive = VACT; /* Value depending on display orientation choice portrait/landscape */ - + /* Enable or disable sending LP command while streaming is active in video mode */ hdsivideo_handle.LPCommandEnable = DSI_LP_COMMAND_ENABLE; /* Enable sending commands in mode LP (Low Power) */ - + /* Largest packet size possible to transmit in LP mode in VSA, VBP, VFP regions */ /* Only useful when sending LP packets is allowed while streaming is active in video mode */ hdsivideo_handle.LPLargestPacketSize = 16; @@ -184,7 +202,7 @@ static GFXINLINE void init_board(GDisplay *g) { hdsivideo_handle.LPVerticalFrontPorchEnable = DSI_LP_VFP_ENABLE; /* Allow sending LP commands during VFP period */ hdsivideo_handle.LPVerticalBackPorchEnable = DSI_LP_VBP_ENABLE; /* Allow sending LP commands during VBP period */ hdsivideo_handle.LPVerticalSyncActiveEnable = DSI_LP_VSYNC_ENABLE; /* Allow sending LP commands during VSync = VSA period */ - + /* Configure DSI Video mode timings with settings set above */ HAL_DSI_ConfigVideoMode(&(hdsi_eval), &(hdsivideo_handle)); @@ -197,7 +215,7 @@ static GFXINLINE void init_board(GDisplay *g) { PhyTimings.StopWaitTime = 10; HAL_DSI_ConfigPhyTimer(&hdsi_eval, &PhyTimings); - /*************************End DSI Initialization*******************************/ + /*************************End DSI Initialization*******************************/ /************************LTDC Initialization***********************************/ @@ -241,32 +259,28 @@ static GFXINLINE void init_board(GDisplay *g) { /* Initialize the SDRAM */ BSP_SDRAM_Init(); #endif /* DATA_IN_ExtSDRAM */ + } static GFXINLINE void post_init_board(GDisplay* g) { (void)g; - + + if (g->controllerdisplay) + return; + /* Initialize the font */ BSP_LCD_SetFont(&LCD_DEFAULT_FONT); - + /************************End LTDC Initialization*******************************/ - - - /***********************OTM8009A Initialization********************************/ - + + + /***********************OTM8009A Initialization********************************/ + /* Initialize the OTM8009A LCD Display IC Driver (KoD LCD IC Driver) * depending on configuration set in 'hdsivideo_handle'. */ OTM8009A_Init(OTM8009A_FORMAT_RGB888, OTM8009A_ORIENTATION_LANDSCAPE); - - /***********************End OTM8009A Initialization****************************/ - - // ------------------------------------------------------------------------ - - //BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER_BACKGROUND, LCD_FB_START_ADDRESS); - //BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER_BACKGROUND); - //BSP_LCD_SetLayerVisible(LTDC_ACTIVE_LAYER_FOREGROUND, DISABLE); } static GFXINLINE void set_backlight(GDisplay* g, uint8_t percent) |