Skip to content

Commit f01fa83

Browse files
committed
updates RGB bus
1 parent ebd3e6b commit f01fa83

File tree

5 files changed

+100
-27
lines changed

5 files changed

+100
-27
lines changed

api_drivers/common_api_drivers/display/rgb_display.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import display_driver_framework
2-
2+
import lvgl as lv
33

44
STATE_HIGH = display_driver_framework.STATE_HIGH
55
STATE_LOW = display_driver_framework.STATE_LOW
@@ -11,6 +11,51 @@
1111

1212
class RGBDisplay(display_driver_framework.DisplayDriver):
1313

14+
def __init__(
15+
self,
16+
data_bus,
17+
display_width,
18+
display_height,
19+
frame_buffer1=None,
20+
frame_buffer2=None,
21+
reset_pin=None,
22+
reset_state=STATE_HIGH,
23+
power_pin=None,
24+
power_on_state=STATE_HIGH,
25+
backlight_pin=None,
26+
backlight_on_state=STATE_HIGH,
27+
offset_x=0,
28+
offset_y=0,
29+
color_byte_order=BYTE_ORDER_RGB,
30+
color_space=lv.COLOR_FORMAT.RGB888,
31+
rgb565_byte_swap=False
32+
):
33+
34+
super().__init__(
35+
data_bus=data_bus,
36+
display_width=display_width,
37+
display_height=display_height,
38+
frame_buffer1=frame_buffer1,
39+
frame_buffer2=frame_buffer2,
40+
reset_pin=reset_pin,
41+
reset_state=reset_state,
42+
power_pin=power_pin,
43+
power_on_state=power_on_state,
44+
backlight_pin=backlight_pin,
45+
backlight_on_state=backlight_on_state,
46+
offset_x=offset_x,
47+
offset_y=offset_y,
48+
color_byte_order=color_byte_order,
49+
color_space=color_space,
50+
rgb565_byte_swap=rgb565_byte_swap
51+
)
52+
53+
self._disp_drv.set_flush_wait_cb(self.__sync_cb)
54+
55+
def __sync_cb(self, *_):
56+
self._data_bus.wait_for_sync()
57+
self._disp_drv.flush_ready()
58+
1459
def _dummy_set_memory_location(self, *_, **__):
1560
return 0x00
1661

ext_mod/lcd_bus/common_src/spi_bus.c

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

233233
CS_OFF();
234234
return LCD_OK;
235-
236235
}
237236

238237

ext_mod/lcd_bus/esp32_include/rgb_bus.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@
1010
// esp-idf includes
1111
#include "esp_lcd_panel_io.h"
1212
#include "esp_lcd_panel_rgb.h"
13+
#include "freertos/FreeRTOS.h"
14+
#include "freertos/task.h"
1315

1416
// micropython includes
1517
#include "mphalport.h"
1618
#include "py/obj.h"
1719
#include "py/objarray.h"
1820
#include "soc/soc_caps.h"
1921

20-
2122
typedef struct _mp_lcd_rgb_bus_obj_t {
2223
mp_obj_base_t base;
2324

@@ -39,6 +40,9 @@
3940
uint32_t buffer_size;
4041
mp_obj_array_t *view1;
4142
mp_obj_array_t *view2;
43+
TaskHandle_t xTaskToNotify;
44+
uint8_t current_buffer_index;
45+
4246
} mp_lcd_rgb_bus_obj_t;
4347

4448

ext_mod/lcd_bus/esp32_src/rgb_bus.c

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
#include "esp_pm.h"
1313
#include "esp_intr_alloc.h"
1414
#include "esp_heap_caps.h"
15-
15+
#include "freertos/FreeRTOS.h"
16+
#include "freertos/task.h"
1617
#include "esp_lcd_panel_io.h"
1718
#include "esp_lcd_panel_ops.h"
1819
#include "esp_lcd_panel_interface.h"
@@ -44,19 +45,34 @@
4445
esp_pm_lock_handle_t pm_lock; // Power management lock
4546
size_t num_dma_nodes; // Number of DMA descriptors that used to carry the frame buffer
4647
uint8_t *fbs[3]; // Frame buffers
48+
uint8_t cur_fb_index; // Current frame buffer index
49+
uint8_t bb_fb_index; // Current frame buffer index which used by bounce buffer
4750
} rgb_panel_t;
4851

49-
bool rgb_bus_trans_done_cb(esp_lcd_panel_handle_t panel_io, const esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx)
52+
53+
IRAM_ATTR static bool rgb_bus_trans_done_cb(esp_lcd_panel_handle_t panel, const esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx)
5054
{
55+
LCD_UNUSED(panel);
56+
LCD_UNUSED(edata);
57+
5158
mp_lcd_rgb_bus_obj_t *self = (mp_lcd_rgb_bus_obj_t *)user_ctx;
59+
BaseType_t need_yield = pdFALSE;
5260

53-
if (self->callback != mp_const_none && mp_obj_is_callable(self->callback)) {
54-
cb_isr(self->callback);
55-
}
56-
self->trans_done = true;
57-
return false;
61+
// Notify that the current RGB frame buffer has been transmitted
62+
vTaskNotifyGiveIndexedFromISR(self->xTaskToNotify, 7, &need_yield);
63+
return (need_yield == pdTRUE);
5864
}
5965

