Browse Source

STM32LTDC: Rename user config options for consistency & add docs

develop
Joel Bodenmann 3 months ago
parent
commit
7f78be1183
  1. 6
      boards/base/STM32F429i-Discovery/chibios/board_STM32LTDC.h
  2. 6
      boards/base/STM32F439i-Eval/CubeHal/board_STM32LTDC.h
  3. 4
      boards/base/STM32F469i-Discovery/CubeHAL/board_STM32LTDC.h
  4. 8
      boards/base/STM32F746-Discovery/board_STM32LTDC.h
  5. 8
      drivers/gdisp/STM32LTDC/board_STM32LTDC_template.h
  6. 51
      drivers/gdisp/STM32LTDC/gdisp_lld_STM32LTDC.c
  7. 7
      drivers/gdisp/STM32LTDC/gdisp_lld_config.h
  8. 14
      drivers/gdisp/STM32LTDC/readme.md

6
boards/base/STM32F429i-Discovery/chibios/board_STM32LTDC.h

@ -23,10 +23,6 @@ static const SPIConfig spi_cfg = {
((1 << 3) & SPI_CR1_BR) | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR
};
#define LTDC_USE_DMA2D GFXON
#define LTDC_USE_2ND_LAYER GFXON
#define LTDC_DMA_CACHE_FLUSH GFXOFF // This will be turned on automatically on certain systems/platforms
static const ltdcConfig driverCfg = {
240, 320,
10, 2,
@ -49,7 +45,7 @@ static const ltdcConfig driverCfg = {
0xFF, // alpha
LTDC_LEF_ENABLE // flags
},
#if LTDC_USE_2ND_LAYER
#if STM32LTDC_USE_LAYER2
{ // Foreground layer config (if turned on)
(LLDCOLOR_TYPE *)(SDRAM_BANK_ADDR+(240 * 320 * LTDC_PIXELBYTES)), // Frame buffer address
240, 320, // width, height

6
boards/base/STM32F439i-Eval/CubeHal/board_STM32LTDC.h

@ -19,10 +19,6 @@
#include "stm32f4xx_hal.h"
#include "stm324x9i_eval_sdram.h"
#define LTDC_USE_DMA2D GFXON
#define LTDC_USE_2ND_LAYER GFXON
#define LTDC_DMA_CACHE_FLUSH GFXOFF // This will be turned on automatically on certain systems/platforms
// Panel parameters
// This panel is a AMPIRE640480 panel.
@ -50,7 +46,7 @@ static const ltdcConfig driverCfg = {
LTDC_LEF_ENABLE // Layer configuration flags
},
#if LTDC_USE_2ND_LAYER
#if STM32LTDC_USE_LAYER2
{ // Foreground layer config (if turned on)
(LLDCOLOR_TYPE *)(SDRAM_DEVICE_ADDR+(640 * 480 * LTDC_PIXELBYTES)), // Frame buffer address
640, 480, // Width, Height (pixels)

4
boards/base/STM32F469i-Discovery/CubeHAL/board_STM32LTDC.h

@ -8,10 +8,6 @@
#ifndef _GDISP_LLD_BOARD_H
#define _GDISP_LLD_BOARD_H
#define LTDC_USE_DMA2D GFXON
#define LTDC_USE_2ND_LAYER GFXON
#define LTDC_DMA_CACHE_FLUSH GFXOFF // This will be turned on automatically on certain systems/platforms
/* Avoid naming collisions with CubeHAL. */
#if GFX_COMPAT_V2 && GFX_COMPAT_OLDCOLORS
#undef Red

8
boards/base/STM32F746-Discovery/board_STM32LTDC.h

@ -36,10 +36,6 @@
#define AFRH AFR[1]
#endif
#define LTDC_USE_DMA2D GFXON
#define LTDC_USE_2ND_LAYER GFXON
#define LTDC_DMA_CACHE_FLUSH GFXOFF // This will be turned on automatically on certain systems/platforms
static const ltdcConfig driverCfg = {
480, 272, // Width, Height (pixels)
41, 10, // Horizontal, Vertical sync (pixels)
@ -64,7 +60,7 @@ static const ltdcConfig driverCfg = {
LTDC_LEF_ENABLE // Layer configuration flags
},
#if LTDC_USE_2ND_LAYER
#if STM32LTDC_USE_LAYER2
{ // Foreground layer config (if turned on)
(LLDCOLOR_TYPE *)(SDRAM_DEVICE_ADDR+(480 * 272 * LTDC_PIXELBYTES)), // Frame buffer address
480, 272, // Width, Height (pixels)
@ -408,7 +404,7 @@ static GFXINLINE void init_ltdc_clock(void)
RCC->APB2ENR |= RCC_APB2ENR_LTDCEN;
}
#if LTDC_USE_DMA2D
#if STM32LTDC_USE_DMA2D
static GFXINLINE void init_dma2d_clock(void)
{
// Enable DMA2D clock

8
drivers/gdisp/STM32LTDC/board_STM32LTDC_template.h

@ -8,10 +8,6 @@
#ifndef _GDISP_LLD_BOARD_H
#define _GDISP_LLD_BOARD_H
#define LTDC_USE_DMA2D GFXON
#define LTDC_USE_2ND_LAYER GFXOFF
#define LTDC_DMA_CACHE_FLUSH GFXOFF // This will be turned on automatically on certain systems/platforms
static const ltdcConfig driverCfg = {
480, 272, // Width, Height (pixels)
41, 10, // Horizontal, Vertical sync (pixels)
@ -36,7 +32,7 @@ static const ltdcConfig driverCfg = {
LTDC_LEF_ENABLE // Layer configuration flags
},
#if LTDC_USE_2ND_LAYER
#if STM32LTDC_USE_LAYER2
{ // Foreground layer config (if turned on)
(LLDCOLOR_TYPE *)(SDRAM_DEVICE_ADDR+(480 * 272 * LTDC_PIXELBYTES)), // Frame buffer address
480, 272, // Width, Height (pixels)
@ -62,7 +58,7 @@ static GFXINLINE void init_ltdc_clock(void)
// Setup LTDC clock and enable the peripheral
}
#if LTDC_USE_DMA2D
#if STM32LTDC_USE_DMA2D
static GFXINLINE void init_dma2d_clock(void)
{
// Setup DMA2D clock and enable the peripheral

51
drivers/gdisp/STM32LTDC/gdisp_lld_STM32LTDC.c

@ -13,7 +13,7 @@
#include "gdisp_lld_config.h"
#include "../../../src/gdisp/gdisp_driver.h"
#include "stm32_ltdc.h"
#if LTDC_USE_DMA2D
#if STM32LTDC_USE_DMA2D
#include "stm32_dma2d.h"
#endif
@ -27,6 +27,27 @@
#undef GDISP_SCREEN_HEIGHT
#endif
#ifndef STM32LTDC_DMA_CACHE_FLUSH
#define STM32LTDC_DMA_CACHE_FLUSH GFXOFF
#endif
#ifndef STM32LTDC_USE_DMA2D
#define STM32LTDC_USE_DMA2D GFXOFF
#endif
#ifndef STM32LTDC_USE_LAYER2
#define STM32LTDC_USE_LAYER2 GFXOFF
#endif
#ifndef STM32LTDC_USE_RGB565
#define STM32LTDC_USE_RGB565 GFXOFF
#endif
// Force DMA cache flushing on certain platforms/systems.
#if STM32LTDC_USE_DMA2D
#if defined(STM32F7) || defined(STM32H7) || defined(STM32F746xx)
#undef STM32LTDC_DMA_CACHE_FLUSH
#define STM32LTDC_DMA_CACHE_FLUSH GFXON
#endif
#endif
typedef struct ltdcLayerConfig {
// Frame
LLDCOLOR_TYPE* frame; // Frame buffer address
@ -75,20 +96,6 @@ typedef struct ltdcConfig {
#include "board_STM32LTDC.h"
#ifndef LTDC_USE_DMA2D
#define LTDC_USE_DMA2D GFXOFF
#endif
#ifndef LTDC_DMA_CACHE_FLUSH
#define LTDC_DMA_CACHE_FLUSH GFXOFF
#endif
#if LTDC_USE_DMA2D
#if defined(STM32F7) || defined(STM32H7) || defined(STM32F746xx)
#undef LTDC_DMA_CACHE_FLUSH
#define LTDC_DMA_CACHE_FLUSH GFXON
#endif
#endif
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
@ -226,7 +233,7 @@ LLDSPEC gBool gdisp_lld_init(GDisplay* g) {
_ltdc_init();
// Initialise DMA2D
#if LTDC_USE_DMA2D
#if STM32LTDC_USE_DMA2D
dma2d_init();
#endif
@ -297,7 +304,7 @@ LLDSPEC void gdisp_lld_draw_pixel(GDisplay* g) {
pos = PIXIL_POS(g, g->p.x, g->p.y);
#endif
#if LTDC_USE_DMA2D
#if STM32LTDC_USE_DMA2D
while(DMA2D->CR & DMA2D_CR_START);
#endif
@ -335,7 +342,7 @@ LLDSPEC gColor gdisp_lld_get_pixel_color(GDisplay* g) {
pos = PIXIL_POS(g, g->p.x, g->p.y);
#endif
#if LTDC_USE_DMA2D
#if STM32LTDC_USE_DMA2D
while(DMA2D->CR & DMA2D_CR_START);
#endif
@ -393,8 +400,8 @@ LLDSPEC gColor gdisp_lld_get_pixel_color(GDisplay* g) {
}
#endif
#if LTDC_USE_DMA2D
#if LTDC_DMA_CACHE_FLUSH
#if STM32LTDC_USE_DMA2D
#if STM32LTDC_DMA_CACHE_FLUSH
#if defined(__CC_ARM)
#define __ugfxDSB() __dsb(0xF)
#else // GCC like
@ -459,7 +466,7 @@ LLDSPEC gColor gdisp_lld_get_pixel_color(GDisplay* g) {
shape = (g->p.cx << 16) | (g->p.cy);
#endif
#if LTDC_DMA_CACHE_FLUSH
#if STM32LTDC_DMA_CACHE_FLUSH
{
// This is slightly less than optimal as we flush the whole line in the source and destination image
// instead of just the cx portion but this saves us having to iterate over each line.
@ -524,7 +531,7 @@ LLDSPEC gColor gdisp_lld_get_pixel_color(GDisplay* g) {
srcstart = LTDC_PIXELBYTES * ((gU32)g->p.x2 * g->p.y1 * + g->p.x1) + (gU32)g->p.ptr;
dststart = (gU32)PIXEL_ADDR(g, PIXIL_POS(g, g->p.x, g->p.y));
#if LTDC_DMA_CACHE_FLUSH
#if STM32LTDC_DMA_CACHE_FLUSH
{
// This is slightly less than optimal as we flush the whole line in the source and destination image
// instead of just the cx portion but this saves us having to iterate over each line.

7
drivers/gdisp/STM32LTDC/gdisp_lld_config.h

@ -14,7 +14,6 @@
/* Driver hardware support. */
/*===========================================================================*/
#define LTDC_USE_DMA2D GFXON
#define GDISP_HARDWARE_DRAWPIXEL GFXON
#define GDISP_HARDWARE_PIXELREAD GFXON
#define GDISP_HARDWARE_CONTROL GFXON
@ -22,10 +21,10 @@
// Both these pixel formats are supported - pick one.
// RGB565 obviously is faster and uses less RAM but with lower color resolution than RGB888
#if defined(GDISP_LTDC_USE_RGB565) && GDISP_LTDC_USE_RGB565
#if defined(STM32LTDC_USE_RGB565) && STM32LTDC_USE_RGB565
#define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_RGB565
#if GDISP_TOTAL_DISPLAYS > 1
#error "LTDC: You must use RGB888 pixel format with LTDC when using dual layers as only RGB888 currently supports using alpha"
#error "GDISP - STM32LTDC: You must use RGB888 pixel format with LTDC when using dual layers as only RGB888 currently supports using alpha"
#endif
#else
#define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_RGB888
@ -36,7 +35,7 @@
/* Don't change stuff below this line. Please. */
/*===========================================================================*/
#if LTDC_USE_DMA2D
#if STM32LTDC_USE_DMA2D
// DMA2D supports accelerated fills
#define GDISP_HARDWARE_FILLS GFXON

14
drivers/gdisp/STM32LTDC/readme.md

@ -12,11 +12,19 @@ To use this driver:
3. 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` | `GFOFF` | 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. |
| `STM32LTDC_USE_RGB565` | `GFXOFF` | Whether to use RGB565 instead of RGB888. |
# 2nd layer
Two things need to happen in order to use the 2nd LTDC layer:
- Set `LTDC_USE_2ND_LAYER` to `GFXON` in the board file.
- Set `GDISP_TOTAL_DISPLAYS` to `2` in `gfxconf.h`.
To use the 2nd LTDC layer, set `STM32LTDC_USE_LAYER2` to `GFXON` in `gfxconf.h`.
The 2nd layer is exposed as a separate display. Use `gdispGetDisplay()` to retrieve the individual layers.

Loading…
Cancel
Save