Skip to content

Commit c44e7dc

Browse files
committed
Merge branch 'feat/adapt_spi_lcd_to_lvgl_v9' into 'master'
feat(spi_lcd): adapt spi_lcd example to LVGL v9 Closes IDF-10953 and IDFGH-13741 See merge request espressif/esp-idf!33620
2 parents 13d4235 + 5bef0f5 commit c44e7dc

File tree

9 files changed

+141
-204
lines changed

9 files changed

+141
-204
lines changed

components/esp_lcd/test_apps/.build-test-rules.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,3 @@ components/esp_lcd/test_apps/spi_lcd:
5252
- esp_driver_spi
5353
disable:
5454
- if: SOC_GPSPI_SUPPORTED != 1
55-
disable_test:
56-
- if: IDF_TARGET in ["esp32c61"]
57-
temporary: true
58-
reason: test failed # TODO: ESP32C61 IDF-10953

components/esp_lcd/test_apps/spi_lcd/main/test_spi_board.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ extern "C" {
2828
#define TEST_LCD_DC_GPIO 1
2929
#define TEST_LCD_PCLK_GPIO 2
3030
#define TEST_LCD_DATA0_GPIO 4
31+
#elif CONFIG_IDF_TARGET_ESP32C61
32+
#define TEST_LCD_BK_LIGHT_GPIO 3
33+
#define TEST_LCD_RST_GPIO 5
34+
#define TEST_LCD_CS_GPIO 0
35+
#define TEST_LCD_DC_GPIO 1
36+
#define TEST_LCD_PCLK_GPIO 2
37+
#define TEST_LCD_DATA0_GPIO 4
3138
#elif CONFIG_IDF_TARGET_ESP32P4
3239
#define TEST_LCD_BK_LIGHT_GPIO 23
3340
#define TEST_LCD_RST_GPIO 6

components/esp_lcd/test_apps/spi_lcd/pytest_spi_lcd.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66

77
@pytest.mark.supported_targets
8-
@pytest.mark.temp_skip_ci(targets=['esp32c61'], reason='test case fail') # TODO: [ESP32C61] IDF-10953
98
@pytest.mark.generic
109
@pytest.mark.parametrize(
1110
'config',

docs/en/api-reference/peripherals/lcd/spi_lcd.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ SPI Interfaced LCD
55

66
#. Create an SPI bus. Please refer to :doc:`SPI Master API doc </api-reference/peripherals/spi_master>` for more details.
77

8+
Currently the driver supports SPI, Quad SPI and Octal SPI (simulate Intel 8080 timing) modes.
9+
810
.. code-block:: c
911
1012
spi_bus_config_t buscfg = {
1113
.sclk_io_num = EXAMPLE_PIN_NUM_SCLK,
1214
.mosi_io_num = EXAMPLE_PIN_NUM_MOSI,
1315
.miso_io_num = EXAMPLE_PIN_NUM_MISO,
14-
.quadwp_io_num = -1, // Quad SPI LCD driver is not yet supported
15-
.quadhd_io_num = -1, // Quad SPI LCD driver is not yet supported
16+
.quadwp_io_num = -1,
17+
.quadhd_io_num = -1,
1618
.max_transfer_sz = EXAMPLE_LCD_H_RES * 80 * sizeof(uint16_t), // transfer 80 lines of pixels (assume pixel is RGB565) at most in one SPI transaction
1719
};
1820
ESP_ERROR_CHECK(spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO)); // Enable the DMA feature

docs/zh_CN/api-reference/peripherals/lcd/spi_lcd.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ SPI 接口的 LCD
55

66
#. 创建 SPI 总线。详情请参阅 :doc:`SPI 主机 API 文档 </api-reference/peripherals/spi_master>`。
77

8+
目前驱动支持 SPI, Quad SPI 和 Octal SPI(模拟 Intel 8080 时序)模式。
9+
810
.. code-block:: c
911
1012
spi_bus_config_t buscfg = {
1113
.sclk_io_num = EXAMPLE_PIN_NUM_SCLK,
1214
.mosi_io_num = EXAMPLE_PIN_NUM_MOSI,
1315
.miso_io_num = EXAMPLE_PIN_NUM_MISO,
14-
.quadwp_io_num = -1, // 目前不支持 Quad SPI LCD 驱动
15-
.quadhd_io_num = -1, // 目前不支持 Quad SPI LCD 驱动
16+
.quadwp_io_num = -1,
17+
.quadhd_io_num = -1,
1618
.max_transfer_sz = EXAMPLE_LCD_H_RES * 80 * sizeof(uint16_t), // 单次最多可传输 80 行像素(假设像素格式为 RGB565)
1719
};
1820
ESP_ERROR_CHECK(spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO)); // 启用 DMA
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
dependencies:
2-
idf: ">=4.4"
3-
lvgl/lvgl: "~8.3.0"
2+
lvgl/lvgl: "~9.2.0"
43
esp_lcd_ili9341: "^1.0"
54
esp_lcd_gc9a01: "^1.0"
65
esp_lcd_touch_stmpe610: "^1.0"
Lines changed: 26 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,56 @@
11
/*
2-
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: CC0-1.0
55
*/
66

7-
// This demo UI is adapted from LVGL official example: https://docs.lvgl.io/master/widgets/extra/meter.html#simple-meter
7+
// This demo UI is adapted from LVGL official example: https://docs.lvgl.io/master/examples.html#loader-with-arc
88

99
#include "lvgl.h"
1010

