MIPI DSI Display Stays Black on STM32H757

Hi,

I am working with a custom board using the STM32H757BIT and a Riverdi RVT70HSMNWC00 connected through MIPI DSI.
I followed the “lv_port_riverdi_70-stm32h7” example for the CubeMX setup and for the DSI display initialization.
The system runs from a 25 MHz external HSE, and I have tested the DSI clock using both the HSE and PLL2Q.
HAL version: V1.12.1.
The UI framework is LVGL v9.4.0.

My issue is that the display stays completely black. When LVGL triggers the flush callback, nothing appears on the screen.

The backlight PWM is working correctly: it runs at 48 kHz and currently uses a duty cycle above 90%, so the panel should be fully illuminated.

The screen content I want to show is extremely simple, just for testing:

    /*Change the active screen's background color*/
    lv_obj_set_style_bg_color(lv_screen_active(), lv_color_hex(0x003a57), LV_PART_MAIN);

    /*Create a white label, set its text and align it to the center*/
    lv_obj_t * label = lv_label_create(lv_screen_active());
    lv_label_set_text(label, "Hello world");
    lv_obj_set_style_text_color(lv_screen_active(), lv_color_hex(0xffffff), LV_PART_MAIN);
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);

I have the system configured with double buffering using external RAM, with the LVGL buffer in Direct mode.
The flush function is called only once. I have verified that the buffer currently used is the correct one, and debugging shows that the external RAM buffer is filled correctly with the expected image.

Flush CB

if (lv_display_flush_is_last(disp)) {
		SCB_CleanInvalidateDCache();
		// wait for VSYNC to avoid tearing
		while (!(LTDC->CDSR & LTDC_CDSR_VSYNCS));
		// swap framebuffers (NOTE: LVGL will swap the buffers in the background, so here we can set the LCD framebuffer to the current LVGL buffer, which has been just completed)
		HAL_StatusTypeDef ret = HAL_LTDC_SetAddress(&hltdc, (uint32_t)(lv_display_get_buf_active(disp)->data), 0);
    SEGGER_RTT_printf(0, "HAL_LTDC_SetAddress returned %d\n", ret);
	}
	lv_display_flush_ready(disp);

I believe the LVGL initialization is correct; I suspect the issue is more related to the DSI communication configuration. Still, I’m posting it here as well in case there’s any configuration I may have set incorrectly or anything else I should take into account.

I’m attaching a link to the post on the STM32 forum, where I’ve included more information about the communication setup.

Thank you very much for your help.

lv_conf.h (50.3 KB)

Have you tried to compile and run the code on the repo riverdi-70-stm32h7-lvgl, i mean just open it in STM32CubeIDE and build the project, do not regenerate the code based on the ioc file, most likely is not “correct”, at least the one for the 5" it seems to not be 100% correct. The current project will give an error in sd_diskio.c with the latest version of STM32CubeIDE but is easy to fix (replace the NULL by 0).

Use that to validate that the hardware is “OK” and the display works (tested in one sample I have here and it’s working), and then you can check if the clocks setup and interrupts there match the ones you generated in your project.

Eventually if you want an ioc file that is for sure correct to that board, create a project using TouchGFx using the template for that board and use that ioc as reference.