Skip to content

Commit ed26b01

Browse files
committed
Merge branch 'feature/esp_lcd_register_io_callback' into 'master'
esp_lcd: Add function for register on color done callback. Closes IDF-6196 See merge request espressif/esp-idf!20968
2 parents acedae1 + 747c599 commit ed26b01

7 files changed

+117
-13
lines changed

components/esp_lcd/include/esp_lcd_panel_io.h

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,30 @@ typedef void *esp_lcd_spi_bus_handle_t; /*!< Type of LCD S
1919
typedef void *esp_lcd_i2c_bus_handle_t; /*!< Type of LCD I2C bus handle */
2020
typedef struct esp_lcd_i80_bus_t *esp_lcd_i80_bus_handle_t; /*!< Type of LCD intel 8080 bus handle */
2121

22+
/**
23+
* @brief Type of LCD panel IO event data
24+
*/
25+
typedef struct {
26+
} esp_lcd_panel_io_event_data_t;
27+
28+
/**
29+
* @brief Declare the prototype of the function that will be invoked when panel IO finishes transferring color data
30+
*
31+
* @param[in] panel_io LCD panel IO handle, which is created by factory API like `esp_lcd_new_panel_io_spi()`
32+
* @param[in] edata Panel IO event data, fed by driver
33+
* @param[in] user_ctx User data, passed from `esp_lcd_panel_io_xxx_config_t`
34+
* @return Whether a high priority task has been waken up by this function
35+
*/
36+
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);
37+
38+
/**
39+
* @brief Type of LCD panel IO callbacks
40+
*/
41+
typedef struct {
42+
esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; /*!< Callback invoked when color data transfer has finished */
43+
} esp_lcd_panel_io_callbacks_t;
44+
45+
2246
/**
2347
* @brief Transmit LCD command and receive corresponding parameters
2448
*
@@ -85,20 +109,16 @@ esp_err_t esp_lcd_panel_io_tx_color(esp_lcd_panel_io_handle_t io, int lcd_cmd, c
85109
esp_err_t esp_lcd_panel_io_del(esp_lcd_panel_io_handle_t io);
86110

87111
/**
88-
* @brief Type of LCD panel IO event data
89-
*/
90-
typedef struct {
91-
} esp_lcd_panel_io_event_data_t;
92-
93-
/**
94-
* @brief Declare the prototype of the function that will be invoked when panel IO finishes transferring color data
112+
* @brief Register LCD panel IO callbacks
95113
*
96-
* @param[in] panel_io LCD panel IO handle, which is created by factory API like `esp_lcd_new_panel_io_spi()`
97-
* @param[in] edata Panel IO event data, fed by driver
98-
* @param[in] user_ctx User data, passed from `esp_lcd_panel_io_xxx_config_t`
99-
* @return Whether a high priority task has been waken up by this function
114+
* @param[in] io LCD panel IO handle, which is created by factory API like `esp_lcd_new_panel_io_spi()`
115+
* @param[in] cbs structure with all LCD panel IO callbacks
116+
* @param[in] user_ctx User private data, passed directly to callback's user_ctx
117+
* @return
118+
* - ESP_ERR_INVALID_ARG if parameter is invalid
119+
* - ESP_OK on success
100120
*/
101-
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);
121+
esp_err_t esp_lcd_panel_io_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx);
102122

103123
/**
104124
* @brief Panel IO configuration structure, for SPI interface

components/esp_lcd/interface/esp_lcd_panel_io_interface.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <stdbool.h>
99
#include "esp_err.h"
10+
#include "esp_lcd_panel_io.h"
1011

1112
#ifdef __cplusplus
1213
extern "C" {
@@ -73,6 +74,18 @@ struct esp_lcd_panel_io_t {
7374
* - ESP_OK on success
7475
*/
7576
esp_err_t (*del)(esp_lcd_panel_io_t *io);
77+
78+
/**
79+
* @brief Register LCD panel IO callbacks
80+
*
81+
* @param[in] io LCD panel IO handle, which is created by factory API like `esp_lcd_new_panel_io_spi()`
82+
* @param[in] cbs structure with all LCD panel IO callbacks
83+
* @param[in] user_ctx User private data, passed directly to callback's user_ctx
84+
* @return
85+
* - ESP_ERR_INVALID_ARG if parameter is invalid
86+
* - ESP_OK on success
87+
*/
88+
esp_err_t (*register_event_callbacks)(esp_lcd_panel_io_t *io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx);
7689
};
7790

7891
#ifdef __cplusplus

components/esp_lcd/src/esp_lcd_panel_io.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,10 @@ esp_err_t esp_lcd_panel_io_del(esp_lcd_panel_io_handle_t io)
3434
ESP_RETURN_ON_FALSE(io, ESP_ERR_INVALID_ARG, TAG, "invalid panel io handle");
3535
return io->del(io);
3636
}
37+
38+
esp_err_t esp_lcd_panel_io_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx)
39+
{
40+
ESP_RETURN_ON_FALSE(io, ESP_ERR_INVALID_ARG, TAG, "invalid panel io handle");
41+
ESP_RETURN_ON_FALSE(cbs, ESP_ERR_INVALID_ARG, TAG, "invalid callbacks structure");
42+
return io->register_event_callbacks(io, cbs, user_ctx);
43+
}