11-
static lv_obj_t *meter;
1211
static lv_obj_t * btn;
13-
static lv_disp_rot_t rotation = LV_DISP_ROT_NONE;
14-
15-
static void set_value(void *indic, int32_t v)
16-
{
17-
lv_meter_set_indicator_end_value(meter, indic, v);
18-
}
12+
static lv_display_rotation_t rotation = LV_DISP_ROTATION_0;
1913

2014
static void btn_cb(lv_event_t * e)
2115
{
22-
lv_disp_t *disp = lv_event_get_user_data(e);
16+
lv_display_t *disp = lv_event_get_user_data(e);
2317
rotation++;
24-
if (rotation > LV_DISP_ROT_270) {
25-
rotation = LV_DISP_ROT_NONE;
18+
if (rotation > LV_DISP_ROTATION_270) {
19+
rotation = LV_DISP_ROTATION_0;
2620
}
2721
lv_disp_set_rotation(disp, rotation);
2822
}
29-
30-
void example_lvgl_demo_ui(lv_disp_t *disp)
23+
static void set_angle(void * obj, int32_t v)
3124
{
32-
lv_obj_t *scr = lv_disp_get_scr_act(disp);
33-
meter = lv_meter_create(scr);
34-
lv_obj_center(meter);
35-
lv_obj_set_size(meter, 200, 200);
36-
37-
/*Add a scale first*/
38-
lv_meter_scale_t *scale = lv_meter_add_scale(meter);
39-
lv_meter_set_scale_ticks(meter, scale, 41, 2, 10, lv_palette_main(LV_PALETTE_GREY));
40-
lv_meter_set_scale_major_ticks(meter, scale, 8, 4, 15, lv_color_black(), 10);
41-
42-
lv_meter_indicator_t *indic;
43-
44-
/*Add a blue arc to the start*/
45-
indic = lv_meter_add_arc(meter, scale, 3, lv_palette_main(LV_PALETTE_BLUE), 0);
46-
lv_meter_set_indicator_start_value(meter, indic, 0);
47-
lv_meter_set_indicator_end_value(meter, indic, 20);
48-
49-
/*Make the tick lines blue at the start of the scale*/
50-
indic = lv_meter_add_scale_lines(meter, scale, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_BLUE), false, 0);
51-
lv_meter_set_indicator_start_value(meter, indic, 0);
52-
lv_meter_set_indicator_end_value(meter, indic, 20);
53-
54-
/*Add a red arc to the end*/
55-
indic = lv_meter_add_arc(meter, scale, 3, lv_palette_main(LV_PALETTE_RED), 0);
56-
lv_meter_set_indicator_start_value(meter, indic, 80);
57-
lv_meter_set_indicator_end_value(meter, indic, 100);
58-
59-
/*Make the tick lines red at the end of the scale*/
60-
indic = lv_meter_add_scale_lines(meter, scale, lv_palette_main(LV_PALETTE_RED), lv_palette_main(LV_PALETTE_RED), false, 0);
61-
lv_meter_set_indicator_start_value(meter, indic, 80);
62-
lv_meter_set_indicator_end_value(meter, indic, 100);
25+
lv_arc_set_value(obj, v);
26+
}
6327

64-
/*Add a needle line indicator*/
65-
indic = lv_meter_add_needle_line(meter, scale, 4, lv_palette_main(LV_PALETTE_GREY), -10);
28+
void example_lvgl_demo_ui(lv_display_t *disp)
29+
{
30+
lv_obj_t *scr = lv_display_get_screen_active(disp);
6631

67-
btn = lv_btn_create(scr);
32+
btn = lv_button_create(scr);
6833
lv_obj_t * lbl = lv_label_create(btn);
6934
lv_label_set_text_static(lbl, LV_SYMBOL_REFRESH" ROTATE");
7035
lv_obj_align(btn, LV_ALIGN_BOTTOM_LEFT, 30, -30);
7136
/*Button event*/
7237
lv_obj_add_event_cb(btn, btn_cb, LV_EVENT_CLICKED, disp);
7338

74-
/*Create an animation to set the value*/
39+
/*Create an Arc*/
40+
lv_obj_t * arc = lv_arc_create(scr);
41+
lv_arc_set_rotation(arc, 270);
42+
lv_arc_set_bg_angles(arc, 0, 360);
43+
lv_obj_remove_style(arc, NULL, LV_PART_KNOB); /*Be sure the knob is not displayed*/
44+
lv_obj_remove_flag(arc, LV_OBJ_FLAG_CLICKABLE); /*To not allow adjusting by click*/
45+
lv_obj_center(arc);
46+
7547
lv_anim_t a;
7648
lv_anim_init(&a);
77-
lv_anim_set_exec_cb(&a, set_value);
78-
lv_anim_set_var(&a, indic);
49+
lv_anim_set_var(&a, arc);
50+
lv_anim_set_exec_cb(&a, set_angle);
51+
lv_anim_set_duration(&a, 1000);
52+
lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); /*Just for the demo*/
53+
lv_anim_set_repeat_delay(&a, 500);
7954
lv_anim_set_values(&a, 0, 100);
80-
lv_anim_set_time(&a, 2000);
81-
lv_anim_set_repeat_delay(&a, 100);
82-
lv_anim_set_playback_time(&a, 500);
83-
lv_anim_set_playback_delay(&a, 100);
84-
lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
8555
lv_anim_start(&a);
8656
}

0 commit comments

Comments
 (0)