Arduino Giga Display turning white after loading display

Description

I am having trouble with the screen turning white immediately on startup and not showing anything.

To test the display buffer, I replaced the code in the display buffer to colour the screen red (i.e., replaced the code in the second for loop with Display.set(x, y, 255, 0, 0);). I saw the red streak through the display in blocks, and then the blocks be trailed almost immediately by black as the red continued down (whether or not I had the code for lv_obj_t * screen_black = lv_obj_create(NULL); there or not), then the screen turned white. I also put a serial print in the flush callback that was outputting to the monitor. So I know that the flush callback is being called and is working.

If I replace lv_obj_t * screen_black = lv_obj_create(NULL); with lv_obj_t * screen_black = lv_obj_create(lv_screen_active());, leave the rest of the code for the screen obj, and remove the code for creating the display and buffers, the screen does appropriately turn black (with a small white border).

I thought about trying TFT_eSPI instead of Arduino_H7_Video that I am currently using, but though it looks like the processor might be supported, I couldn’t figure out the right driver for the display (and I haven’t found an example from anyone who has got it working with the Giga Display).

Any ideas of what might be going on here?

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

Arduino Giga with an Arduino Giga Display Shield

What LVGL version are you using?

v9.2.2

What do you want to achieve?

Get the display working properly

What have you tried so far?

Testing to make sure that the display buffer is working

Code to reproduce

#include <Arduino_H7_Video.h>
#include <Arduino_GigaDisplay.h> // v1.0.2
#include <Arduino_GigaDisplayTouch.h> // v1.0.1
#include <lvgl.h> // LVGL v9.2.2
#include <ArduinoGraphics.h>

Arduino_H7_Video Display(800, 480, GigaDisplayShield);
Arduino_GigaDisplayTouch TouchDetector;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  
  Display.begin();

  lv_init();

  lv_display_t * display = lv_display_create(800, 480); 

  static uint8_t buf1[800 * 480 / 10];
  lv_display_set_buffers(display, buf1, NULL, sizeof(buf1), LV_DISPLAY_RENDER_MODE_PARTIAL);
  lv_display_set_flush_cb(display, my_disp_flush); 
  lv_disp_set_default(display);

  lv_obj_t * screen_black = lv_obj_create(NULL);
  lv_obj_set_size(screen_black, 800, 480);
  lv_obj_set_style_bg_color(screen_black, lv_color_black(), LV_PART_MAIN);
  lv_obj_set_style_bg_opa(screen_black, LV_OPA_COVER, LV_PART_MAIN);

  lv_screen_load(screen_black);

}

void loop() {
  // put your main code here, to run repeatedly:
  lv_timer_handler();
}

void my_disp_flush(lv_display_t *disp, const lv_area_t *area, uint8_t *color_p) {
  
  // Cast the buffer to lv_color_t for proper interpretation
  lv_color_t *color_map = (lv_color_t *)color_p;

  // Start drawing to the framebuffer
  Display.beginDraw();

  // Loop through the area and set pixels
  for (int32_t y = area->y1; y <= area->y2; y++) {
    for (int32_t x = area->x1; x <= area->x2; x++) {
      // Extract RGB565 from lv_color_t
      uint16_t color = *((uint16_t *)color_map);

      // Convert RGB565 to R, G, B components
      uint8_t r = (color >> 11) & 0x1F;  // Extract 5 bits for red
      uint8_t g = (color >> 5) & 0x3F;   // Extract 6 bits for green
      uint8_t b = color & 0x1F;          // Extract 5 bits for blue

      // Scale to 8-bit values (0-255)
      r = (r * 255) / 31;
      g = (g * 255) / 63;
      b = (b * 255) / 31;

      // Set the pixel color
      Display.set(x, y, r, g, b);

      // Advance to the next color in the buffer
      color_map++;
    }
  }

  // End drawing operation
  Display.endDraw();

  lv_display_flush_ready(disp);
}

Screenshot and/or video

I ended up uninstalling and reinstalling the Arduino IDE as well as the libraries, and that got the display and screen showing up. However, the text is completely illegible, appearing as pixelated, cut, and and smeared content the size of the area that the text normally is. Then, when I create a new screen and delete the old one, nothing shows up (though I can see the buffer go through).

Taking out the code for creating a display and assuming that there is a default display, things look fine for the text and the LVGL widgets, and the screen updates immediately (i.e., I don’t see the flush going through). I’m still getting some other crashes switching between menu screens, but it’s progress.

A quick update. It turns out that Arduino_H7_Video.h is set up for LVGL in its code, including initializing LVGL, creating a buffer, etc. So part of the reason that I was having trouble was that I was trying to create a display with the same name and create a buffer on a display that has a buffer.