|
12 | 12 | #include "esp_pm.h"
|
13 | 13 | #include "esp_intr_alloc.h"
|
14 | 14 | #include "esp_heap_caps.h"
|
15 |
| - |
| 15 | + #include "freertos/FreeRTOS.h" |
| 16 | + #include "freertos/task.h" |
16 | 17 | #include "esp_lcd_panel_io.h"
|
17 | 18 | #include "esp_lcd_panel_ops.h"
|
18 | 19 | #include "esp_lcd_panel_interface.h"
|
|
44 | 45 | esp_pm_lock_handle_t pm_lock; // Power management lock
|
45 | 46 | size_t num_dma_nodes; // Number of DMA descriptors that used to carry the frame buffer
|
46 | 47 | 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 |
47 | 50 | } rgb_panel_t;
|
48 | 51 |
|
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) |
50 | 54 | {
|
| 55 | + LCD_UNUSED(panel); |
| 56 | + LCD_UNUSED(edata); |
| 57 | + |
51 | 58 | mp_lcd_rgb_bus_obj_t *self = (mp_lcd_rgb_bus_obj_t *)user_ctx;
|
| 59 | + BaseType_t need_yield = pdFALSE; |
52 | 60 |
|
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); |
58 | 64 | }
|
59 | 65 |
|
| 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 | + |
60 | 76 | esp_lcd_rgb_panel_event_callbacks_t callbacks = { .on_vsync = rgb_bus_trans_done_cb };
|
61 | 77 |
|
62 | 78 | mp_lcd_err_t rgb_del(mp_obj_t obj);
|
|
154 | 170 | self->base.type = &mp_lcd_rgb_bus_type;
|
155 | 171 |
|
156 | 172 | self->callback = mp_const_none;
|
| 173 | + self->xTaskToNotify = xTaskGetCurrentTaskHandle(); |
157 | 174 |
|
158 | 175 | self->bus_config.pclk_hz = (uint32_t)args[ARG_freq].u_int;
|
159 | 176 | self->bus_config.hsync_pulse_width = (uint32_t)args[ARG_hsync_pulse_width].u_int;
|
|
441 | 458 | {
|
442 | 459 | mp_lcd_rgb_bus_obj_t *self = (mp_lcd_rgb_bus_obj_t *)obj;
|
443 | 460 |
|
| 461 | + if (self->view1->items == color) { |
| 462 | + self->current_buffer_index = 0; |
| 463 | + } else { |
| 464 | + self->current_buffer_index = 1; |
| 465 | + } |
| 466 | + |
444 | 467 | esp_err_t ret = esp_lcd_panel_draw_bitmap(
|
445 | 468 | self->panel_handle,
|
446 | 469 | x_start,
|
|
455 | 478 | return LCD_OK;
|
456 | 479 | }
|
457 | 480 |
|
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 |
| - |
473 | 481 | return LCD_OK;
|
474 | 482 | }
|
475 | 483 |
|
| 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 | + |
476 | 501 | MP_DEFINE_CONST_OBJ_TYPE(
|
477 | 502 | mp_lcd_rgb_bus_type,
|
478 | 503 | MP_QSTR_RGBBus,
|
479 | 504 | MP_TYPE_FLAG_NONE,
|
480 | 505 | 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 |
482 | 507 | );
|
483 | 508 | #else
|
484 | 509 | #include "../common_src/rgb_bus.c"
|
|
0 commit comments