Need help running LVGL on Portenta X8

Hi everyone,

I’m trying to display an image from the Portenta X8 to an HDMI monitor via usb-c to HDMI converter. The Portenta X8 outputs video as DisplayPort to the USB-C. Can LVGL be used to accomplish this objective?

I successfully compiled the example and uploaded the sketch to the Portenta however no image is displayed.

I’m a bit new to all of this. I need a bit of guidance with this one.
This is the sketch I used (LVGL_Arduino.ino):

/*Using LVGL with Arduino requires some extra steps:
*Be sure to read the docs here: https://docs.lvgl.io/master/integration/framework/arduino.html */

#include <lvgl.h>
#include <SerialRPC.h>

#if LV_USE_TFT_ESPI
#include <TFT_eSPI.h>
#endif

/*To use the built-in examples and demos of LVGL uncomment the includes below respectively.
*You also need to copy lvgl/examples to lvgl/src/examples. Similarly for the demos lvgl/demos to lvgl/src/demos.
*Note that the lv_examples library is for LVGL v7 and you shouldn’t install it for this version (since LVGL v8)
*as the examples and demos are now part of the main LVGL library. */

//#include <examples/lv_examples.h>
//#include <demos/lv_demos.h>

/Set to your screen resolution and rotation/
#define TFT_HOR_RES 720
#define TFT_VER_RES 480
#define TFT_ROTATION LV_DISPLAY_ROTATION_0

/LVGL draw into this buffer, 1/10 screen size usually works well. The size is in bytes/
#define DRAW_BUF_SIZE (TFT_HOR_RES * TFT_VER_RES / 10 * (LV_COLOR_DEPTH / 8))
uint32_t draw_buf[DRAW_BUF_SIZE / 4];

#if LV_USE_LOG != 0
void my_print( lv_log_level_t level, const char * buf )
{
LV_UNUSED(level);
Serial.println(buf);
Serial.flush();
}
#endif

/* LVGL calls it when a rendered image needs to copied to the display*/
void my_disp_flush( lv_display_t *disp, const lv_area_t *area, uint8_t * px_map)
{
/Copy px map to the area/

/*For example ("my_..." functions needs to be implemented by you)
uint32_t w = lv_area_get_width(area);
uint32_t h = lv_area_get_height(area);

my_set_window(area->x1, area->y1, w, h);
my_draw_bitmaps(px_map, w * h);
 */

/*Call it to tell LVGL you are ready*/
lv_display_flush_ready(disp);

}

/Read the touchpad/
void my_touchpad_read( lv_indev_t * indev, lv_indev_data_t * data )
{
/*For example (“my_…” functions needs to be implemented by you)
int32_t x, y;
bool touched = my_get_touch( &x, &y );

if(!touched) {
    data->state = LV_INDEV_STATE_RELEASED;
} else {
    data->state = LV_INDEV_STATE_PRESSED;

    data->point.x = x;
    data->point.y = y;
}
 */

}

/use Arduinos millis() as tick source/
static uint32_t my_tick()
{
return millis();
}

void setup()
{
String LVGL_Arduino = "Hello Arduino! ";
LVGL_Arduino += String(‘V’) + lv_version_major() + “.” + lv_version_minor() + “.” + lv_version_patch();

Serial.begin( 115200 );
Serial.println( LVGL_Arduino );

lv_init();

/*Set a tick source so that LVGL will know how much time elapsed. */
lv_tick_set_cb(my_tick);

/* register print function for debugging */

#if LV_USE_LOG != 0
lv_log_register_print_cb( my_print );
#endif

lv_display_t * disp;

#if LV_USE_TFT_ESPI
/TFT_eSPI can be enabled lv_conf.h to initialize the display in a simple way/
disp = lv_tft_espi_create(TFT_HOR_RES, TFT_VER_RES, draw_buf, sizeof(draw_buf));
lv_display_set_rotation(disp, TFT_ROTATION);

#else
/Else create a display yourself/
disp = lv_display_create(TFT_HOR_RES, TFT_VER_RES);
lv_display_set_flush_cb(disp, my_disp_flush);
lv_display_set_buffers(disp, draw_buf, NULL, sizeof(draw_buf), LV_DISPLAY_RENDER_MODE_PARTIAL);
#endif

/*Initialize the (dummy) input device driver*/
lv_indev_t * indev = lv_indev_create();
lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); /*Touchpad should have POINTER type*/
lv_indev_set_read_cb(indev, my_touchpad_read);

/* Create a simple label
 * ---------------------
 lv_obj_t *label = lv_label_create( lv_screen_active() );
 lv_label_set_text( label, "Hello Arduino, I'm LVGL!" );
 lv_obj_align( label, LV_ALIGN_CENTER, 0, 0 );

 * Try an example. See all the examples
 *  - Online: https://docs.lvgl.io/master/examples.html
 *  - Source codes: https://github.com/lvgl/lvgl/tree/master/examples
 * ----------------------------------------------------------------

 lv_example_btn_1();

 * Or try out a demo. Don't forget to enable the demos in lv_conf.h. E.g. LV_USE_DEMO_WIDGETS
 * -------------------------------------------------------------------------------------------

 lv_demo_widgets();
 */

lv_obj_t *label = lv_label_create( lv_screen_active() );
lv_label_set_text( label, "Hello Arduino, I'm LVGL!" );
lv_obj_align( label, LV_ALIGN_CENTER, 0, 0 );

Serial.println( "Setup done" );

}

void loop()
{
lv_timer_handler(); /* let the GUI do its work /
delay(5); /
let this time pass */
}

After moving a few folder around I did get it to compile and it uploaded however no displayed text.

lv_conf.h is set as per instructions.

Any suggestions or links to reading material would be greatly appreciated. I’ve been having a hard time finding any solid support for this board.

Thanks for reading.

-Time

Hi everyone,

I wanted to report that the Portenta X8 documents are at best misleading. Their “suggestions” for the required adapter were very ambiguous but after digging into the specifics the output of the Portenta X8 via USB-C port is DisplayPort. Their “Getting Started” documents are very unclear about this.

Anyway my problem was my adapter. To anyone who cares, be sure to have a DP Alt Mode capable adapter and if you don’t have the breakout board you’ll need a powered adapter(DP Alt mode capable).