]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
board: stm32f469-disco: add support to display
authorDario Binacchi <dario.binacchi@amarulasolutions.com>
Mon, 11 Dec 2023 22:05:55 +0000 (23:05 +0100)
committerPatrice Chotard <patrice.chotard@foss.st.com>
Fri, 15 Dec 2023 14:41:23 +0000 (15:41 +0100)
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>
configs/stm32f469-discovery_defconfig
drivers/video/stm32/stm32_ltdc.c

index 21c5498466cd0df29b16c26a4bd2847ed77830f6..85e795e83e7de68c805674876c84461c2c5978ee 100644 (file)
@@ -21,6 +21,7 @@ CONFIG_CMD_GPT=y
 # CONFIG_RANDOM_UUID is not set
 CONFIG_CMD_MMC=y
 # CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_BMP=y
 CONFIG_CMD_CACHE=y
 CONFIG_CMD_TIMER=y
 # CONFIG_ISO_PARTITION is not set
@@ -40,3 +41,15 @@ CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SPI=y
 CONFIG_DM_SPI=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
index 6fd90e33919dc9aa3c69571b7bddad2c927cad12..4f60ba8ebeeb49f72f14643c4a2c88daa3aeaee6 100644 (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);
 }
 
+#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)
 {
        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->alpha = 0xFF;
 
+       ret = stm32_ltdc_alloc_fb(dev);
+       if (ret)
+               return ret;
+
        dev_dbg(dev, "%dx%d %dbpp frame buffer at 0x%lx\n",
                timings.hactive.typ, timings.vactive.typ,
                VNBITS(priv->l2bpp), uc_plat->base);