components/esp_lcd/src/esp_lcd_panel_io_i2c.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ static esp_err_t panel_io_i2c_del(esp_lcd_panel_io_t *io);
2929
static esp_err_t panel_io_i2c_rx_param(esp_lcd_panel_io_t *io, int lcd_cmd, void *param, size_t param_size);
3030
static esp_err_t panel_io_i2c_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size);
3131
static esp_err_t panel_io_i2c_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size);
32+
static esp_err_t panel_io_i2c_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx);
3233

3334
typedef struct {
3435
esp_lcd_panel_io_t base; // Base class of generic lcd panel io
@@ -69,6 +70,7 @@ esp_err_t esp_lcd_new_panel_io_i2c(esp_lcd_i2c_bus_handle_t bus, const esp_lcd_p
6970
i2c_panel_io->base.rx_param = panel_io_i2c_rx_param;
7071
i2c_panel_io->base.tx_param = panel_io_i2c_tx_param;
7172
i2c_panel_io->base.tx_color = panel_io_i2c_tx_color;
73+
i2c_panel_io->base.register_event_callbacks = panel_io_i2c_register_event_callbacks;
7274
*ret_io = &(i2c_panel_io->base);
7375
ESP_LOGD(TAG, "new i2c lcd panel io @%p", i2c_panel_io);
7476

@@ -87,6 +89,20 @@ static esp_err_t panel_io_i2c_del(esp_lcd_panel_io_t *io)
8789
return ret;
8890
}
8991

92+
static esp_err_t panel_io_i2c_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx)
93+
{
94+
lcd_panel_io_i2c_t *i2c_panel_io = __containerof(io, lcd_panel_io_i2c_t, base);
95+
96+
if(i2c_panel_io->on_color_trans_done != NULL) {
97+
ESP_LOGW(TAG, "Callback on_color_trans_done was already set and now it was owerwritten!");
98+
}
99+
100+
i2c_panel_io->on_color_trans_done = cbs->on_color_trans_done;
101+
i2c_panel_io->user_ctx = user_ctx;
102+
103+
return ESP_OK;
104+
}
105+
90106
static esp_err_t panel_io_i2c_rx_buffer(esp_lcd_panel_io_t *io, int lcd_cmd, void *buffer, size_t buffer_size)
91107
{
92108
esp_err_t ret = ESP_OK;

components/esp_lcd/src/esp_lcd_panel_io_i2s.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ static esp_err_t i2s_lcd_configure_gpio(esp_lcd_i80_bus_handle_t bus, const esp_
5858
static void i2s_lcd_trigger_quick_trans_done_event(esp_lcd_i80_bus_handle_t bus);
5959
static void lcd_i80_switch_devices(lcd_panel_io_i80_t *cur_device, lcd_panel_io_i80_t *next_device);
6060
static void lcd_default_isr_handler(void *args);
61+
static esp_err_t panel_io_i80_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx);
6162

6263
struct esp_lcd_i80_bus_t {
6364
int bus_id; // Bus ID, index from 0
@@ -295,6 +296,7 @@ esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_p
295296
i80_device->base.del = panel_io_i80_del;
296297
i80_device->base.tx_param = panel_io_i80_tx_param;
297298
i80_device->base.tx_color = panel_io_i80_tx_color;
299+
i80_device->base.register_event_callbacks = panel_io_i80_register_event_callbacks;
298300
if (io_config->cs_gpio_num >= 0) {
299301
// CS signal is controlled by software
300302
gpio_set_level(io_config->cs_gpio_num, !io_config->flags.cs_active_high); // de-assert by default
@@ -342,6 +344,20 @@ static esp_err_t panel_io_i80_del(esp_lcd_panel_io_t *io)
342344
return ESP_OK;
343345
}
344346

347+
static esp_err_t panel_io_i80_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx)
348+
{
349+
lcd_panel_io_i80_t *i80_device = __containerof(io, lcd_panel_io_i80_t, base);
350+
351+
if(i80_device->on_color_trans_done != NULL) {
352+
ESP_LOGW(TAG, "Callback on_color_trans_done was already set and now it was owerwritten!");
353+
}
354+
355+
i80_device->on_color_trans_done = cbs->on_color_trans_done;
356+
i80_device->user_ctx = user_ctx;
357+
358+
return ESP_OK;
359+
}
360+
345361
static void i2s_lcd_prepare_cmd_buffer(lcd_i80_trans_descriptor_t *trans_desc, const void *cmd)
346362
{
347363
lcd_panel_io_i80_t *i80_device = trans_desc->i80_device;

components/esp_lcd/src/esp_lcd_panel_io_i80.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ static esp_err_t lcd_i80_bus_configure_gpio(esp_lcd_i80_bus_handle_t bus, const
5656
static void lcd_i80_switch_devices(lcd_panel_io_i80_t *cur_device, lcd_panel_io_i80_t *next_device);
5757
static void lcd_start_transaction(esp_lcd_i80_bus_t *bus, lcd_i80_trans_descriptor_t *trans_desc);
5858
static void lcd_default_isr_handler(void *args);
59+
static esp_err_t panel_io_i80_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx);
5960

6061
struct esp_lcd_i80_bus_t {
6162
int bus_id; // Bus ID, index from 0
@@ -285,6 +286,7 @@ esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_p
285286
i80_device->base.del = panel_io_i80_del;
286287
i80_device->base.tx_param = panel_io_i80_tx_param;
287288
i80_device->base.tx_color = panel_io_i80_tx_color;
289+
i80_device->base.register_event_callbacks = panel_io_i80_register_event_callbacks;
288290
// we only configure the CS GPIO as output, don't connect to the peripheral signal at the moment
289291
// we will connect the CS GPIO to peripheral signal when switching devices in lcd_i80_switch_devices()
290292
if (io_config->cs_gpio_num >= 0) {
@@ -333,6 +335,20 @@ static esp_err_t panel_io_i80_del(esp_lcd_panel_io_t *io)
333335
return ESP_OK;
334336
}
335337

338+
static esp_err_t panel_io_i80_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx)
339+
{
340+
lcd_panel_io_i80_t *i80_device = __containerof(io, lcd_panel_io_i80_t, base);
341+
342+
if(i80_device->on_color_trans_done != NULL) {
343+
ESP_LOGW(TAG, "Callback on_color_trans_done was already set and now it was owerwritten!");
344+
}
345+
346+
i80_device->on_color_trans_done = cbs->on_color_trans_done;
347+
i80_device->user_ctx = user_ctx;
348+
349+
return ESP_OK;
350+
}
351+
336352
static void i80_lcd_prepare_cmd_buffer(esp_lcd_i80_bus_t *bus, lcd_panel_io_i80_t *i80_device, void *lcd_cmd)
337353
{
338354
uint8_t *from = (uint8_t *)lcd_cmd;

components/esp_lcd/src/esp_lcd_panel_io_spi.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, cons
3232
static esp_err_t panel_io_spi_del(esp_lcd_panel_io_t *io);
3333
static void lcd_spi_pre_trans_cb(spi_transaction_t *trans);
3434
static void lcd_spi_post_trans_color_cb(spi_transaction_t *trans);
35+
static esp_err_t panel_io_spi_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx);
3536

3637
typedef struct {
3738
spi_transaction_t base;
@@ -78,7 +79,7 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p
7879
.spics_io_num = io_config->cs_gpio_num,
7980
.queue_size = io_config->trans_queue_depth,
8081
.pre_cb = lcd_spi_pre_trans_cb, // pre-transaction callback, mainly control DC gpio level
81-
.post_cb = io_config->on_color_trans_done ? lcd_spi_post_trans_color_cb : NULL, // post-transaction, where we invoke user registered "on_color_trans_done()"
82+
.post_cb = lcd_spi_post_trans_color_cb, // post-transaction, where we invoke user registered "on_color_trans_done()"
8283
};
8384
ret = spi_bus_add_device((spi_host_device_t)bus, &devcfg, &spi_panel_io->spi_dev);
8485
ESP_GOTO_ON_ERROR(ret, err, TAG, "adding spi device to bus failed");
@@ -104,6 +105,7 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p
104105
spi_panel_io->base.tx_param = panel_io_spi_tx_param;
105106
spi_panel_io->base.tx_color = panel_io_spi_tx_color;
106107
spi_panel_io->base.del = panel_io_spi_del;
108+
spi_panel_io->base.register_event_callbacks = panel_io_spi_register_event_callbacks;
107109
*ret_io = &(spi_panel_io->base);
108110
ESP_LOGD(TAG, "new spi lcd panel io @%p", spi_panel_io);
109111

@@ -143,6 +145,20 @@ static esp_err_t panel_io_spi_del(esp_lcd_panel_io_t *io)
143145
return ret;
144146
}
145147

148+
static esp_err_t panel_io_spi_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx)
149+
{
150+
esp_lcd_panel_io_spi_t *spi_panel_io = __containerof(io, esp_lcd_panel_io_spi_t, base);
151+
152+
if(spi_panel_io->on_color_trans_done != NULL) {
153+
ESP_LOGW(TAG, "Callback on_color_trans_done was already set and now it was owerwritten!");
154+
}
155+
156+
spi_panel_io->on_color_trans_done = cbs->on_color_trans_done;
157+
spi_panel_io->user_ctx = user_ctx;
158+
159+
return ESP_OK;
160+
}
161+
146162
static void spi_lcd_prepare_cmd_buffer(esp_lcd_panel_io_spi_t *panel_io, const void *cmd)
147163
{
148164
uint8_t *from = (uint8_t *)cmd;

0 commit comments

Comments
 (0)