[RFC PATCH 0/5] Support display on stm32f469-disco board

The series adds support for the Orise Tech OTM8009A display on the stm32f469-disco board. Substantial differences in the drivers for clock management, LTDC and DSI compared to Linux, made it necessary to modify the device tree. These changes were made in stm32f469-disco-uboot.dtsi to avoid altering the Linux device tree. It is therefore desirable, as soon as possible, to add these drivers the functionalities so that they do not require device tree properties that deviate from those present in the Linux version.
Dario Binacchi (5): ARM: dts: stm32f469-disco: sync with Linux 6.5 ARM: dts: stm32: make the LTDC clock usable by the clock driver ARM: dts: stm32: make the DSI clock usable by the clock driver ARM: dts: stm32: support display on stm32f469-disco board board: stm32f469-disco: add splash screen with stmicroelectronics logo
arch/arm/dts/stm32f469-disco-u-boot.dtsi | 13 ++++++++ arch/arm/dts/stm32f469-disco.dts | 4 +-- configs/stm32f469-discovery_defconfig | 16 ++++++++++ drivers/video/stm32/stm32_ltdc.c | 37 ++++++++++++++++++++++- include/configs/stm32f469-discovery.h | 2 ++ tools/logos/stm32f469-discovery.bmp | Bin 0 -> 18532 bytes 6 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 tools/logos/stm32f469-discovery.bmp

