Squareline project on RP2040 with GC9A01 Display -> only garbage after upload

Hello all!

Description

I’m trying to upload a screen (created with Squareline) to the Raspberry Pi Pico and show it on the GC9A01 display. After the upload the display shows only garbage.

What MCU/Processor/Board and compiler are you using?

RP2040 with Arduino framework on PlatformIO

What do you want to achieve?

I want to show the generated screen on the display.
Target

What have you tried so far?

Code to reproduce

Add the relevant code snippets here.
Code of Platformio.ini

The code block(s) should be between ```c and ``` tags:

[env:pico]
platform = raspberrypi
board = pico
framework = arduino
monitor_port = COM4
monitor_speed = 115200

lib_deps = 
	lvgl/lvgl@^8.3.6
	https://github.com/Bodmer/TFT_eSPI
build_flags =
  ;###############################################################
  ; TFT_eSPI library setting here (no need to edit library files):
  ;###############################################################
  -D USER_SETUP_LOADED=1                        ; Set this settings as valid
  -D GC9A01_DRIVER=1                           ; Select ILI9163 driver
  -D TFT_WIDTH=240                              ; Set TFT size
  -D TFT_HEIGHT=240
  -D TFT_MOSI=7
  -D TFT_SCLK=6
  -D TFT_CS=5
  -D TFT_DC=4                                  ; Data/Comand pin
  -D TFT_RST=3                                 ; Reset pin
  -D LOAD_GLCD=1                                ; Load Fonts
  -D SPI_FREQUENCY=27000000                     ; Set SPI frequency
  
lib_ignore = Portenta_lvgl

main.cpp

#include <lvgl.h>
#include <TFT_eSPI.h>
#include <ui.h>

/*Don't forget to set Sketchbook location in File/Preferencesto the path of your UI project (the parent foder of this INO file)*/

/*Change to your screen resolution*/
static const uint16_t screenWidth  = 240;
static const uint16_t screenHeight = 240;

static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[ screenWidth * screenHeight / 10 ];

TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */

#if LV_USE_LOG != 0
/* Serial debugging */
void my_print(const char * buf)
{
    Serial.printf(buf);
    Serial.flush();
}
#endif

/* Display flushing */
void my_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p )
{
    uint32_t w = ( area->x2 - area->x1 + 1 );
    uint32_t h = ( area->y2 - area->y1 + 1 );

    tft.startWrite();
    tft.setAddrWindow( area->x1, area->y1, w, h );
    tft.pushColors( ( uint16_t * )&color_p->full, w * h, true );
    tft.endWrite();

    lv_disp_flush_ready( disp );
}

/*Read the touchpad*/
void my_touchpad_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
{
    uint16_t touchX = 0, touchY = 0;

    bool touched = false;//tft.getTouch( &touchX, &touchY, 600 );

    if( !touched )
    {
        data->state = LV_INDEV_STATE_REL;
    }
    else
    {
        data->state = LV_INDEV_STATE_PR;

        /*Set the coordinates*/
        data->point.x = touchX;
        data->point.y = touchY;

        Serial.print( "Data x " );
        Serial.println( touchX );

        Serial.print( "Data y " );
        Serial.println( touchY );
    }
}

void setup()
{
    Serial.begin( 115200 ); /* prepare for possible serial debug */

    String LVGL_Arduino = "Hello Arduino! ";
    LVGL_Arduino += String('V') + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch();

    Serial.println( LVGL_Arduino );
    Serial.println( "I am LVGL_Arduino" );

    lv_init();

#if LV_USE_LOG != 0
    lv_log_register_print_cb( my_print ); /* register print function for debugging */
#endif

    tft.begin();          /* TFT init */
    tft.setRotation( 3 ); /* Landscape orientation, flipped */

    lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * screenHeight / 10 );

    /*Initialize the display*/
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init( &disp_drv );
    /*Change the following line to your display resolution*/
    disp_drv.hor_res = screenWidth;
    disp_drv.ver_res = screenHeight;
    disp_drv.flush_cb = my_disp_flush;
    disp_drv.draw_buf = &draw_buf;
    lv_disp_drv_register( &disp_drv );

    /*Initialize the (dummy) input device driver*/
    static lv_indev_drv_t indev_drv;
    lv_indev_drv_init( &indev_drv );
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = my_touchpad_read;
    lv_indev_drv_register( &indev_drv );


    ui_init();

    Serial.println( "Setup done" );
}

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

Screenshot and/or video

If possible, add screenshots and/or videos about the current state.
Display shows me only garbage after the upload.

I’m a total noob with lvgl and hope someone can help me :slight_smile: to show the screen correct on the display.

Thanks a lot and best regards

Hello, I am having the same issue, did you manage to solve the issue?

Try check if work tft part ok add after orientation

tft.fillScreen(TFT_BLACK);

Hello @kiruhcs @Invincible_Xaasha

Which display is this exactly? Is it from Waveshare?

Have a look at my repo here: GitHub - JesseDWatts/RP2040_LVGL

My pin definitions are a bit different though

#define TFT_MOSI 11
#define TFT_MISO -1 // In some display driver board, it might be written as "SDA" and so on.
#define TFT_SCLK 10
#define TFT_CS   9 
#define TFT_DC   8  // Data Command control pin
#define TFT_RST  13  // Reset pin (could connect to Arduino RESET pin)
#define TFT_BL   25  // LED back-light