ugfx/drivers/gdisp/STM32LTDC
Joel Bodenmann 888c7e8640 STM32LTDC: Fix bug in DMA2D blitting
Thanks to @nathanwiebe for reporting this:
https://community.ugfx.io/topic/3159-a-bug-in-the-stm32-ltdc-driver
2021-08-18 20:58:53 +02:00
..
board_STM32LTDC_template.h STM32LTDC: Support double buffering 2021-08-18 16:38:23 +02:00
driver.mk Renaming driver to STM32LTDC as this will be a generic one 2015-07-09 00:43:04 +02:00
gdisp_lld_STM32LTDC.c STM32LTDC: Fix bug in DMA2D blitting 2021-08-18 20:58:53 +02:00
gdisp_lld_config.h STM32LTDC: Improve pixel format detection if 2nd layer is used 2021-08-18 17:12:12 +02:00
readme.md STM32LTDC: Update readme.md 2021-08-18 16:46:04 +02:00
stm32_dma2d.h For all source files update integer types to the new gI8 etc type names 2018-11-03 10:51:23 +10:00
stm32_ltdc.h Update license header 2018-10-01 17:34:15 +02:00

readme.md

Usage

To use this driver:

  1. Add in your gfxconf.h: a) #define GFX_USE_GDISP GFXON

  2. To your makefile add the following lines:

	include $(GFXLIB)/gfx.mk
	include $(GFXLIB)/drivers/gdisp/STM32LTDC/driver.mk
  1. Add a board_STM32LTDC.h to you project directory (or board directory) based on one of the templates.

Configuration

Configuration options available in gfxconf.h:

Option Default Description
STM32LTDC_DMA_CACHE_FLUSH GFXOFF Whether to flush the DMA cache on DMA2D operations. This will be turned on automatically on certian platforms/systems.
STM32LTDC_USE_DMA2D GFXON Whether to use the DMA2D peripheral for hardware acceleration.
STM32LTDC_USE_LAYER2 GFXOFF Whether to use the 2nd LTDC layer. See the corresponding section below.
STM32LTDC_USE_DOUBLEBUFFERING GFXOFF Whether to use double buffering. See the corresponding section below.
STM32LTDC_USE_RGB565 GFXOFF Whether to use RGB565 instead of RGB888.

2nd layer

To use the 2nd LTDC layer:

  • set STM32LTDC_USE_LAYER2 to GFXON in gfxconf.h.
  • set GDISP_TOTAL_DISPLAYS to 2 in gfxconf.h.

The 2nd layer is exposed as a separate display. Use gdispGetDisplay() to retrieve the individual layers.

For more information, see:

Double buffering

To use double buffering:

  • set STM32LTDC_USE_DOUBLEBUFFERING to GFXON in gfxconf.h.
  • set GDISP_TOTAL_DISPLAYS to 2 in gfxconf.h.

When double buffering is enabled, the 2nd LTDC layer cannot be used. While this limitation is easy to remove from a software perspective, there is little benefit in doing so. Double buffering requires, as the name implies, twice the memory. If the 2nd layer would be used together with double buffering strategy, a total of four full framebuffers would be required. Years of real-world experience shows that there's practically never enough memory bandwidth available to do this.

To use double buffering in an application, retrieve the two buffers via gdispGetDisplay(). Whenever a buffer swap is necessary, use gdispGControl(g, STM32LTDC_CONTROL_SHOW_BUFFER, NULL); where g is the buffer to be shown.

Simple example:

#include "gfx.h"

static GDisplay* _display1;
static GDisplay* _display2;

// Requests a buffer swap on the driver level
static void _setActiveBuffer(GDisplay* g)
{
	gdispGControl(g, STM32LTDC_CONTROL_SHOW_BUFFER, NULL);
}

int main(void)
{
	// Initialize uGFX library
	gfxInit();
	
	// Get the two buffers
	_display1 = gdispGetDisplay(0);
	if (!_display1)
		gfxHalt("could not get display 1");
	_display2 = gdispGetDisplay(1);
	if (!_display2)
		gfxHalt("could not get display 2");

	// Render to each buffer
	gdispGClear(_display1, GFX_BLUE);
	gdispGClear(_display2, GFX_RED);

	// Switch between buffers
	while (gTrue) {
		gfxSleepMilliseconds(800);
		_setActiveBuffer(_display1);
		gfxSleepMilliseconds(800);
		_setActiveBuffer(_display2);
	}

	return 0;
}