Sync the devicetree with linux 6.5 for stm32f746-disco board.
Signed-off-by: Dario Binacchi dario.binacchi@amarulasolutions.com ---
arch/arm/dts/stm32f469-disco.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/arm/dts/stm32f469-disco.dts b/arch/arm/dts/stm32f469-disco.dts index 6e0ffc1903be..c9acabf0f530 100644 --- a/arch/arm/dts/stm32f469-disco.dts +++ b/arch/arm/dts/stm32f469-disco.dts @@ -119,7 +119,7 @@ }; };
- panel-dsi@0 { + panel@0 { compatible = "orisetech,otm8009a"; reg = <0>; /* dsi virtual channel (0..3) */ reset-gpios = <&gpioh 7 GPIO_ACTIVE_LOW>; @@ -138,7 +138,7 @@ status = "okay";
port { - ltdc_out_dsi: endpoint@0 { + ltdc_out_dsi: endpoint { remote-endpoint = <&dsi_in>; }; };

On 9/3/23 22:56, Dario Binacchi wrote:
Sync the devicetree with linux 6.5 for stm32f746-disco board.
Signed-off-by: Dario Binacchi dario.binacchi@amarulasolutions.com
arch/arm/dts/stm32f469-disco.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/arm/dts/stm32f469-disco.dts b/arch/arm/dts/stm32f469-disco.dts index 6e0ffc1903be..c9acabf0f530 100644 --- a/arch/arm/dts/stm32f469-disco.dts +++ b/arch/arm/dts/stm32f469-disco.dts @@ -119,7 +119,7 @@ }; };
- panel-dsi@0 {
- panel@0 { compatible = "orisetech,otm8009a"; reg = <0>; /* dsi virtual channel (0..3) */ reset-gpios = <&gpioh 7 GPIO_ACTIVE_LOW>;
@@ -138,7 +138,7 @@ status = "okay";
port {
ltdc_out_dsi: endpoint@0 {
}; };ltdc_out_dsi: endpoint { remote-endpoint = <&dsi_in>;
Reviewed-by: Patrice Chotard patrice.chotard@foss.st.com
Thanks Patrice

As described in [1], the "clocks" property contains "a phandle to the clock device node, an index selecting between gated clocks (0) and other clocks (1), and an index specifying the clock to use." The current version of the clock driver, unlike the kernel, is currently able to properly handle nodes with "clocks" properties with an index set to 0.
This patch is preparatory for future developments that require the use of the LTDC clock.
[1] Documentation/devicetree/bindings/clock/st,stm32-rcc.txt Signed-off-by: Dario Binacchi dario.binacchi@amarulasolutions.com ---
arch/arm/dts/stm32f469-disco-u-boot.dtsi | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/arch/arm/dts/stm32f469-disco-u-boot.dtsi b/arch/arm/dts/stm32f469-disco-u-boot.dtsi index c07e2022e4a8..dcc70369cd0d 100644 --- a/arch/arm/dts/stm32f469-disco-u-boot.dtsi +++ b/arch/arm/dts/stm32f469-disco-u-boot.dtsi @@ -134,6 +134,10 @@ bootph-all; };
+<dc { + clocks = <&rcc 0 STM32F4_APB2_CLOCK(LTDC)>; +}; + &pinctrl { bootph-all;

On 9/3/23 22:57, Dario Binacchi wrote:
As described in [1], the "clocks" property contains "a phandle to the clock device node, an index selecting between gated clocks (0) and other clocks (1), and an index specifying the clock to use." The current version of the clock driver, unlike the kernel, is currently able to properly handle nodes with "clocks" properties with an index set to 0.
This patch is preparatory for future developments that require the use of the LTDC clock.
[1] Documentation/devicetree/bindings/clock/st,stm32-rcc.txt Signed-off-by: Dario Binacchi dario.binacchi@amarulasolutions.com
arch/arm/dts/stm32f469-disco-u-boot.dtsi | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/arch/arm/dts/stm32f469-disco-u-boot.dtsi b/arch/arm/dts/stm32f469-disco-u-boot.dtsi index c07e2022e4a8..dcc70369cd0d 100644 --- a/arch/arm/dts/stm32f469-disco-u-boot.dtsi +++ b/arch/arm/dts/stm32f469-disco-u-boot.dtsi @@ -134,6 +134,10 @@ bootph-all; };
+<dc {
- clocks = <&rcc 0 STM32F4_APB2_CLOCK(LTDC)>;
+};
&pinctrl { bootph-all;
Reviewed-by: Patrice Chotard patrice.chotard@foss.st.com
Thanks Patrice

As described in [1], the "clocks" property contains "a phandle to the clock device node, an index selecting between gated clocks (0) and other clocks (1), and an index specifying the clock to use." The current version of the clock driver, unlike the kernel, is currently able to properly handle nodes with "clocks" properties with an index set to 0.
This patch is preparatory for future developments that require the use of the DSI clock.
[1] Documentation/devicetree/bindings/clock/st,stm32-rcc.txt Signed-off-by: Dario Binacchi dario.binacchi@amarulasolutions.com ---
arch/arm/dts/stm32f469-disco-u-boot.dtsi | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/arch/arm/dts/stm32f469-disco-u-boot.dtsi b/arch/arm/dts/stm32f469-disco-u-boot.dtsi index dcc70369cd0d..8e781c5a7b23 100644 --- a/arch/arm/dts/stm32f469-disco-u-boot.dtsi +++ b/arch/arm/dts/stm32f469-disco-u-boot.dtsi @@ -90,6 +90,11 @@ bootph-all; };
+&dsi { + clocks = <&rcc 0 STM32F4_APB2_CLOCK(DSI)>, + <&clk_hse>; +}; + &gpioa { bootph-all; };

On 9/3/23 22:57, Dario Binacchi wrote:
As described in [1], the "clocks" property contains "a phandle to the clock device node, an index selecting between gated clocks (0) and other clocks (1), and an index specifying the clock to use." The current version of the clock driver, unlike the kernel, is currently able to properly handle nodes with "clocks" properties with an index set to 0.
This patch is preparatory for future developments that require the use of the DSI clock.
[1] Documentation/devicetree/bindings/clock/st,stm32-rcc.txt Signed-off-by: Dario Binacchi dario.binacchi@amarulasolutions.com
arch/arm/dts/stm32f469-disco-u-boot.dtsi | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/arch/arm/dts/stm32f469-disco-u-boot.dtsi b/arch/arm/dts/stm32f469-disco-u-boot.dtsi index dcc70369cd0d..8e781c5a7b23 100644 --- a/arch/arm/dts/stm32f469-disco-u-boot.dtsi +++ b/arch/arm/dts/stm32f469-disco-u-boot.dtsi @@ -90,6 +90,11 @@ bootph-all; };
+&dsi {
- clocks = <&rcc 0 STM32F4_APB2_CLOCK(DSI)>,
<&clk_hse>;
+};
&gpioa { bootph-all; };
Reviewed-by: Patrice Chotard patrice.chotard@foss.st.com
Thanks Patrice

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.
Furthermore, unlike Linux, the DSI driver requires the LTDC clock to be properly probed. Hence, the changes made to the DSI node in stm32f469-disco-u-boot.dtsi.
Signed-off-by: Dario Binacchi dario.binacchi@amarulasolutions.com ---
arch/arm/dts/stm32f469-disco-u-boot.dtsi | 4 +++ configs/stm32f469-discovery_defconfig | 13 +++++++++ drivers/video/stm32/stm32_ltdc.c | 37 +++++++++++++++++++++++- 3 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/arch/arm/dts/stm32f469-disco-u-boot.dtsi b/arch/arm/dts/stm32f469-disco-u-boot.dtsi index 8e781c5a7b23..47ba9fa4a783 100644 --- a/arch/arm/dts/stm32f469-disco-u-boot.dtsi +++ b/arch/arm/dts/stm32f469-disco-u-boot.dtsi @@ -92,7 +92,9 @@
&dsi { clocks = <&rcc 0 STM32F4_APB2_CLOCK(DSI)>, + <&rcc 0 STM32F4_APB2_CLOCK(LTDC)>, <&clk_hse>; + clock-names = "pclk", "px_clk", "ref"; };
&gpioa { @@ -140,6 +142,8 @@ };
<dc { + bootph-all; + clocks = <&rcc 0 STM32F4_APB2_CLOCK(LTDC)>; };
diff --git a/configs/stm32f469-discovery_defconfig b/configs/stm32f469-discovery_defconfig index 35d18d58be6f..9796b8f2d9a5 100644 --- a/configs/stm32f469-discovery_defconfig +++ b/configs/stm32f469-discovery_defconfig @@ -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 diff --git a/drivers/video/stm32/stm32_ltdc.c b/drivers/video/stm32/stm32_ltdc.c index f48badc517a8..428b0addc43c 100644 --- a/drivers/video/stm32/stm32_ltdc.c +++ b/drivers/video/stm32/stm32_ltdc.c @@ -494,6 +494,34 @@ 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_get_fb_addr(struct udevice *dev, ulong *base, uint size, + uint align) +{ + 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; + } + + *base = bus + 0x1000000 - ALIGN(size, align); + return 0; +} +#else +static int stm32_ltdc_get_fb_addr(struct udevice *dev, ulong *base, uint size, + uint align) +{ + /* Delegate framebuffer allocation to video-uclass */ + *base = 0; + return 0; +} +#endif + static int stm32_ltdc_probe(struct udevice *dev) { struct video_uc_plat *uc_plat = dev_get_uclass_plat(dev); @@ -504,7 +532,7 @@ static int stm32_ltdc_probe(struct udevice *dev) struct display_timing timings; struct clk pclk; struct reset_ctl rst; - ulong rate; + ulong rate, fb_base; int ret;
priv->regs = dev_read_addr_ptr(dev); @@ -604,6 +632,13 @@ static int stm32_ltdc_probe(struct udevice *dev) priv->crop_h = timings.vactive.typ; priv->alpha = 0xFF;
+ ret = stm32_ltdc_get_fb_addr(dev, &fb_base, uc_plat->size, + uc_plat->align); + if (ret) + return ret; + + uc_plat->base = fb_base; + dev_dbg(dev, "%dx%d %dbpp frame buffer at 0x%lx\n", timings.hactive.typ, timings.vactive.typ, VNBITS(priv->l2bpp), uc_plat->base);

On 9/3/23 22:57, Dario Binacchi wrote:
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.
Furthermore, unlike Linux, the DSI driver requires the LTDC clock to be properly probed. Hence, the changes made to the DSI node in stm32f469-disco-u-boot.dtsi.
Signed-off-by: Dario Binacchi dario.binacchi@amarulasolutions.com
arch/arm/dts/stm32f469-disco-u-boot.dtsi | 4 +++ configs/stm32f469-discovery_defconfig | 13 +++++++++ drivers/video/stm32/stm32_ltdc.c | 37 +++++++++++++++++++++++- 3 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/arch/arm/dts/stm32f469-disco-u-boot.dtsi b/arch/arm/dts/stm32f469-disco-u-boot.dtsi index 8e781c5a7b23..47ba9fa4a783 100644 --- a/arch/arm/dts/stm32f469-disco-u-boot.dtsi +++ b/arch/arm/dts/stm32f469-disco-u-boot.dtsi @@ -92,7 +92,9 @@
&dsi { clocks = <&rcc 0 STM32F4_APB2_CLOCK(DSI)>,
<&clk_hse>;<&rcc 0 STM32F4_APB2_CLOCK(LTDC)>,
- clock-names = "pclk", "px_clk", "ref";
};
&gpioa { @@ -140,6 +142,8 @@ };
<dc {
- bootph-all;
- clocks = <&rcc 0 STM32F4_APB2_CLOCK(LTDC)>;
};
diff --git a/configs/stm32f469-discovery_defconfig b/configs/stm32f469-discovery_defconfig index 35d18d58be6f..9796b8f2d9a5 100644 --- a/configs/stm32f469-discovery_defconfig +++ b/configs/stm32f469-discovery_defconfig @@ -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 diff --git a/drivers/video/stm32/stm32_ltdc.c b/drivers/video/stm32/stm32_ltdc.c index f48badc517a8..428b0addc43c 100644 --- a/drivers/video/stm32/stm32_ltdc.c +++ b/drivers/video/stm32/stm32_ltdc.c @@ -494,6 +494,34 @@ 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)
We want to avoid this kind of #define specific to a particular target
+static int stm32_ltdc_get_fb_addr(struct udevice *dev, ulong *base, uint size,
uint align)
+{
- 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;
- }
- *base = bus + 0x1000000 - ALIGN(size, align);
Why adding 0x1000000 ? avoid to insert const whithout any description and use a #define instead.
- return 0;
+} +#else +static int stm32_ltdc_get_fb_addr(struct udevice *dev, ulong *base, uint size,
uint align)
+{
- /* Delegate framebuffer allocation to video-uclass */
- *base = 0;
- return 0;
+} +#endif
static int stm32_ltdc_probe(struct udevice *dev) { struct video_uc_plat *uc_plat = dev_get_uclass_plat(dev); @@ -504,7 +532,7 @@ static int stm32_ltdc_probe(struct udevice *dev) struct display_timing timings; struct clk pclk; struct reset_ctl rst;
- ulong rate;
ulong rate, fb_base; int ret;
priv->regs = dev_read_addr_ptr(dev);
@@ -604,6 +632,13 @@ static int stm32_ltdc_probe(struct udevice *dev) priv->crop_h = timings.vactive.typ; priv->alpha = 0xFF;
- ret = stm32_ltdc_get_fb_addr(dev, &fb_base, uc_plat->size,
uc_plat->align);
- if (ret)
return ret;
- uc_plat->base = fb_base;
It breaks display on stm32f746-disco and also on stm32f769-disco.
Thanks Patrice
dev_dbg(dev, "%dx%d %dbpp frame buffer at 0x%lx\n", timings.hactive.typ, timings.vactive.typ, VNBITS(priv->l2bpp), uc_plat->base);

Hello Patrice,
On Wed, Sep 27, 2023 at 8:19 AM Patrice CHOTARD patrice.chotard@foss.st.com wrote:
On 9/3/23 22:57, Dario Binacchi wrote:
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.
Furthermore, unlike Linux, the DSI driver requires the LTDC clock to be properly probed. Hence, the changes made to the DSI node in stm32f469-disco-u-boot.dtsi.
Signed-off-by: Dario Binacchi dario.binacchi@amarulasolutions.com
arch/arm/dts/stm32f469-disco-u-boot.dtsi | 4 +++ configs/stm32f469-discovery_defconfig | 13 +++++++++ drivers/video/stm32/stm32_ltdc.c | 37 +++++++++++++++++++++++- 3 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/arch/arm/dts/stm32f469-disco-u-boot.dtsi b/arch/arm/dts/stm32f469-disco-u-boot.dtsi index 8e781c5a7b23..47ba9fa4a783 100644 --- a/arch/arm/dts/stm32f469-disco-u-boot.dtsi +++ b/arch/arm/dts/stm32f469-disco-u-boot.dtsi @@ -92,7 +92,9 @@
&dsi { clocks = <&rcc 0 STM32F4_APB2_CLOCK(DSI)>,
<&rcc 0 STM32F4_APB2_CLOCK(LTDC)>, <&clk_hse>;
clock-names = "pclk", "px_clk", "ref";
};
&gpioa { @@ -140,6 +142,8 @@ };
<dc {
bootph-all;
clocks = <&rcc 0 STM32F4_APB2_CLOCK(LTDC)>;
};
diff --git a/configs/stm32f469-discovery_defconfig b/configs/stm32f469-discovery_defconfig index 35d18d58be6f..9796b8f2d9a5 100644 --- a/configs/stm32f469-discovery_defconfig +++ b/configs/stm32f469-discovery_defconfig @@ -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 diff --git a/drivers/video/stm32/stm32_ltdc.c b/drivers/video/stm32/stm32_ltdc.c index f48badc517a8..428b0addc43c 100644 --- a/drivers/video/stm32/stm32_ltdc.c +++ b/drivers/video/stm32/stm32_ltdc.c @@ -494,6 +494,34 @@ 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)
We want to avoid this kind of #define specific to a particular target
If the framebuffer is allocated by the video-uclass module, it is mapped to the address 0xe00000, which does not appear to be a correct memory zone. Therefore, for the stm32f469-disco board, a different method for framebuffer allocation is required, and this seemed to me the most suitable way. I have submitted the series as an RFC, and this is one of the points for which I did it. So, I am open to considering any suggestions you may have.
Output in case of applied patch: stm32_display display-controller@40016800: 480x800 16bpp frame buffer at 0xc0e00000
Otherwise: stm32_display display-controller@40016800: 480x800 16bpp frame buffer at 0xe00000
+static int stm32_ltdc_get_fb_addr(struct udevice *dev, ulong *base, uint size,
uint align)
+{
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;
}
*base = bus + 0x1000000 - ALIGN(size, align);
Why adding 0x1000000 ? avoid to insert const whithout any description and use a #define instead.
Right, I will add it in version 2.
return 0;
+} +#else +static int stm32_ltdc_get_fb_addr(struct udevice *dev, ulong *base, uint size,
uint align)
+{
/* Delegate framebuffer allocation to video-uclass */
*base = 0;
return 0;
+} +#endif
static int stm32_ltdc_probe(struct udevice *dev) { struct video_uc_plat *uc_plat = dev_get_uclass_plat(dev); @@ -504,7 +532,7 @@ static int stm32_ltdc_probe(struct udevice *dev) struct display_timing timings; struct clk pclk; struct reset_ctl rst;
ulong rate;
ulong rate, fb_base; int ret; priv->regs = dev_read_addr_ptr(dev);
@@ -604,6 +632,13 @@ static int stm32_ltdc_probe(struct udevice *dev) priv->crop_h = timings.vactive.typ; priv->alpha = 0xFF;
ret = stm32_ltdc_get_fb_addr(dev, &fb_base, uc_plat->size,
uc_plat->align);
if (ret)
return ret;
uc_plat->base = fb_base;
It breaks display on stm32f746-disco and also on stm32f769-disco.
You are right, I will fix it in version 2.
Thanks and regards,
Dario
Thanks Patrice
dev_dbg(dev, "%dx%d %dbpp frame buffer at 0x%lx\n", timings.hactive.typ, timings.vactive.typ, VNBITS(priv->l2bpp), uc_plat->base);

Display the STMicroelectronics logo with features VIDEO_LOGO and SPLASH_SCREEN on stm32f469-disco board.
Signed-off-by: Dario Binacchi dario.binacchi@amarulasolutions.com
---
configs/stm32f469-discovery_defconfig | 3 +++ include/configs/stm32f469-discovery.h | 2 ++ tools/logos/stm32f469-discovery.bmp | Bin 0 -> 18532 bytes 3 files changed, 5 insertions(+) create mode 100644 tools/logos/stm32f469-discovery.bmp
diff --git a/configs/stm32f469-discovery_defconfig b/configs/stm32f469-discovery_defconfig index 9796b8f2d9a5..16b79371fde9 100644 --- a/configs/stm32f469-discovery_defconfig +++ b/configs/stm32f469-discovery_defconfig @@ -42,12 +42,15 @@ CONFIG_SPI=y CONFIG_DM_SPI=y CONFIG_STM32_QSPI=y CONFIG_VIDEO=y +CONFIG_VIDEO_LOGO=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_SPLASH_SCREEN=y +CONFIG_SPLASH_SCREEN_ALIGN=y CONFIG_BMP_16BPP=y CONFIG_BMP_24BPP=y CONFIG_BMP_32BPP=y diff --git a/include/configs/stm32f469-discovery.h b/include/configs/stm32f469-discovery.h index 62a7e9af0c56..75bb9cd8d06f 100644 --- a/include/configs/stm32f469-discovery.h +++ b/include/configs/stm32f469-discovery.h @@ -31,6 +31,8 @@ "scriptaddr=0x00418000\0" \ "pxefile_addr_r=0x00428000\0" \ "ramdisk_addr_r=0x00438000\0" \ + "splashimage=0x00448000\0" \ + "splashpos=m,m\0" \ BOOTENV
#endif /* __CONFIG_H */ diff --git a/tools/logos/stm32f469-discovery.bmp b/tools/logos/stm32f469-discovery.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ecc8d984218fb13fddf0ba9cf68f2cfad829e289 GIT binary patch literal 18532 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	#AtQW=ccPV5oMCL$y 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�`UWQclH{)zlv1RvCsKs0E5%l@Op$+uW9>-8#$ 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
literal 0 HcmV?d00001
participants (2)
-
Dario Binacchi
-
Patrice CHOTARD