espressif / esp-bsp

Board support components for Espressif development boards
Other
141 stars 76 forks source link

esp_lvgl_port does not work with 3wire_spi (esp_lcd_panel_io_additions) (BSP-469) #304

Closed kasbert closed 2 months ago

kasbert commented 2 months ago

I have ESP32-4848S040 board like this https://github.com/rzeldent/platformio-espressif32-sunton?tab=readme-ov-file#esp32-4848s040-c . I understand that Espressif supports only own boards, but I am hoping you could give some advise.

The board has ST7701 / 16 bit parallel interface and 3 wire SPI. For 3 wire SPI I use esp_lcd_panel_io_additions. https://github.com/espressif/esp-iot-solution/tree/master/components/display/lcd/esp_lcd_panel_io_additions. When using it with esp_lvgl_port, the driver gives an error E (5430) lcd_panel.io.3wire_spi: Register event callbacks is not supported Because of this, the lvgl_port_flush_ready_callback is never called and the task hangs with a watchdog error:

E (12300) task_wdt: Task watchdog got triggered. The following tasks/users did not reset the watchdog in time:
E (12300) task_wdt:  - IDLE0 (CPU 0)
E (12300) task_wdt: Tasks currently running:
E (12300) task_wdt: CPU 0: main
E (12300) task_wdt: CPU 1: IDLE1
E (12300) task_wdt: Print CPU 0 (current core) backtrace

Backtrace: 0x4204121F:0x3FC9D070 0x4204163C:0x3FC9D090 0x40377B49:0x3FC9D0C0 0x4201B2CA:0x3FCAF990 0x4201B583:0x3FCAFA00 0x4201B691:0x3FCAFA30 0x4201B842:0x3FCAFA50 0x420290E9:0x3FCAFA80 0x42029196:0x3FCAFAA0 0x4200A248:0x3FCAFAC0 0x420BE513:0x3FCAFAE0 0x4037EF91:0x3FCAFB10
0x4204121f: task_wdt_timeout_handling at /projects/esp/esp-idf/components/esp_system/task_wdt/task_wdt.c:441
0x4204163c: task_wdt_isr at /projects/esp/esp-idf/components/esp_system/task_wdt/task_wdt.c:515
0x40377b49: _xt_lowint1 at /projects/esp/esp-idf/components/xtensa/xtensa_vectors.S:1240
0x4201b2ca: refr_area_part at /projects/esp/4.0inch_ESP32-4848S040/86switch_onoff/managed_components/lvgl__lvgl/src/core/lv_refr.c:712 (discriminator 1)
0x4201b583: refr_area at /projects/esp/4.0inch_ESP32-4848S040/86switch_onoff/managed_components/lvgl__lvgl/src/core/lv_refr.c:680
0x4201b691: refr_invalid_areas at /projects/esp/4.0inch_ESP32-4848S040/86switch_onoff/managed_components/lvgl__lvgl/src/core/lv_refr.c:618
0x4201b842: _lv_disp_refr_timer at /projects/esp/4.0inch_ESP32-4848S040/86switch_onoff/managed_components/lvgl__lvgl/src/core/lv_refr.c:325
0x420290e9: lv_timer_exec at /projects/esp/4.0inch_ESP32-4848S040/86switch_onoff/managed_components/lvgl__lvgl/src/misc/lv_timer.c:313 (discriminator 2)
0x42029196: lv_timer_handler at /projects/esp/4.0inch_ESP32-4848S040/86switch_onoff/managed_components/lvgl__lvgl/src/misc/lv_timer.c:109
0x4200a248: app_main at /projects/esp/4.0inch_ESP32-4848S040/86switch_onoff/main/86switch_onoff.c:874 (discriminator 1)
0x420be513: main_task at /projects/esp/esp-idf/components/freertos/app_startup.c:208
0x4037ef91: vPortTaskWrapper at /projects/esp/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:134

Adding lv_disp_flush_ready() to lvgl_port_flush_callback helps, but is this the right way ?

VojtechBartoska commented 2 months ago

@espzav Can you please help with initial triage of this ticket? Thanks

espzav commented 2 months ago

Hi @kasbert, you are right, we are supporting mainly Espressif's boards in BSP, drivers and LVGL port. We haven't HW for support 3wire SPI in LVGL port now.

Your change of lv_disp_flush_ready() is pretty righ but better is call it after SPI transfer is done.

kasbert commented 2 months ago

I added lv_disp_flush_ready to vsync callback. Seem to work well enough.

IRAM_ATTR
static bool lvgl_flush_ready_callback(struct esp_lcd_panel_t *panel_io, const esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx)
{
    lv_disp_drv_t *disp_drv = (lv_disp_drv_t *)user_ctx;
    assert(disp_drv != NULL);
    lv_disp_flush_ready(disp_drv);
    return false;
}

and

    esp_lcd_rgb_panel_event_callbacks_t cbs = {
        .on_vsync = lvgl_flush_ready_callback,
    };
    ESP_ERROR_CHECK(esp_lcd_rgb_panel_register_event_callbacks(disp_ctx->panel_handle, &cbs,
                                                             disp->driver));