From aa73e423d4a8a81ae62de36608a70b3fef51d280 Mon Sep 17 00:00:00 2001 From: suda-morris <362953310@qq.com> Date: Sat, 25 Sep 2021 22:23:10 +0800 Subject: [PATCH 1/2] lcd: initial build of API docs --- docs/doxygen/Doxyfile | 6 ++++ docs/en/api-reference/peripherals/index.rst | 1 + docs/en/api-reference/peripherals/lcd.rst | 36 +++++++++++++++++++ .../zh_CN/api-reference/peripherals/index.rst | 1 + docs/zh_CN/api-reference/peripherals/lcd.rst | 1 + 5 files changed, 45 insertions(+) create mode 100644 docs/en/api-reference/peripherals/lcd.rst create mode 100644 docs/zh_CN/api-reference/peripherals/lcd.rst diff --git a/docs/doxygen/Doxyfile b/docs/doxygen/Doxyfile index 42781bcdf9..eddd22236d 100644 --- a/docs/doxygen/Doxyfile +++ b/docs/doxygen/Doxyfile @@ -73,6 +73,12 @@ INPUT = \ $(PROJECT_PATH)/components/esp_eth/include/esp_eth_mac.h \ $(PROJECT_PATH)/components/esp_eth/include/esp_eth_phy.h \ $(PROJECT_PATH)/components/esp_eth/include/esp_eth_netif_glue.h \ + $(PROJECT_PATH)/components/esp_lcd/include/esp_lcd_panel_io.h \ + $(PROJECT_PATH)/components/esp_lcd/include/esp_lcd_panel_ops.h \ + $(PROJECT_PATH)/components/esp_lcd/include/esp_lcd_panel_rgb.h \ + $(PROJECT_PATH)/components/esp_lcd/include/esp_lcd_panel_vendor.h \ + $(PROJECT_PATH)/components/esp_lcd/include/esp_lcd_types.h \ + $(PROJECT_PATH)/components/hal/include/hal/lcd_types.h \ $(PROJECT_PATH)/components/hal/include/hal/adc_types.h \ $(PROJECT_PATH)/components/soc/$(IDF_TARGET)/include/soc/adc_channel.h \ $(PROJECT_PATH)/components/driver/include/driver/adc_common.h \ diff --git a/docs/en/api-reference/peripherals/index.rst b/docs/en/api-reference/peripherals/index.rst index 730983ee9d..7f31970323 100644 --- a/docs/en/api-reference/peripherals/index.rst +++ b/docs/en/api-reference/peripherals/index.rst @@ -15,6 +15,7 @@ Peripherals API :SOC_DIG_SIGN_SUPPORTED: ds i2c i2s + lcd ledc :SOC_MCPWM_SUPPORTED: mcpwm :SOC_PCNT_SUPPORTED: pcnt diff --git a/docs/en/api-reference/peripherals/lcd.rst b/docs/en/api-reference/peripherals/lcd.rst new file mode 100644 index 0000000000..09d5160b68 --- /dev/null +++ b/docs/en/api-reference/peripherals/lcd.rst @@ -0,0 +1,36 @@ +LCD +=== + +Introduction +------------ + +ESP chips can generate various kinds of timings that needed by common LCDs on the market, like SPI LCD, I80 LCD (a.k.a Intel 8080 parallel LCD), RGB LCD, I2C LCD, etc. The ``esp_lcd`` component is officially to support those LCDs with a group of universal APIs across chips. + +Functional Overview +------------------- + +In ``esp_lcd``, an LCD panel is represented by :c:type:`esp_lcd_panel_handle_t`, which plays the role of an **abstract frame buffer**, regardless of the frame memory is allocated inside ESP chip or in external LCD controller. Based on the location of the frame buffer, the LCD panel allocation functions are mainly grouped into the following categories: + +- ``RGB LCD panel`` - is simply based on a group of specific synchronous signals indicating where to start and stop a frame. + +- ``Controller based LCD panel`` involves multiple steps to get a panel handle, like bus allocation, IO device registration and controller driver install. + +After we get the LCD handle, the remaining LCD operations are the same for different LCD interfaces and vendors. + +Application Example +------------------- + +LCD examples are located under: :example:`peripherals/lcd`: + +* Jpeg decoding and LCD display - :example:`peripherals/lcd/tjpgd` +* LVGL porting and animation UI - :example:`peripherals/lcd/lvgl` + +API Reference +------------- + +.. include-build-file:: inc/lcd_types.inc +.. include-build-file:: inc/esp_lcd_types.inc +.. include-build-file:: inc/esp_lcd_panel_io.inc +.. include-build-file:: inc/esp_lcd_panel_ops.inc +.. include-build-file:: inc/esp_lcd_panel_rgb.inc +.. include-build-file:: inc/esp_lcd_panel_vendor.inc diff --git a/docs/zh_CN/api-reference/peripherals/index.rst b/docs/zh_CN/api-reference/peripherals/index.rst index 3089a2a45e..54ac56de2e 100644 --- a/docs/zh_CN/api-reference/peripherals/index.rst +++ b/docs/zh_CN/api-reference/peripherals/index.rst @@ -15,6 +15,7 @@ :SOC_DIG_SIGN_SUPPORTED: ds i2c i2s + lcd ledc :SOC_MCPWM_SUPPORTED: mcpwm :SOC_PCNT_SUPPORTED: pcnt diff --git a/docs/zh_CN/api-reference/peripherals/lcd.rst b/docs/zh_CN/api-reference/peripherals/lcd.rst new file mode 100644 index 0000000000..88fae23152 --- /dev/null +++ b/docs/zh_CN/api-reference/peripherals/lcd.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/peripherals/lcd.rst From e09e39c94f7bf724310bc0d4f64dd21d3d16bcf2 Mon Sep 17 00:00:00 2001 From: morris Date: Mon, 27 Sep 2021 11:32:29 +0800 Subject: [PATCH 2/2] lcd: unify callback prototype --- components/esp_lcd/include/esp_lcd_panel_io.h | 28 +++++++--- .../esp_lcd/include/esp_lcd_panel_rgb.h | 51 ++++++++++++++++++- components/esp_lcd/src/esp_lcd_panel_io_i2c.c | 10 ++-- components/esp_lcd/src/esp_lcd_panel_io_i2s.c | 16 +++--- components/esp_lcd/src/esp_lcd_panel_io_i80.c | 16 +++--- components/esp_lcd/src/esp_lcd_panel_io_spi.c | 10 ++-- components/esp_lcd/src/esp_lcd_rgb_panel.c | 8 +-- components/esp_lcd/test/test_i2c_lcd_panel.c | 6 +-- components/esp_lcd/test/test_i80_lcd_panel.c | 8 +-- components/esp_lcd/test/test_rgb_panel.c | 6 +-- components/esp_lcd/test/test_spi_lcd_panel.c | 10 ++-- components/hal/esp32s3/include/hal/lcd_ll.h | 30 ++++++----- components/hal/include/hal/lcd_hal.h | 24 ++------- components/hal/include/hal/lcd_types.h | 33 ++++-------- components/hal/lcd_hal.c | 18 ++----- components/soc/esp32/lcd_periph.c | 18 ++----- components/soc/esp32s2/lcd_periph.c | 18 ++----- .../soc/esp32s3/include/soc/lcd_cam_reg.h | 15 ++---- .../soc/esp32s3/include/soc/lcd_cam_struct.h | 15 ++---- components/soc/esp32s3/lcd_periph.c | 18 ++----- components/soc/include/soc/lcd_periph.h | 18 ++----- examples/peripherals/lcd/lvgl/CMakeLists.txt | 2 +- .../peripherals/lcd/lvgl/main/lvgl_demo_ui.c | 35 ++++++++----- .../lcd/lvgl/main/lvgl_example_main.c | 19 +++---- tools/ci/check_copyright_ignore.txt | 10 ---- 25 files changed, 210 insertions(+), 232 deletions(-) diff --git a/components/esp_lcd/include/esp_lcd_panel_io.h b/components/esp_lcd/include/esp_lcd_panel_io.h index eebcabf42b..330f4d9a16 100644 --- a/components/esp_lcd/include/esp_lcd_panel_io.h +++ b/components/esp_lcd/include/esp_lcd_panel_io.h @@ -65,6 +65,22 @@ esp_err_t esp_lcd_panel_io_tx_color(esp_lcd_panel_io_handle_t io, int lcd_cmd, c */ esp_err_t esp_lcd_panel_io_del(esp_lcd_panel_io_handle_t io); +/** + * @brief Type of LCD panel IO event data + */ +typedef struct { +} esp_lcd_panel_io_event_data_t; + +/** + * @brief Declare the prototype of the function that will be invoked when panel IO finishes transferring color data + * + * @param[in] panel_io LCD panel IO handle, which is created by factory API like `esp_lcd_new_panel_io_spi()` + * @param[in] edata Panel IO event data, fed by driver + * @param[in] user_ctx User data, passed from `esp_lcd_panel_io_xxx_config_t` + * @return Whether a high priority task has been waken up by this function + */ +typedef bool (*esp_lcd_panel_io_color_trans_done_cb_t)(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx); + /** * @brief Panel IO configuration structure, for SPI interface */ @@ -74,8 +90,8 @@ typedef struct { int spi_mode; /*!< Traditional SPI mode (0~3) */ unsigned int pclk_hz; /*!< Frequency of pixel clock */ size_t trans_queue_depth; /*!< Size of internal transaction queue */ - bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); /*!< Callback, invoked when color data transfer has finished */ - void *user_data; /*!< User private data, passed directly to on_trans_frame_done's user_data */ + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; /*!< Callback invoked when color data transfer has finished */ + void *user_ctx; /*!< User private data, passed directly to on_color_trans_done's user_ctx */ int lcd_cmd_bits; /*!< Bit-width of LCD command */ int lcd_param_bits; /*!< Bit-width of LCD parameter */ struct { @@ -100,8 +116,8 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p typedef struct { uint32_t dev_addr; /*!< I2C device address */ - bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); /*!< Callback, invoked when color data transfer has finished */ - void *user_data; /*!< User private data, passed directly to on_trans_frame_done's user_data */ + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; /*!< Callback invoked when color data transfer has finished */ + void *user_ctx; /*!< User private data, passed directly to on_color_trans_done's user_ctx */ size_t control_phase_bytes; /*!< I2C LCD panel will encode control information (e.g. D/C seclection) into control phase, in several bytes */ unsigned int dc_bit_offset; /*!< Offset of the D/C selection bit in control phase */ int lcd_cmd_bits; /*!< Bit-width of LCD command */ @@ -168,8 +184,8 @@ typedef struct { int cs_gpio_num; /*!< GPIO used for CS line, set to -1 will declaim exclusively use of I80 bus */ unsigned int pclk_hz; /*!< Frequency of pixel clock */ size_t trans_queue_depth; /*!< Transaction queue size, larger queue, higher throughput */ - bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); /*!< Callback, invoked when color data was tranferred done */ - void *user_data; /*!< User private data, passed directly to on_trans_done's user_data */ + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; /*!< Callback invoked when color data was tranferred done */ + void *user_ctx; /*!< User private data, passed directly to on_color_trans_done's user_ctx */ int lcd_cmd_bits; /*!< Bit-width of LCD command */ int lcd_param_bits; /*!< Bit-width of LCD parameter */ struct { diff --git a/components/esp_lcd/include/esp_lcd_panel_rgb.h b/components/esp_lcd/include/esp_lcd_panel_rgb.h index 2ddd2b6b9a..1368bb787f 100644 --- a/components/esp_lcd/include/esp_lcd_panel_rgb.h +++ b/components/esp_lcd/include/esp_lcd_panel_rgb.h @@ -18,6 +18,37 @@ extern "C" { #if SOC_LCD_RGB_SUPPORTED /** * @brief LCD RGB timing structure + * + * Total Width + * <---------------------------------------------------> + * Hsync width HBP Active Width HFP + * <---><--><--------------------------------------><---> + * ____ ____|_______________________________________|____| + * |___| | | | + * | | | + * __| | | | + * /|\ /|\ | | | | + * | VSYNC| | | | | + * |Width\|/ |__ | | | + * | /|\ | | | | + * | VBP | | | | | + * | \|/_____|_________|_______________________________________| | + * | /|\ | | / / / / / / / / / / / / / / / / / / / | | + * | | | |/ / / / / / / / / / / / / / / / / / / /| | + * Total | | | |/ / / / / / / / / / / / / / / / / / / /| | + * Heigh | | | |/ / / / / / / / / / / / / / / / / / / /| | + * |Active| | |/ / / / / / / / / / / / / / / / / / / /| | + * |Heigh | | |/ / / / / / Active Display Area / / / /| | + * | | | |/ / / / / / / / / / / / / / / / / / / /| | + * | | | |/ / / / / / / / / / / / / / / / / / / /| | + * | | | |/ / / / / / / / / / / / / / / / / / / /| | + * | | | |/ / / / / / / / / / / / / / / / / / / /| | + * | | | |/ / / / / / / / / / / / / / / / / / / /| | + * | \|/_____|_________|_______________________________________| | + * | /|\ | | + * | VFP | | | + * \|/ \|/_____|______________________________________________________| + * */ typedef struct { unsigned int pclk_hz; /*!< Frequency of pixel clock */ @@ -38,6 +69,22 @@ typedef struct { } flags; } esp_lcd_rgb_timing_t; +/** + * @brief Type of RGB LCD panel event data + */ +typedef struct { +} esp_lcd_rgb_panel_event_data_t; + +/** + * @brief Declare the prototype of the function that will be invoked when panel IO finishes transferring color data + * + * @param[in] panel LCD panel handle, returned from `esp_lcd_new_rgb_panel` + * @param[in] edata Panel event data, fed by driver + * @param[in] user_ctx User data, passed from `esp_lcd_rgb_panel_config_t` + * @return Whether a high priority task has been waken up by this function + */ +typedef bool (*esp_lcd_rgb_panel_frame_trans_done_cb_t)(esp_lcd_panel_handle_t panel, esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx); + /** * @brief LCD RGB panel configuration structure */ @@ -51,8 +98,8 @@ typedef struct { int pclk_gpio_num; /*!< GPIO used for PCLK signal */ int data_gpio_nums[SOC_LCD_RGB_DATA_WIDTH]; /*!< GPIOs used for data lines */ int disp_gpio_num; /*!< GPIO used for display control signal, set to -1 if it's not used */ - bool (*on_frame_trans_done)(esp_lcd_panel_handle_t panel, void *user_data); /*!< Callback, invoked when one frame buffer has transferred done */ - void *user_data; /*!< User data which would be passed to on_frame_trans_done's user_data */ + esp_lcd_rgb_panel_frame_trans_done_cb_t on_frame_trans_done; /*!< Callback invoked when one frame buffer has transferred done */ + void *user_ctx; /*!< User data which would be passed to on_frame_trans_done's user_ctx */ struct { unsigned int disp_active_low: 1; /*!< If this flag is enabled, a low level of display control signal can turn the screen on; vice versa */ unsigned int relax_on_idle: 1; /*!< If this flag is enabled, the host won't refresh the LCD if nothing changed in host's frame buffer (this is usefull for LCD with built-in GRAM) */ diff --git a/components/esp_lcd/src/esp_lcd_panel_io_i2c.c b/components/esp_lcd/src/esp_lcd_panel_io_i2c.c index 037fddedee..30900ed105 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_i2c.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_i2c.c @@ -33,9 +33,9 @@ typedef struct { int lcd_param_bits; // Bit width of LCD parameter uint32_t control_phase_cmd; // control byte when transferring command uint32_t control_phase_data; // control byte when transferring data - bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); // User register's callback, invoked when color data trans done - void *user_data; // User's private data, passed directly to callback on_color_trans_done() - uint8_t cmdlink_buffer[]; // pre-alloc I2C command link buffer, to be reused in all transactions + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; // User register's callback, invoked when color data trans done + void *user_ctx; // User's private data, passed directly to callback on_color_trans_done() + uint8_t cmdlink_buffer[]; // pre-alloc I2C command link buffer, to be reused in all transactions } lcd_panel_io_i2c_t; esp_err_t esp_lcd_new_panel_io_i2c(esp_lcd_i2c_bus_handle_t bus, const esp_lcd_panel_io_i2c_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io) @@ -51,9 +51,9 @@ esp_err_t esp_lcd_new_panel_io_i2c(esp_lcd_i2c_bus_handle_t bus, const esp_lcd_p i2c_panel_io->lcd_cmd_bits = io_config->lcd_cmd_bits; i2c_panel_io->lcd_param_bits = io_config->lcd_param_bits; i2c_panel_io->on_color_trans_done = io_config->on_color_trans_done; + i2c_panel_io->user_ctx = io_config->user_ctx; i2c_panel_io->control_phase_data = (!io_config->flags.dc_low_on_data) << (io_config->dc_bit_offset); i2c_panel_io->control_phase_cmd = (io_config->flags.dc_low_on_data) << (io_config->dc_bit_offset); - i2c_panel_io->user_data = io_config->user_data; i2c_panel_io->dev_addr = io_config->dev_addr; i2c_panel_io->base.del = panel_io_i2c_del; i2c_panel_io->base.tx_param = panel_io_i2c_tx_param; @@ -104,7 +104,7 @@ static esp_err_t panel_io_i2c_tx_buffer(esp_lcd_panel_io_t *io, int lcd_cmd, con if (!is_param) { // trans done callback if (i2c_panel_io->on_color_trans_done) { - i2c_panel_io->on_color_trans_done(&(i2c_panel_io->base), i2c_panel_io->user_data, NULL); + i2c_panel_io->on_color_trans_done(&(i2c_panel_io->base), NULL, i2c_panel_io->user_ctx); } } diff --git a/components/esp_lcd/src/esp_lcd_panel_io_i2s.c b/components/esp_lcd/src/esp_lcd_panel_io_i2s.c index cea58f71fa..dcd150e1d7 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_i2s.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_i2s.c @@ -81,8 +81,8 @@ struct lcd_i80_trans_descriptor_t { lcd_panel_io_i80_t *i80_device; // i80 device issuing this transaction const void *data; // Data buffer uint32_t data_length; // Data buffer size - void *cb_user_data; // private data used by trans_done_cb - bool (*trans_done_cb)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); // transaction done callback + esp_lcd_panel_io_color_trans_done_cb_t trans_done_cb; // transaction done callback + void *user_ctx; // private data used by trans_done_cb struct { unsigned int dc_level: 1; // Level of DC line for this transaction } flags; @@ -97,11 +97,11 @@ struct lcd_panel_io_i80_t { QueueHandle_t trans_queue; // Transaction queue, transactions in this queue are pending for scheduler to dispatch QueueHandle_t done_queue; // Transaction done queue, transactions in this queue are finished but not recycled by the caller size_t queue_size; // Size of transaction queue - size_t num_trans_inflight; // Number of transactions that are undergoing (the descriptor not recycled yet) + size_t num_trans_inflight; // Number of transactions that are undergoing (the descriptor not recycled yet) int lcd_cmd_bits; // Bit width of LCD command int lcd_param_bits; // Bit width of LCD parameter - void *cb_user_data; // private data used when transfer color data - bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); // color data trans done callback + void *user_ctx; // private data used when transfer color data + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; // color data trans done callback LIST_ENTRY(lcd_panel_io_i80_t) device_list_entry; // Entry of i80 device list struct { unsigned int dc_cmd_level: 1; // Level of DC line in CMD phase @@ -274,7 +274,7 @@ esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_p i80_device->dc_levels.dc_data_level = io_config->dc_levels.dc_data_level; i80_device->cs_gpio_num = io_config->cs_gpio_num; i80_device->on_color_trans_done = io_config->on_color_trans_done; - i80_device->cb_user_data = io_config->user_data; + i80_device->user_ctx = io_config->user_ctx; i80_device->flags.cs_active_high = io_config->flags.cs_active_high; i80_device->flags.swap_color_bytes = io_config->flags.swap_color_bytes; i80_device->flags.pclk_idle_low = io_config->flags.pclk_idle_low; @@ -557,7 +557,7 @@ static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, cons // sending LCD color data to queue trans_desc->trans_done_cb = next_device->on_color_trans_done; - trans_desc->cb_user_data = next_device->cb_user_data; + trans_desc->user_ctx = next_device->user_ctx; trans_desc->flags.dc_level = next_device->dc_levels.dc_data_level; // DC level for data transaction i2s_lcd_prepare_color_buffer(trans_desc, color, color_size); // send transaction to trans_queue @@ -697,7 +697,7 @@ static IRAM_ATTR void lcd_default_isr_handler(void *args) } // device callback if (trans_desc->trans_done_cb) { - if (trans_desc->trans_done_cb(&cur_device->base, trans_desc->cb_user_data, NULL)) { + if (trans_desc->trans_done_cb(&cur_device->base, NULL, trans_desc->user_ctx)) { need_yield = true; } } diff --git a/components/esp_lcd/src/esp_lcd_panel_io_i80.c b/components/esp_lcd/src/esp_lcd_panel_io_i80.c index 58138fa768..85f1fef228 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_i80.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_i80.c @@ -77,8 +77,8 @@ struct lcd_i80_trans_descriptor_t { uint32_t cmd_cycles; // Command cycles const void *data; // Data buffer uint32_t data_length; // Data buffer size - void *cb_user_data; // private data used by trans_done_cb - bool (*trans_done_cb)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); // transaction done callback + void *user_ctx; // private data used by trans_done_cb + esp_lcd_panel_io_color_trans_done_cb_t trans_done_cb; // transaction done callback }; struct lcd_panel_io_i80_t { @@ -90,11 +90,11 @@ struct lcd_panel_io_i80_t { QueueHandle_t trans_queue; // Transaction queue, transactions in this queue are pending for scheduler to dispatch QueueHandle_t done_queue; // Transaction done queue, transactions in this queue are finished but not recycled by the caller size_t queue_size; // Size of transaction queue - size_t num_trans_inflight; // Number of transactions that are undergoing (the descriptor not recycled yet) + size_t num_trans_inflight; // Number of transactions that are undergoing (the descriptor not recycled yet) int lcd_cmd_bits; // Bit width of LCD command int lcd_param_bits; // Bit width of LCD parameter - void *cb_user_data; // private data used when transfer color data - bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); // color data trans done callback + void *user_ctx; // private data used when transfer color data + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; // color data trans done callback LIST_ENTRY(lcd_panel_io_i80_t) device_list_entry; // Entry of i80 device list struct { unsigned int dc_idle_level: 1; // Level of DC line in IDLE phase @@ -267,7 +267,7 @@ esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_p i80_device->flags.pclk_idle_low = io_config->flags.pclk_idle_low; i80_device->flags.pclk_active_neg = io_config->flags.pclk_active_neg; i80_device->on_color_trans_done = io_config->on_color_trans_done; - i80_device->cb_user_data = io_config->user_data; + i80_device->user_ctx = io_config->user_ctx; // fill panel io function table i80_device->base.del = panel_io_i80_del; i80_device->base.tx_param = panel_io_i80_tx_param; @@ -434,7 +434,7 @@ static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, cons trans_desc->data = color; trans_desc->data_length = color_size; trans_desc->trans_done_cb = i80_device->on_color_trans_done; - trans_desc->cb_user_data = i80_device->cb_user_data; + trans_desc->user_ctx = i80_device->user_ctx; // send transaction to trans_queue xQueueSend(i80_device->trans_queue, &trans_desc, portMAX_DELAY); i80_device->num_trans_inflight++; @@ -591,7 +591,7 @@ IRAM_ATTR static void lcd_default_isr_handler(void *args) } // device callback if (trans_desc->trans_done_cb) { - if (trans_desc->trans_done_cb(&cur_device->base, trans_desc->cb_user_data, NULL)) { + if (trans_desc->trans_done_cb(&cur_device->base, NULL, trans_desc->user_ctx)) { need_yield = true; } } diff --git a/components/esp_lcd/src/esp_lcd_panel_io_spi.c b/components/esp_lcd/src/esp_lcd_panel_io_spi.c index 2c054e2ae2..95791d8654 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_spi.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_spi.c @@ -37,8 +37,8 @@ typedef struct { esp_lcd_panel_io_t base; // Base class of generic lcd panel io spi_device_handle_t spi_dev; // SPI device handle int dc_gpio_num; // D/C line GPIO number - bool (*on_color_trans_done)(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data); // User register's callback, invoked when color data trans done - void *user_data; // User's private data, passed directly to callback on_color_trans_done + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; // User register's callback, invoked when color data trans done + void *user_ctx; // User's private data, passed directly to callback on_color_trans_done size_t queue_size; // Size of transaction queue size_t num_trans_inflight; // Number of transactions that are undergoing (the descriptor not recycled yet) int lcd_cmd_bits; // Bit width of LCD command @@ -62,7 +62,7 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p ESP_GOTO_ON_FALSE(spi_panel_io, ESP_ERR_NO_MEM, err, TAG, "no mem for spi panel io"); spi_device_interface_config_t devcfg = { - .flags = SPI_DEVICE_HALFDUPLEX, + .flags = SPI_DEVICE_HALFDUPLEX, // only use TX path, so half duplex is enough .clock_speed_hz = io_config->pclk_hz, .mode = io_config->spi_mode, .spics_io_num = io_config->cs_gpio_num, @@ -87,9 +87,9 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p spi_panel_io->flags.dc_data_level = !io_config->flags.dc_low_on_data; spi_panel_io->flags.octal_mode = io_config->flags.octal_mode; spi_panel_io->on_color_trans_done = io_config->on_color_trans_done; + spi_panel_io->user_ctx = io_config->user_ctx; spi_panel_io->lcd_cmd_bits = io_config->lcd_cmd_bits; spi_panel_io->lcd_param_bits = io_config->lcd_param_bits; - spi_panel_io->user_data = io_config->user_data; spi_panel_io->dc_gpio_num = io_config->dc_gpio_num; spi_panel_io->queue_size = io_config->trans_queue_depth; spi_panel_io->base.tx_param = panel_io_spi_tx_param; @@ -271,7 +271,7 @@ static void lcd_spi_post_trans_color_cb(spi_transaction_t *trans) lcd_spi_trans_descriptor_t *lcd_trans = __containerof(trans, lcd_spi_trans_descriptor_t, base); if (lcd_trans->flags.trans_is_color) { if (spi_panel_io->on_color_trans_done) { - spi_panel_io->on_color_trans_done(&spi_panel_io->base, spi_panel_io->user_data, NULL); + spi_panel_io->on_color_trans_done(&spi_panel_io->base, NULL, spi_panel_io->user_ctx); } } } diff --git a/components/esp_lcd/src/esp_lcd_rgb_panel.c b/components/esp_lcd/src/esp_lcd_rgb_panel.c index 3145ec5afe..cefcdef23e 100644 --- a/components/esp_lcd/src/esp_lcd_rgb_panel.c +++ b/components/esp_lcd/src/esp_lcd_rgb_panel.c @@ -78,8 +78,8 @@ struct esp_rgb_panel_t { int new_frame_id; // ID for new frame, we use ID to identify whether the frame content has been updated int cur_frame_id; // ID for current transferring frame SemaphoreHandle_t done_sem; // Binary semaphore, indicating if the new frame has been flushed to LCD - bool (*on_frame_trans_done)(esp_lcd_panel_t *panel, void *user_data); // Callback, invoked after frame trans done - void *user_data; // Reserved user's data of callback functions + esp_lcd_rgb_panel_frame_trans_done_cb_t on_frame_trans_done; // Callback, invoked after frame trans done + void *user_ctx; // Reserved user's data of callback functions int x_gap; // Extra gap in x coordinate, it's used when calculate the flush window int y_gap; // Extra gap in y coordinate, it's used when calculate the flush window struct { @@ -164,7 +164,7 @@ esp_err_t esp_lcd_new_rgb_panel(const esp_lcd_rgb_panel_config_t *rgb_panel_conf rgb_panel->disp_gpio_num = rgb_panel_config->disp_gpio_num; rgb_panel->flags.disp_en_level = !rgb_panel_config->flags.disp_active_low; rgb_panel->on_frame_trans_done = rgb_panel_config->on_frame_trans_done; - rgb_panel->user_data = rgb_panel_config->user_data; + rgb_panel->user_ctx = rgb_panel_config->user_ctx; // fill function table rgb_panel->base.del = rgb_panel_del; rgb_panel->base.reset = rgb_panel_reset; @@ -493,7 +493,7 @@ IRAM_ATTR static void lcd_default_isr_handler(void *args) if (intr_status & LCD_LL_EVENT_VSYNC_END) { if (panel->flags.new_frame) { // the finished one is a new frame if (panel->on_frame_trans_done) { - if (panel->on_frame_trans_done(&panel->base, panel->user_data)) { + if (panel->on_frame_trans_done(&panel->base, NULL, panel->user_ctx)) { need_yield = true; } } diff --git a/components/esp_lcd/test/test_i2c_lcd_panel.c b/components/esp_lcd/test/test_i2c_lcd_panel.c index 204b7eeae4..3705c8a31e 100644 --- a/components/esp_lcd/test/test_i2c_lcd_panel.c +++ b/components/esp_lcd/test/test_i2c_lcd_panel.c @@ -77,9 +77,9 @@ TEST_CASE("lcd panel with i2c interface (ssd1306)", "[lcd]") #if CONFIG_LV_USE_USER_DATA #include "test_lvgl_port.h" #if CONFIG_LV_COLOR_DEPTH_1 -static bool notify_lvgl_ready_to_flush(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data) +static bool notify_lvgl_ready_to_flush(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx) { - lv_disp_t *disp = *(lv_disp_t **)user_data; + lv_disp_t *disp = *(lv_disp_t **)user_ctx; lv_disp_flush_ready(&disp->driver); return false; } @@ -109,7 +109,7 @@ TEST_CASE("lvgl gui with i2c interface (ssd1306)", "[lcd][lvgl][ignore]") .lcd_cmd_bits = 8, // According to SSD1306 datasheet .lcd_param_bits = 8, // According to SSD1306 datasheet .on_color_trans_done = notify_lvgl_ready_to_flush, - .user_data = &disp, + .user_ctx = &disp, }; TEST_ESP_OK(esp_lcd_new_panel_io_i2c((esp_lcd_i2c_bus_handle_t)TEST_I2C_HOST_ID, &io_config, &io_handle)); diff --git a/components/esp_lcd/test/test_i80_lcd_panel.c b/components/esp_lcd/test/test_i80_lcd_panel.c index 8474f82729..738184bb40 100644 --- a/components/esp_lcd/test/test_i80_lcd_panel.c +++ b/components/esp_lcd/test/test_i80_lcd_panel.c @@ -413,9 +413,9 @@ TEST_CASE("lcd panel with i80 interface (st7789, 8bits)", "[lcd]") #if CONFIG_LV_USE_USER_DATA #include "test_lvgl_port.h" -static bool notify_lvgl_ready_to_flush(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data) +static bool notify_lvgl_ready_to_flush(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx) { - lv_disp_t *disp = *(lv_disp_t **)user_data; + lv_disp_t *disp = *(lv_disp_t **)user_ctx; lv_disp_flush_ready(&disp->driver); return false; } @@ -465,7 +465,7 @@ TEST_CASE("lvgl gui with i80 interface (st7789, 8bits)", "[lcd][lvgl][ignore]") .swap_color_bytes = 1, }, .on_color_trans_done = notify_lvgl_ready_to_flush, - .user_data = &disp, + .user_ctx = &disp, .lcd_cmd_bits = 8, .lcd_param_bits = 8, }; @@ -537,7 +537,7 @@ TEST_CASE("lvgl gui with i80 interface (nt35510, 8/16bits)", "[lcd][lvgl][ignore .dc_data_level = 1, }, .on_color_trans_done = notify_lvgl_ready_to_flush, - .user_data = &disp, + .user_ctx = &disp, .lcd_cmd_bits = 16, .lcd_param_bits = 16, }; diff --git a/components/esp_lcd/test/test_rgb_panel.c b/components/esp_lcd/test/test_rgb_panel.c index 36c182ee06..a8852bc6dc 100644 --- a/components/esp_lcd/test/test_rgb_panel.c +++ b/components/esp_lcd/test/test_rgb_panel.c @@ -105,9 +105,9 @@ TEST_CASE("lcd rgb lcd panel", "[lcd]") #if CONFIG_LV_USE_USER_DATA #include "test_lvgl_port.h" -static bool notify_lvgl_ready_to_flush(esp_lcd_panel_handle_t panel, void *user_data) +static bool notify_lvgl_ready_to_flush(esp_lcd_panel_handle_t panel, esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx) { - lv_disp_t *disp = *(lv_disp_t **)user_data; + lv_disp_t *disp = *(lv_disp_t **)user_ctx; lv_disp_flush_ready(&disp->driver); return false; } @@ -157,7 +157,7 @@ TEST_CASE("lvgl gui with rgb interface", "[lcd][lvgl][ignore]") }, .flags.fb_in_psram = 1, .on_frame_trans_done = notify_lvgl_ready_to_flush, - .user_data = &disp, + .user_ctx = &disp, }; TEST_ESP_OK(esp_lcd_new_rgb_panel(&panel_config, &panel_handle)); TEST_ESP_OK(esp_lcd_panel_reset(panel_handle)); diff --git a/components/esp_lcd/test/test_spi_lcd_panel.c b/components/esp_lcd/test/test_spi_lcd_panel.c index 1a46ff1c9b..4a92833e69 100644 --- a/components/esp_lcd/test/test_spi_lcd_panel.c +++ b/components/esp_lcd/test/test_spi_lcd_panel.c @@ -15,9 +15,7 @@ #define TEST_SPI_HOST_ID (1) #define TEST_LCD_PIXEL_CLOCK_HZ (20 * 1000 * 1000) // 20MHz -typedef bool (*trans_done_callback_t)(esp_lcd_panel_io_handle_t, void *, void *); - -static void lcd_initialize_spi(esp_lcd_panel_io_handle_t *io_handle, trans_done_callback_t on_color_trans_done, void *user_data, int cmd_bits, int param_bits, bool oct_mode) +static void lcd_initialize_spi(esp_lcd_panel_io_handle_t *io_handle, esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done, void *user_ctx, int cmd_bits, int param_bits, bool oct_mode) { gpio_config_t bk_gpio_config = { .mode = GPIO_MODE_OUTPUT, @@ -54,7 +52,7 @@ static void lcd_initialize_spi(esp_lcd_panel_io_handle_t *io_handle, trans_done_ .lcd_cmd_bits = cmd_bits, .lcd_param_bits = param_bits, .on_color_trans_done = on_color_trans_done, - .user_data = user_data + .user_ctx = user_ctx }; if (oct_mode) { io_config.flags.octal_mode = 1; @@ -187,9 +185,9 @@ TEST_CASE("lcd panel with 1-line spi interface (st7789)", "[lcd]") #if CONFIG_LV_USE_USER_DATA #include "test_lvgl_port.h" -static bool notify_lvgl_ready_to_flush(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data) +static bool notify_lvgl_ready_to_flush(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx) { - lv_disp_t *disp = *(lv_disp_t **)user_data; + lv_disp_t *disp = *(lv_disp_t **)user_ctx; lv_disp_flush_ready(&disp->driver); return false; } diff --git a/components/hal/esp32s3/include/hal/lcd_ll.h b/components/hal/esp32s3/include/hal/lcd_ll.h index f7c41897d3..045c4c7d17 100644 --- a/components/hal/esp32s3/include/hal/lcd_ll.h +++ b/components/hal/esp32s3/include/hal/lcd_ll.h @@ -1,16 +1,8 @@ -// Copyright 2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include @@ -63,17 +55,20 @@ static inline void lcd_ll_set_group_clock_src(lcd_cam_dev_t *dev, lcd_clock_sour } } +__attribute__((always_inline)) static inline void lcd_ll_set_clock_idle_level(lcd_cam_dev_t *dev, bool level) { dev->lcd_clock.lcd_ck_idle_edge = level; } +__attribute__((always_inline)) static inline void lcd_ll_set_pixel_clock_edge(lcd_cam_dev_t *dev, bool active_on_neg) { dev->lcd_clock.lcd_clk_equ_sysclk = 0; // if we want to pixel_clk == lcd_clk, just make clkcnt = 0 dev->lcd_clock.lcd_ck_out_edge = active_on_neg; } +__attribute__((always_inline)) static inline void lcd_ll_set_pixel_clock_prescale(lcd_cam_dev_t *dev, uint32_t prescale) { // Formula: pixel_clk = lcd_clk / (1 + clkcnt_n) @@ -85,6 +80,7 @@ static inline void lcd_ll_enable_rgb_yuv_convert(lcd_cam_dev_t *dev, bool en) dev->lcd_rgb_yuv.lcd_conv_bypass = en; } +__attribute__((always_inline)) static inline void lcd_ll_set_phase_cycles(lcd_cam_dev_t *dev, uint32_t cmd_cycles, uint32_t dummy_cycles, uint32_t data_cycles) { HAL_ASSERT(cmd_cycles <= 2); @@ -118,6 +114,7 @@ static inline void lcd_ll_enable_output_always_on(lcd_cam_dev_t *dev, bool en) dev->lcd_user.lcd_always_out_en = en; } +__attribute__((always_inline)) static inline void lcd_ll_start(lcd_cam_dev_t *dev) { dev->lcd_user.lcd_update = 1; // update parameters before start transaction @@ -136,17 +133,20 @@ static inline void lcd_ll_reset(lcd_cam_dev_t *dev) dev->lcd_user.lcd_reset = 0; } +__attribute__((always_inline)) static inline void lcd_ll_reverse_data_bit_order(lcd_cam_dev_t *dev, bool en) { // whether to change LCD_DATA_out[N:0] to LCD_DATA_out[0:N] dev->lcd_user.lcd_bit_order = en; } +__attribute__((always_inline)) static inline void lcd_ll_reverse_data_byte_order(lcd_cam_dev_t *dev, bool en) { dev->lcd_user.lcd_byte_order = en; } +__attribute__((always_inline)) static inline void lcd_ll_reverse_data_8bits_order(lcd_cam_dev_t *dev, bool en) { dev->lcd_user.lcd_8bits_order = en; @@ -158,6 +158,7 @@ static inline void lcd_ll_fifo_reset(lcd_cam_dev_t *dev) dev->lcd_misc.lcd_afifo_reset = 0; } +__attribute__((always_inline)) static inline void lcd_ll_set_dc_level(lcd_cam_dev_t *dev, bool idle_phase, bool cmd_phase, bool dummy_phase, bool data_phase) { dev->lcd_misc.lcd_cd_idle_edge = idle_phase; @@ -171,6 +172,7 @@ static inline void lcd_ll_set_dc_delay_ticks(lcd_cam_dev_t *dev, uint32_t delay) dev->lcd_dly_mode.lcd_cd_mode = delay; } +__attribute__((always_inline)) static inline void lcd_ll_set_command(lcd_cam_dev_t *dev, uint32_t data_width, uint32_t command) { // if command phase has two cycles, in the first cycle, command[15:0] is sent out via lcd_data_out[15:0] @@ -250,11 +252,13 @@ static inline void lcd_ll_enable_interrupt(lcd_cam_dev_t *dev, uint32_t mask, bo } } +__attribute__((always_inline)) static inline uint32_t lcd_ll_get_interrupt_status(lcd_cam_dev_t *dev) { return dev->lc_dma_int_st.val & 0x03; } +__attribute__((always_inline)) static inline void lcd_ll_clear_interrupt_status(lcd_cam_dev_t *dev, uint32_t mask) { dev->lc_dma_int_clr.val = mask & 0x03; diff --git a/components/hal/include/hal/lcd_hal.h b/components/hal/include/hal/lcd_hal.h index 76e28dda0e..db255b3d1e 100644 --- a/components/hal/include/hal/lcd_hal.h +++ b/components/hal/include/hal/lcd_hal.h @@ -1,22 +1,8 @@ -// Copyright 2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/******************************************************************************* - * NOTICE - * The HAL is not public api, don't use in application code. - * See readme.md in soc/README.md - ******************************************************************************/ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/components/hal/include/hal/lcd_types.h b/components/hal/include/hal/lcd_types.h index 69dab14801..01e6d0c294 100644 --- a/components/hal/include/hal/lcd_types.h +++ b/components/hal/include/hal/lcd_types.h @@ -1,16 +1,8 @@ -// Copyright 2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once @@ -21,15 +13,12 @@ extern "C" { /** * @brief LCD clock source * @note User should select the clock source based on the real requirement: - * ╔═════════════════════╦══════════════════════════╦════════════════════════════╗ - * ║ LCD clock source ║ Features ║ Power Management ║ - * ╠═════════════════════╬══════════════════════════╬════════════════════════════╣ - * ║ LCD_CLK_SRC_PLL160M ║ High resolution, fixed ║ ESP_PM_APB_FREQ_MAX lock ║ - * ╠═════════════════════╬══════════════════════════╬════════════════════════════╣ - * ║ LCD_CLK_SRC_APLL ║ Configurable resolution ║ ESP_PM_NO_LIGHT_SLEEP lock ║ - * ╠═════════════════════╬══════════════════════════╬════════════════════════════╣ - * ║ LCD_CLK_SRC_XTAL ║ Medium resolution, fixed ║ No PM lock ║ - * ╚═════════════════════╩══════════════════════════╩════════════════════════════╝ + * + * | LCD clock source | Features | Power Management | + * |---------------------|--------------------------|----------------------------| + * | LCD_CLK_SRC_PLL160M | High resolution, fixed | ESP_PM_APB_FREQ_MAX lock | + * | LCD_CLK_SRC_APLL | Configurable resolution | ESP_PM_NO_LIGHT_SLEEP lock | + * | LCD_CLK_SRC_XTAL | Medium resolution, fixed | No PM lock | */ typedef enum { LCD_CLK_SRC_PLL160M, /*!< Select PLL160M as the source clock */ diff --git a/components/hal/lcd_hal.c b/components/hal/lcd_hal.c index f08d67ac1b..60da41f571 100644 --- a/components/hal/lcd_hal.c +++ b/components/hal/lcd_hal.c @@ -1,16 +1,8 @@ -// Copyright 2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "hal/lcd_hal.h" #include "hal/lcd_ll.h" diff --git a/components/soc/esp32/lcd_periph.c b/components/soc/esp32/lcd_periph.c index 4ed419f404..a3bc25a335 100644 --- a/components/soc/esp32/lcd_periph.c +++ b/components/soc/esp32/lcd_periph.c @@ -1,16 +1,8 @@ -// Copyright 2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/soc.h" #include "soc/lcd_periph.h" diff --git a/components/soc/esp32s2/lcd_periph.c b/components/soc/esp32s2/lcd_periph.c index 7ca1157e29..af1d3b8bba 100644 --- a/components/soc/esp32s2/lcd_periph.c +++ b/components/soc/esp32s2/lcd_periph.c @@ -1,16 +1,8 @@ -// Copyright 2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/lcd_periph.h" #include "soc/gpio_sig_map.h" diff --git a/components/soc/esp32s3/include/soc/lcd_cam_reg.h b/components/soc/esp32s3/include/soc/lcd_cam_reg.h index ecb65a13ff..85c5cc0160 100644 --- a/components/soc/esp32s3/include/soc/lcd_cam_reg.h +++ b/components/soc/esp32s3/include/soc/lcd_cam_reg.h @@ -1,16 +1,7 @@ -/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 */ #pragma once diff --git a/components/soc/esp32s3/include/soc/lcd_cam_struct.h b/components/soc/esp32s3/include/soc/lcd_cam_struct.h index 0a78e323cc..7eeec503fc 100644 --- a/components/soc/esp32s3/include/soc/lcd_cam_struct.h +++ b/components/soc/esp32s3/include/soc/lcd_cam_struct.h @@ -1,16 +1,7 @@ -/** Copyright 2021 Espressif Systems (Shanghai) PTE LTD +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * SPDX-License-Identifier: Apache-2.0 */ #pragma once diff --git a/components/soc/esp32s3/lcd_periph.c b/components/soc/esp32s3/lcd_periph.c index f59c4886f5..3d60c5da9e 100644 --- a/components/soc/esp32s3/lcd_periph.c +++ b/components/soc/esp32s3/lcd_periph.c @@ -1,16 +1,8 @@ -// Copyright 2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "soc/lcd_periph.h" #include "soc/gpio_sig_map.h" diff --git a/components/soc/include/soc/lcd_periph.h b/components/soc/include/soc/lcd_periph.h index d7d3ebc68b..7bb7c530cf 100644 --- a/components/soc/include/soc/lcd_periph.h +++ b/components/soc/include/soc/lcd_periph.h @@ -1,16 +1,8 @@ -// Copyright 2021 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once diff --git a/examples/peripherals/lcd/lvgl/CMakeLists.txt b/examples/peripherals/lcd/lvgl/CMakeLists.txt index fb7bd8e958..eb8d60b2df 100644 --- a/examples/peripherals/lcd/lvgl/CMakeLists.txt +++ b/examples/peripherals/lcd/lvgl/CMakeLists.txt @@ -4,6 +4,6 @@ include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(lcd_lvgl) # As the upstream LVGL library has build warnings in esp-idf build system, this is only for temporarily workaround -# Will remove this file when upstream LVGL fixes the warnings in the next release +# Will remove this workaround when upstream LVGL fixes the warnings in the next release idf_component_get_property(lvgl_lib lvgl__lvgl COMPONENT_LIB) target_compile_options(${lvgl_lib} PRIVATE "-Wno-empty-body" "-Wno-strict-prototypes") diff --git a/examples/peripherals/lcd/lvgl/main/lvgl_demo_ui.c b/examples/peripherals/lcd/lvgl/main/lvgl_demo_ui.c index 3939b327ed..2fa619cd67 100644 --- a/examples/peripherals/lcd/lvgl/main/lvgl_demo_ui.c +++ b/examples/peripherals/lcd/lvgl/main/lvgl_demo_ui.c @@ -1,11 +1,8 @@ -/* LCD LVGL UI example - - This example code is in the Public Domain (or CC0 licensed, at your option.) - - Unless required by applicable law or agreed to in writing, this - software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - CONDITIONS OF ANY KIND, either express or implied. -*/ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ #include #include "lvgl.h" @@ -18,6 +15,11 @@ LV_IMG_DECLARE(esp_logo) LV_IMG_DECLARE(esp_text) +typedef struct { + lv_obj_t *scr; + int count_val; +} my_timer_context_t; + static lv_obj_t *arc[3]; static lv_obj_t *img_logo; static lv_obj_t *img_text; @@ -29,8 +31,9 @@ static lv_color_t arc_color[] = { static void anim_timer_cb(lv_timer_t *timer) { - static int32_t count = -90; - lv_obj_t *scr = (lv_obj_t *) timer->user_data; + my_timer_context_t *timer_ctx = (my_timer_context_t *) timer->user_data; + int count = timer_ctx->count_val; + lv_obj_t *scr = timer_ctx->scr; // Play arc animation if (count < 90) { @@ -58,14 +61,16 @@ static void anim_timer_cb(lv_timer_t *timer) // Move images when arc animation finished if ((count >= 100) && (count <= 180)) { lv_coord_t offset = (sinf((count - 140) * 2.25f / 90.0f) + 1) * 20.0f; - lv_obj_align((lv_obj_t *) timer->user_data, LV_ALIGN_CENTER, 0, -offset); + lv_obj_align(img_logo, LV_ALIGN_CENTER, 0, -offset); lv_obj_align(img_text, LV_ALIGN_CENTER, 0, 2 * offset); lv_obj_set_style_img_opa(img_text, offset / 40.0f * 255, 0); } // Delete timer when all animation finished - if (++count >= 180) { + if ((count += 5) == 220) { lv_timer_del(timer); + } else { + timer_ctx->count_val = count; } } @@ -95,5 +100,9 @@ void example_lvgl_demo_ui(lv_obj_t *scr) } // Create timer for animation - lv_timer_create(anim_timer_cb, 20, (void *) scr); + static my_timer_context_t my_tim_ctx = { + .count_val = -90, + }; + my_tim_ctx.scr = scr; + lv_timer_create(anim_timer_cb, 20, &my_tim_ctx); } diff --git a/examples/peripherals/lcd/lvgl/main/lvgl_example_main.c b/examples/peripherals/lcd/lvgl/main/lvgl_example_main.c index d4a091b6fa..0f79aed3b4 100644 --- a/examples/peripherals/lcd/lvgl/main/lvgl_example_main.c +++ b/examples/peripherals/lcd/lvgl/main/lvgl_example_main.c @@ -1,11 +1,8 @@ -/* LCD LVGL porting example - - This example code is in the Public Domain (or CC0 licensed, at your option.) - - Unless required by applicable law or agreed to in writing, this - software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - CONDITIONS OF ANY KIND, either express or implied. -*/ +/* + * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ #include #include "freertos/FreeRTOS.h" @@ -52,9 +49,9 @@ static const char *TAG = "example"; extern void example_lvgl_demo_ui(lv_obj_t *scr); -static bool example_notify_lvgl_flush_ready(esp_lcd_panel_io_handle_t panel_io, void *user_data, void *event_data) +static bool example_notify_lvgl_flush_ready(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx) { - lv_disp_drv_t *disp_driver = (lv_disp_drv_t *)user_data; + lv_disp_drv_t *disp_driver = (lv_disp_drv_t *)user_ctx; lv_disp_flush_ready(disp_driver); return false; } @@ -120,7 +117,7 @@ void app_main(void) .dc_data_level = 1, }, .on_color_trans_done = example_notify_lvgl_flush_ready, - .user_data = &disp_drv, + .user_ctx = &disp_drv, .lcd_cmd_bits = EXAMPLE_LCD_CMD_BITS, .lcd_param_bits = EXAMPLE_LCD_PARAM_BITS, }; diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index 167af07dca..105fa093b3 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -1636,7 +1636,6 @@ components/hal/esp32s3/include/hal/gpspi_flash_ll.h components/hal/esp32s3/include/hal/i2c_ll.h components/hal/esp32s3/include/hal/i2s_ll.h components/hal/esp32s3/include/hal/interrupt_controller_ll.h -components/hal/esp32s3/include/hal/lcd_ll.h components/hal/esp32s3/include/hal/ledc_ll.h components/hal/esp32s3/include/hal/mcpwm_ll.h components/hal/esp32s3/include/hal/memprot_ll.h @@ -1693,8 +1692,6 @@ components/hal/include/hal/i2s_hal.h components/hal/include/hal/i2s_types.h components/hal/include/hal/interrupt_controller_hal.h components/hal/include/hal/interrupt_controller_types.h -components/hal/include/hal/lcd_hal.h -components/hal/include/hal/lcd_types.h components/hal/include/hal/ledc_hal.h components/hal/include/hal/ledc_types.h components/hal/include/hal/mcpwm_hal.h @@ -1742,7 +1739,6 @@ components/hal/include/hal/usbh_ll.h components/hal/include/hal/wdt_hal.h components/hal/include/hal/wdt_types.h components/hal/interrupt_controller_hal.c -components/hal/lcd_hal.c components/hal/ledc_hal.c components/hal/ledc_hal_iram.c components/hal/mcpwm_hal.c @@ -2303,7 +2299,6 @@ components/soc/esp32/include/soc/uhci_reg.h components/soc/esp32/include/soc/uhci_struct.h components/soc/esp32/include/soc/wdev_reg.h components/soc/esp32/interrupts.c -components/soc/esp32/lcd_periph.c components/soc/esp32/ledc_periph.c components/soc/esp32/mcpwm_periph.c components/soc/esp32/pcnt_periph.c @@ -2587,7 +2582,6 @@ components/soc/esp32s2/include/soc/usb_wrap_struct.h components/soc/esp32s2/include/soc/usbh_struct.h components/soc/esp32s2/include/soc/wdev_reg.h components/soc/esp32s2/interrupts.c -components/soc/esp32s2/lcd_periph.c components/soc/esp32s2/ledc_periph.c components/soc/esp32s2/pcnt_periph.c components/soc/esp32s2/rmt_periph.c @@ -2651,8 +2645,6 @@ components/soc/esp32s3/include/soc/interrupt_core1_struct.h components/soc/esp32s3/include/soc/interrupt_reg.h components/soc/esp32s3/include/soc/interrupt_struct.h components/soc/esp32s3/include/soc/io_mux_reg.h -components/soc/esp32s3/include/soc/lcd_cam_reg.h -components/soc/esp32s3/include/soc/lcd_cam_struct.h components/soc/esp32s3/include/soc/ledc_caps.h components/soc/esp32s3/include/soc/ledc_reg.h components/soc/esp32s3/include/soc/ledc_struct.h @@ -2731,7 +2723,6 @@ components/soc/esp32s3/include/soc/wdev_reg.h components/soc/esp32s3/include/soc/world_controller_reg.h components/soc/esp32s3/include/soc/world_controller_struct.h components/soc/esp32s3/interrupts.c -components/soc/esp32s3/lcd_periph.c components/soc/esp32s3/ledc_periph.c components/soc/esp32s3/mcpwm_periph.c components/soc/esp32s3/pcnt_periph.c @@ -2757,7 +2748,6 @@ components/soc/include/soc/hwcrypto_periph.h components/soc/include/soc/i2c_periph.h components/soc/include/soc/i2s_periph.h components/soc/include/soc/interrupts.h -components/soc/include/soc/lcd_periph.h components/soc/include/soc/ledc_periph.h components/soc/include/soc/lldesc.h components/soc/include/soc/mcpwm_periph.h