66+
mp_obj_t mp_lcd_bus_wait_for_sync(mp_obj_t obj)
67+
{
68+
mp_lcd_rgb_bus_obj_t *self = (mp_lcd_rgb_bus_obj_t *)obj;
69+
ulTaskNotifyValueClearIndexed(self->xTaskToNotify, 7, ULONG_MAX);
70+
ulTaskNotifyTakeIndexed(7, pdTRUE, portMAX_DELAY);
71+
return mp_const_none;
72+
}
73+
74+
MP_DEFINE_CONST_FUN_OBJ_1(mp_lcd_bus_wait_for_sync_obj, mp_lcd_bus_wait_for_sync);
75+
6076
esp_lcd_rgb_panel_event_callbacks_t callbacks = { .on_vsync = rgb_bus_trans_done_cb };
6177

6278
mp_lcd_err_t rgb_del(mp_obj_t obj);
@@ -154,6 +170,7 @@
154170
self->base.type = &mp_lcd_rgb_bus_type;
155171

156172
self->callback = mp_const_none;
173+
self->xTaskToNotify = xTaskGetCurrentTaskHandle();
157174

158175
self->bus_config.pclk_hz = (uint32_t)args[ARG_freq].u_int;
159176
self->bus_config.hsync_pulse_width = (uint32_t)args[ARG_hsync_pulse_width].u_int;
@@ -441,6 +458,12 @@
441458
{
442459
mp_lcd_rgb_bus_obj_t *self = (mp_lcd_rgb_bus_obj_t *)obj;
443460

461+
if (self->view1->items == color) {
462+
self->current_buffer_index = 0;
463+
} else {
464+
self->current_buffer_index = 1;
465+
}
466+
444467
esp_err_t ret = esp_lcd_panel_draw_bitmap(
445468
self->panel_handle,
446469
x_start,
@@ -455,30 +478,32 @@
455478
return LCD_OK;
456479
}
457480

458-
/*
459-
if (self->callback != mp_const_none && mp_obj_is_callable(self->callback)) {
460-
mp_call_function_n_kw(self->callback, 0, 0, NULL);
461-
}
462-
*/
463-
464-
if (!self->panel_io_config.flags.double_fb) {
465-
if (self->callback != mp_const_none && mp_obj_is_callable(self->callback)) {
466-
mp_call_function_n_kw(self->callback, 0, 0, NULL);
467-
}
468-
} else if (self->callback == mp_const_none) {
469-
while (!self->trans_done) {}
470-
self->trans_done = false;
471-
}
472-
473481
return LCD_OK;
474482
}
475483

484+
485+
STATIC const mp_rom_map_elem_t mp_lcd_rgb_bus_locals_dict_table[] = {
486+
{ MP_ROM_QSTR(MP_QSTR_wait_for_sync), MP_ROM_PTR(&mp_lcd_bus_wait_for_sync_obj) },
487+
{ MP_ROM_QSTR(MP_QSTR_get_lane_count), MP_ROM_PTR(&mp_lcd_bus_get_lane_count_obj) },
488+
{ MP_ROM_QSTR(MP_QSTR_allocate_framebuffer), MP_ROM_PTR(&mp_lcd_bus_allocate_framebuffer_obj) },
489+
{ MP_ROM_QSTR(MP_QSTR_free_framebuffer), MP_ROM_PTR(&mp_lcd_bus_free_framebuffer_obj) },
490+
{ MP_ROM_QSTR(MP_QSTR_register_callback), MP_ROM_PTR(&mp_lcd_bus_register_callback_obj) },
491+
{ MP_ROM_QSTR(MP_QSTR_tx_param), MP_ROM_PTR(&mp_lcd_bus_tx_param_obj) },
492+
{ MP_ROM_QSTR(MP_QSTR_tx_color), MP_ROM_PTR(&mp_lcd_bus_tx_color_obj) },
493+
{ MP_ROM_QSTR(MP_QSTR_rx_param), MP_ROM_PTR(&mp_lcd_bus_rx_param_obj) },
494+
{ MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&mp_lcd_bus_init_obj) },
495+
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&mp_lcd_bus_deinit_obj) },
496+
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_lcd_bus_deinit_obj) }
497+
};
498+
499+
MP_DEFINE_CONST_DICT(mp_lcd_rgb_bus_locals_dict, mp_lcd_rgb_bus_locals_dict_table);
500+
476501
MP_DEFINE_CONST_OBJ_TYPE(
477502
mp_lcd_rgb_bus_type,
478503
MP_QSTR_RGBBus,
479504
MP_TYPE_FLAG_NONE,
480505
make_new, mp_lcd_rgb_bus_make_new,
481-
locals_dict, (mp_obj_dict_t *)&mp_lcd_bus_locals_dict
506+
locals_dict, (mp_obj_dict_t *)&mp_lcd_rgb_bus_locals_dict
482507
);
483508
#else
484509
#include "../common_src/rgb_bus.c"

ext_mod/lcd_bus/modlcd_bus.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ mp_obj_t mp_lcd_bus_register_callback(size_t n_args, const mp_obj_t *pos_args, m
242242
MP_DEFINE_CONST_FUN_OBJ_KW(mp_lcd_bus_register_callback_obj, 2, mp_lcd_bus_register_callback);
243243

244244

245-
STATIC const mp_rom_map_elem_t mp_lcd_bus_locals_dict_table[10] = {
245+
STATIC const mp_rom_map_elem_t mp_lcd_bus_locals_dict_table[] = {
246246
{ MP_ROM_QSTR(MP_QSTR_get_lane_count), MP_ROM_PTR(&mp_lcd_bus_get_lane_count_obj) },
247247
{ MP_ROM_QSTR(MP_QSTR_allocate_framebuffer), MP_ROM_PTR(&mp_lcd_bus_allocate_framebuffer_obj) },
248248
{ MP_ROM_QSTR(MP_QSTR_free_framebuffer), MP_ROM_PTR(&mp_lcd_bus_free_framebuffer_obj) },

0 commit comments

Comments
 (0)