From efde86778b093642aeb9775d3c6b2e0f3e59a1ea Mon Sep 17 00:00:00 2001 From: Thomas Peterson Date: Thu, 15 Jan 2026 22:22:50 +0100 Subject: [PATCH] Fixes --- .vscode/settings.json | 3 +- dependencies.lock | 196 +++++++++++++++++++++++++++++++++++++++- main/CMakeLists.txt | 4 +- main/hello_world_main.c | 126 +++++++++++++++----------- main/idf_component.yml | 1 + 5 files changed, 273 insertions(+), 57 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 4893a04..d66977b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,5 +14,6 @@ "--background-index", "--query-driver=/home/thomas/.espressif/tools/riscv32-esp-elf/esp-14.2.0_20251107/riscv32-esp-elf/bin/riscv32-esp-elf-gcc", "--compile-commands-dir=/home/thomas/projekte/test1/display/build" - ] + ], + "idf.flashType": "UART" } diff --git a/dependencies.lock b/dependencies.lock index 7d0bc0e..a7224b1 100644 --- a/dependencies.lock +++ b/dependencies.lock @@ -1,4 +1,19 @@ dependencies: + espressif/button: + component_hash: + fccb18c37f1cfe0797b74a53a44d3f400f5fd01f4993b40052dfb7f401915089 + dependencies: + - name: espressif/cmake_utilities + registry_url: https://components.espressif.com + require: private + version: '*' + - name: idf + require: private + version: '>=4.0' + source: + registry_url: https://components.espressif.com + type: service + version: 4.1.5 espressif/cmake_utilities: component_hash: 351350613ceafba240b761b4ea991e0f231ac7a9f59a9ee901f751bddc0bb18f @@ -36,6 +51,100 @@ dependencies: registry_url: https://components.espressif.com/ type: service version: 1.2.0~1 + espressif/esp_lv_decoder: + component_hash: + 0eb7b2bceaf73484ef80f5004337ee31617b2450a3d40621812998a47e7dd349 + dependencies: + - name: espressif/esp_new_jpeg + registry_url: https://components.espressif.com + require: private + version: 0.* + - name: espressif/libpng + registry_url: https://components.espressif.com + require: private + version: 1.* + - name: idf + require: private + version: '>=5.3' + - name: lvgl/lvgl + registry_url: https://components.espressif.com + require: private + version: '>=8,<10' + source: + registry_url: https://components.espressif.com + type: service + targets: + - esp32 + - esp32s2 + - esp32s3 + - esp32p4 + - esp32c2 + - esp32c3 + - esp32c5 + - esp32c6 + version: 0.3.2 + espressif/esp_lv_fs: + component_hash: + 66896007884b817df34c964f9a114fff538ee2674e99fee7159162498b93f94b + dependencies: + - name: espressif/cmake_utilities + registry_url: https://components.espressif.com + require: private + version: 0.* + - name: espressif/esp_mmap_assets + registry_url: https://components.espressif.com + require: private + version: '>=1.2' + - name: idf + require: private + version: '>=4.4' + - name: lvgl/lvgl + registry_url: https://components.espressif.com + require: private + version: '>=8,<10' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.1 + espressif/esp_lvgl_adapter: + component_hash: + 4ba6ad754b2533cb582bff81ba672ea7a682f4724a02327e57f96e9c73d330c2 + dependencies: + - name: espressif/button + registry_url: https://components.espressif.com + require: public + version: 4.* + - name: espressif/esp_lcd_touch + registry_url: https://components.espressif.com + require: public + version: 1.* + - name: espressif/esp_lv_decoder + registry_url: https://components.espressif.com + require: public + version: 0.* + - name: espressif/esp_lv_fs + registry_url: https://components.espressif.com + require: public + version: 1.* + - name: espressif/freetype + registry_url: https://components.espressif.com + require: public + version: 2.* + - name: espressif/knob + registry_url: https://components.espressif.com + require: public + version: 1.* + - name: idf + require: private + version: '>=5.5' + - name: lvgl/lvgl + registry_url: https://components.espressif.com + require: private + version: '>=8,<10' + source: + registry_url: https://components.espressif.com/ + type: service + version: 0.3.0 espressif/esp_lvgl_port: component_hash: f872401524cb645ee6ff1c9242d44fb4ddcfd4d37d7be8b9ed3f4e85a404efcd @@ -51,6 +160,49 @@ dependencies: registry_url: https://components.espressif.com/ type: service version: 2.7.0 + espressif/esp_mmap_assets: + component_hash: + 91d785326b03db15e2f7f1314d8c976d38f21aa5759b570dcbbc89bcf247fd27 + dependencies: + - name: espressif/cmake_utilities + registry_url: https://components.espressif.com + require: private + version: 0.* + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.4.0 + espressif/esp_new_jpeg: + component_hash: + e6af208a875abd0ecfc0213d3751a11b504b463ebde6930f24096047925fa5c1 + dependencies: [] + source: + registry_url: https://components.espressif.com + type: service + targets: + - esp32 + - esp32s2 + - esp32s3 + - esp32p4 + - esp32c2 + - esp32c3 + - esp32c5 + - esp32c6 + version: 0.6.1 + espressif/freetype: + component_hash: + cd5e2d8458e6e8d73f1120ac474467cabb669d8ea4b25050bf6a348c1e89225e + dependencies: + - name: idf + require: private + version: '>=4.4' + source: + registry_url: https://components.espressif.com + type: service + version: 2.13.3~1 espressif/i2c_bus: component_hash: 4e990dc11734316186b489b362c61d41f23f79d58bc169795cec215e528cba14 @@ -66,6 +218,47 @@ dependencies: registry_url: https://components.espressif.com type: service version: 1.5.0 + espressif/knob: + component_hash: + 138ed090b4c9090a0a678f695b9d1884b368130c729b7333ed35bd7f4e8da80e + dependencies: + - name: espressif/cmake_utilities + registry_url: https://components.espressif.com + require: private + version: 0.* + - name: idf + require: private + version: '>=4.4.1' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.2 + espressif/libpng: + component_hash: + 6eb993575e30da281faa37cecda2338ccf6d11dbd12234937758278d1c78b4fd + dependencies: + - name: idf + require: private + version: '>=5.0' + - name: espressif/zlib + registry_url: https://components.espressif.com + require: private + version: ^1.2.13 + source: + registry_url: https://components.espressif.com + type: service + version: 1.6.52 + espressif/zlib: + component_hash: + d901723af51f13fc8e5824f39f32239c847956e8fd951a05266588dc5cfbb9ae + dependencies: + - name: idf + require: private + version: '>=4.4' + source: + registry_url: https://components.espressif.com + type: service + version: 1.3.1 idf: source: type: idf @@ -101,10 +294,11 @@ dependencies: version: 1.0.4 direct_dependencies: - espressif/esp_lcd_touch_gt911 +- espressif/esp_lvgl_adapter - espressif/esp_lvgl_port - idf - lvgl/lvgl - waveshare/esp_lcd_jd9365_10_1 -manifest_hash: 1b3972520800645b8020e1ad5d7fcfe89a9006c17fff1fcaa83ae8df9e2314ff +manifest_hash: df48f0c889a77855e4d9de37a676a02669553fe2b7fdf43547783bcf8f97c123 target: esp32p4 version: 2.0.0 diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index af735de..ed7036d 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,4 +1,4 @@ idf_component_register(SRCS "hello_world_main.c" - PRIV_REQUIRES spi_flash esp_lcd - REQUIRES esp_timer lvgl + PRIV_REQUIRES spi_flash esp_driver_ppa esp_lcd + REQUIRES esp_mm esp_driver_ppa esp_timer lvgl INCLUDE_DIRS "") diff --git a/main/hello_world_main.c b/main/hello_world_main.c index 345c4c3..07e2b5a 100644 --- a/main/hello_world_main.c +++ b/main/hello_world_main.c @@ -16,6 +16,8 @@ #include "esp_ldo_regulator.h" #include "esp_lcd_touch_gt911.h" #include "lvgl.h" +#include "esp_timer.h" +#include "esp_lv_adapter.h" #include "esp_lcd_jd9365_10_1.h" #define TAG "JD9365_LVGL" @@ -43,26 +45,19 @@ static esp_lcd_panel_handle_t panel_handle = NULL; static esp_lcd_touch_handle_t touch_handle = NULL; static lv_display_t *display = NULL; +static uint8_t *buf1 = NULL; +static uint8_t *buf2 = NULL; // ================= Callbacks =================== static bool on_color_trans_done(esp_lcd_panel_handle_t panel, esp_lcd_dpi_panel_event_data_t *event_data, void *user_ctx) { - BaseType_t high_task_awoken = pdFALSE; if (display) { lv_display_flush_ready(display); } - return high_task_awoken == pdTRUE; + return false; } -// ================= Flush Callback =================== -static void lvgl_flush_cb(lv_display_t *disp, const lv_area_t *area, uint8_t *color_p) -{ - // Warte bis vorheriger Transfer fertig ist - esp_lcd_panel_draw_bitmap(panel_handle, area->x1, area->y1, - area->x2 + 1, area->y2 + 1, color_p); -} - static void lvgl_touch_cb(lv_indev_t *indev, lv_indev_data_t *data) { uint16_t x[1], y[1]; @@ -98,6 +93,10 @@ static void lcd_init(void) esp_lcd_new_panel_io_dbi(mipi_dsi_bus, &io_cfg, &mipi_dbi_io); esp_lcd_dpi_panel_config_t dpi_cfg = JD9365_800_1280_PANEL_60HZ_DPI_CONFIG(LCD_COLOR_PIXEL_FORMAT_RGB565); + dpi_cfg.num_fbs = esp_lv_adapter_get_required_frame_buffer_count( + ESP_LV_ADAPTER_TEAR_AVOID_MODE_DEFAULT_MIPI_DSI, // Tearing mode + ESP_LV_ADAPTER_ROTATE_90 // Rotation + ); jd9365_vendor_config_t vendor_cfg = { .flags = { .use_mipi_interface = 1 }, .mipi_config = { .dsi_bus = mipi_dsi_bus, .dpi_config = &dpi_cfg, .lane_num = MIPI_DSI_LANE_NUM } @@ -109,13 +108,13 @@ static void lcd_init(void) .vendor_config = &vendor_cfg }; esp_lcd_new_panel_jd9365(mipi_dbi_io, &panel_cfg, &panel_handle); - + esp_lcd_panel_reset(panel_handle); esp_lcd_panel_init(panel_handle); + ESP_ERROR_CHECK(esp_lcd_dpi_panel_get_frame_buffer(panel_handle, 2, (void **)&buf1, (void **)&buf2)); esp_lcd_panel_disp_on_off(panel_handle, true); - esp_lcd_dpi_panel_event_callbacks_t cbs = { .on_color_trans_done = on_color_trans_done }; - esp_lcd_dpi_panel_register_event_callbacks(panel_handle, &cbs, NULL); + } // ================= Touch init =================== @@ -143,7 +142,7 @@ static void touch_init(void) .rst_gpio_num = TOUCH_RST_GPIO, .int_gpio_num = TOUCH_INT_GPIO, .levels = { .reset = 0, .interrupt = 0 }, - .flags = { .swap_xy = 0, .mirror_x = 0, .mirror_y = 0 }, + .flags = { .swap_xy = 1, .mirror_x = 1, .mirror_y = 0 }, }; ESP_ERROR_CHECK(esp_lcd_touch_new_i2c_gt911(touch_io, &touch_cfg, &touch_handle)); } @@ -151,54 +150,74 @@ static void touch_init(void) // ================= LVGL init =================== static void lvgl_init(void) { - lv_init(); + + esp_lv_adapter_config_t cfg = ESP_LV_ADAPTER_DEFAULT_CONFIG(); + ESP_ERROR_CHECK(esp_lv_adapter_init(&cfg)); - lv_display_t *disp = lv_display_create(LCD_H_RES, LCD_V_RES); - display = disp; - lv_display_set_color_format(disp, LV_COLOR_FORMAT_RGB565); + esp_lv_adapter_display_config_t disp_cfg = ESP_LV_ADAPTER_DISPLAY_MIPI_DEFAULT_CONFIG( + panel_handle, // LCD panel handle + NULL, // LCD panel IO handle (can be NULL for some interfaces) + LCD_H_RES, // Horizontal resolution + LCD_V_RES, // Vertical resolution + ESP_LV_ADAPTER_ROTATE_90 // Rotation + ); + display = esp_lv_adapter_register_display(&disp_cfg); + assert(display != NULL); - // Full-screen double buffer für bessere Performance mit DPI Panel - size_t buf_size = LCD_H_RES * 200 * sizeof(uint16_t); - uint8_t *buf1 = heap_caps_aligned_alloc(64, buf_size, MALLOC_CAP_SPIRAM | MALLOC_CAP_DMA); - uint8_t *buf2 = heap_caps_aligned_alloc(64, buf_size, MALLOC_CAP_SPIRAM | MALLOC_CAP_DMA); + esp_lv_adapter_touch_config_t touch_cfg = ESP_LV_ADAPTER_TOUCH_DEFAULT_CONFIG(display, touch_handle); + lv_indev_t *touch = esp_lv_adapter_register_touch(&touch_cfg); + lv_indev_set_read_cb(touch, lvgl_touch_cb); + assert(touch != NULL); - if (!buf1 || !buf2) { - ESP_LOGE(TAG, "Failed to allocate buffers!"); - return; - } + ESP_ERROR_CHECK(esp_lv_adapter_start()); +} - lv_display_set_buffers(disp, buf1, buf2, buf_size, LV_DISPLAY_RENDER_MODE_PARTIAL); - lv_display_set_flush_cb(disp, lvgl_flush_cb); - lv_display_set_default(disp); +static lv_obj_t * label2; - lv_indev_t *indev = lv_indev_create(); - lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); - lv_indev_set_read_cb(indev, lvgl_touch_cb); - lv_indev_set_display(indev, disp); +static void slider_event_cb(lv_event_t * e) +{ + lv_obj_t * slider = lv_event_get_target_obj(e); + + /*Refresh the text*/ + lv_label_set_text_fmt(label2, "%" LV_PRId32, lv_slider_get_value(slider)); + //lv_obj_align_to(label2, slider, LV_ALIGN_OUT_TOP_MID, 0, -15); /*Align top of the slider*/ +} + +uint32_t my_get_milliseconds() +{ + return esp_timer_get_time() / 1000; } // ================= UI =================== static void create_ui(void) { - lv_obj_t *tileview = lv_tileview_create(lv_screen_active()); + if (esp_lv_adapter_lock(-1) == ESP_OK) { + lv_obj_t *tileview = lv_tileview_create(lv_scr_act()); - // Page 1 - Blue - lv_obj_t *tile1 = lv_tileview_add_tile(tileview, 0, 0, LV_DIR_BOTTOM); - lv_obj_set_style_bg_color(tile1, lv_color_hex(0x2196F3), 0); - lv_obj_t *label1 = lv_label_create(tile1); - lv_label_set_text(label1, "Seite 1\n\nSwipe nach oben"); - lv_obj_set_style_text_color(label1, lv_color_white(), 0); - lv_obj_set_style_text_font(label1, &lv_font_montserrat_28, 0); - lv_obj_center(label1); + // Page 1 - Blue + lv_obj_t *tile1 = lv_tileview_add_tile(tileview, 0, 0, LV_DIR_BOTTOM); + lv_obj_set_style_bg_color(tile1, lv_color_hex(0x2196F3), 0); + lv_obj_t *label1 = lv_label_create(tile1); + lv_label_set_text(label1, "Seite 1\n\nSwipe nach oben"); + lv_obj_set_style_text_color(label1, lv_color_black(), 0); + lv_obj_set_style_text_font(label1, &lv_font_montserrat_14, 0); + lv_obj_center(label1); - // Page 2 - Green - lv_obj_t *tile2 = lv_tileview_add_tile(tileview, 0, 1, LV_DIR_TOP); - lv_obj_set_style_bg_color(tile2, lv_color_hex(0x4CAF50), 0); - lv_obj_t *label2 = lv_label_create(tile2); - lv_label_set_text(label2, "Seite 2\n\nSwipe nach unten"); - lv_obj_set_style_text_color(label2, lv_color_white(), 0); - lv_obj_set_style_text_font(label2, &lv_font_montserrat_28, 0); - lv_obj_center(label2); + lv_obj_t * slider = lv_slider_create(tile1); + lv_obj_set_width(slider, 200); /*Set the width*/ + lv_obj_center(slider); /*Align to the center of the parent (screen)*/ + lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + + // Page 2 - Green + lv_obj_t *tile2 = lv_tileview_add_tile(tileview, 0, 1, LV_DIR_TOP); + lv_obj_set_style_bg_color(tile2, lv_color_hex(0x4CAF50), 0); + label2 = lv_label_create(tile2); + lv_label_set_text(label2, "Seite 2\n\nSwipe nach unten"); + lv_obj_set_style_text_color(label2, lv_color_black(), 0); + lv_obj_set_style_text_font(label2, &lv_font_montserrat_14, 0); + lv_obj_center(label2); + esp_lv_adapter_unlock(); + } } // ================= Main =================== @@ -208,12 +227,13 @@ void app_main(void) lcd_init(); touch_init(); + lvgl_init(); create_ui(); - + //lv_tick_set_cb(xTaskGetTickCount); + //lv_tick_set_cb(my_get_milliseconds); while (1) { - lv_tick_inc(10); - lv_task_handler(); + lv_timer_handler(); vTaskDelay(pdMS_TO_TICKS(10)); } } diff --git a/main/idf_component.yml b/main/idf_component.yml index 8b7d442..2ab90c5 100644 --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -18,3 +18,4 @@ dependencies: lvgl/lvgl: ^9.4.0 espressif/esp_lvgl_port: ^2.3.0 espressif/esp_lcd_touch_gt911: '*' + espressif/esp_lvgl_adapter: '*'