board: stm32f469-disco: add support to display

Add support to Orise Tech OTM8009A display on stm32f469-disco board.

It was necessary to retrieve the framebuffer address from the device tree
because the address returned by the video-uclass driver pointed to a memory
area that was not usable.

Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
This commit is contained in:
Dario Binacchi
2023-12-11 23:05:55 +01:00
committed by Patrice Chotard
parent 88c938f874
commit 47256b040c
2 changed files with 44 additions and 0 deletions

View File

@@ -21,6 +21,7 @@ CONFIG_CMD_GPT=y
# CONFIG_RANDOM_UUID is not set # CONFIG_RANDOM_UUID is not set
CONFIG_CMD_MMC=y CONFIG_CMD_MMC=y
# CONFIG_CMD_SETEXPR is not set # CONFIG_CMD_SETEXPR is not set
CONFIG_CMD_BMP=y
CONFIG_CMD_CACHE=y CONFIG_CMD_CACHE=y
CONFIG_CMD_TIMER=y CONFIG_CMD_TIMER=y
# CONFIG_ISO_PARTITION is not set # CONFIG_ISO_PARTITION is not set
@@ -40,3 +41,15 @@ CONFIG_SPI_FLASH_STMICRO=y
CONFIG_SPI=y CONFIG_SPI=y
CONFIG_DM_SPI=y CONFIG_DM_SPI=y
CONFIG_STM32_QSPI=y CONFIG_STM32_QSPI=y
CONFIG_VIDEO=y
CONFIG_BACKLIGHT_GPIO=y
CONFIG_VIDEO_LCD_ORISETECH_OTM8009A=y
CONFIG_VIDEO_STM32=y
CONFIG_VIDEO_STM32_DSI=y
CONFIG_VIDEO_STM32_MAX_XRES=480
CONFIG_VIDEO_STM32_MAX_YRES=800
CONFIG_BMP_16BPP=y
CONFIG_BMP_24BPP=y
CONFIG_BMP_32BPP=y
CONFIG_DM_REGULATOR=y
CONFIG_DM_REGULATOR_FIXED=y

View File

@@ -495,6 +495,33 @@ static void stm32_ltdc_set_layer1(struct stm32_ltdc_priv *priv, ulong fb_addr)
setbits_le32(priv->regs + LTDC_L1CR, LXCR_LEN); setbits_le32(priv->regs + LTDC_L1CR, LXCR_LEN);
} }
#if IS_ENABLED(CONFIG_TARGET_STM32F469_DISCOVERY)
static int stm32_ltdc_alloc_fb(struct udevice *dev)
{
u32 sdram_size = gd->ram_size;
struct video_uc_plat *uc_plat = dev_get_uclass_plat(dev);
phys_addr_t cpu;
dma_addr_t bus;
u64 dma_size;
int ret;
ret = dev_get_dma_range(dev, &cpu, &bus, &dma_size);
if (ret) {
dev_err(dev, "failed to get dma address\n");
return ret;
}
uc_plat->base = bus + sdram_size - ALIGN(uc_plat->size, uc_plat->align);
return 0;
}
#else
static inline int stm32_ltdc_alloc_fb(struct udevice *dev)
{
/* Delegate framebuffer allocation to video-uclass */
return 0;
}
#endif
static int stm32_ltdc_probe(struct udevice *dev) static int stm32_ltdc_probe(struct udevice *dev)
{ {
struct video_uc_plat *uc_plat = dev_get_uclass_plat(dev); struct video_uc_plat *uc_plat = dev_get_uclass_plat(dev);
@@ -605,6 +632,10 @@ static int stm32_ltdc_probe(struct udevice *dev)
priv->crop_h = timings.vactive.typ; priv->crop_h = timings.vactive.typ;
priv->alpha = 0xFF; priv->alpha = 0xFF;
ret = stm32_ltdc_alloc_fb(dev);
if (ret)
return ret;
dev_dbg(dev, "%dx%d %dbpp frame buffer at 0x%lx\n", dev_dbg(dev, "%dx%d %dbpp frame buffer at 0x%lx\n",
timings.hactive.typ, timings.vactive.typ, timings.hactive.typ, timings.vactive.typ,
VNBITS(priv->l2bpp), uc_plat->base); VNBITS(priv->l2bpp), uc_plat->base);