.. | ||
board_STM32LTDC_template.h | ||
driver.mk | ||
gdisp_lld_config.h | ||
gdisp_lld_STM32LTDC.c | ||
readme.md | ||
stm32_dma2d.h | ||
stm32_ltdc.h |
Usage
To use this driver:
-
Add in your
gfxconf.h
: a)#define GFX_USE_GDISP GFXON
-
To your makefile add the following lines:
include $(GFXLIB)/gfx.mk
include $(GFXLIB)/drivers/gdisp/STM32LTDC/driver.mk
- Add a
board_STM32LTDC.h
to you project directory (or board directory) based on one of the templates.
Limitations
Currently, both gOrientationPortrait
and gOrientationLandscape
are not supported by this driver.
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
toGFXON
ingfxconf.h
. - set
GDISP_TOTAL_DISPLAYS
to2
ingfxconf.h
.
The 2nd layer is exposed as a separate display. Use gdispGetDisplay()
to retrieve the individual layers.
For more information, see:
- https://wiki.ugfx.io/index.php/Multiple_displays#Example_-_Same_controller
- https://wiki.ugfx.io/index.php/Multiple_displays#Access_the_displays
Double buffering
To use double buffering:
- set
STM32LTDC_USE_DOUBLEBUFFERING
toGFXON
ingfxconf.h
. - set
GDISP_TOTAL_DISPLAYS
to2
ingfxconf.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;
}