Skip to content

Commit aa359ae

Browse files
committed
Fixes some bugs in the RGB bus driver
1 parent 968fca8 commit aa359ae

File tree

3 files changed

+144
-120
lines changed

3 files changed

+144
-120
lines changed

ext_mod/lcd_bus/esp32_include/rgb_bus.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
rgb_bus_lock_t copy_lock;
7272
rgb_bus_event_t copy_task_exit;
7373
rgb_bus_event_t last_update;
74-
rgb_bus_event_t partial_copy;
74+
rgb_bus_lock_t tx_color_lock;
7575
rgb_bus_event_t swap_bufs;
7676
rgb_bus_lock_t swap_lock;
7777

ext_mod/lcd_bus/esp32_src/rgb_bus.c

Lines changed: 76 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -216,45 +216,45 @@
216216
self->panel_io_config.data_width = (size_t) i;
217217

218218
#if CONFIG_LCD_ENABLE_DEBUG_LOG
219-
mp_printf("pclk_hz=%lu\n", self->bus_config.pclk_hz);
220-
mp_printf("hsync_pulse_width=%lu\n", self->bus_config.hsync_pulse_width);
221-
mp_printf("hsync_back_porch=%lu\n", self->bus_config.hsync_back_porch);
222-
mp_printf("hsync_front_porch=%lu\n", self->bus_config.hsync_front_porch);
223-
mp_printf("vsync_pulse_width=%lu\n", self->bus_config.vsync_pulse_width);
224-
mp_printf("vsync_back_porch=%lu\n", self->bus_config.vsync_back_porch);
225-
mp_printf("vsync_front_porch=%lu\n", self->bus_config.vsync_front_porch);
226-
mp_printf("hsync_idle_low=%d\n", self->bus_config.flags.hsync_idle_low);
227-
mp_printf("vsync_idle_low=%d\n", self->bus_config.flags.vsync_idle_low);
228-
mp_printf("de_idle_high=%d\n", self->bus_config.flags.de_idle_high);
229-
mp_printf("pclk_active_neg=%d\n", self->bus_config.flags.pclk_active_neg);
230-
mp_printf("pclk_idle_high=%d\n", self->bus_config.flags.pclk_idle_high);
231-
mp_printf("clk_src=%d\n", self->panel_io_config.clk_src);
232-
mp_printf("hsync_gpio_num=%d\n", self->panel_io_config.hsync_gpio_num);
233-
mp_printf("vsync_gpio_num=%d\n", self->panel_io_config.vsync_gpio_num);
234-
mp_printf("de_gpio_num=%d\n", self->panel_io_config.de_gpio_num);
235-
mp_printf("pclk_gpio_num=%d\n", self->panel_io_config.pclk_gpio_num);
236-
mp_printf("data_gpio_nums[0]=%d\n", self->panel_io_config.data_gpio_nums[0]);
237-
mp_printf("data_gpio_nums[1]=%d\n", self->panel_io_config.data_gpio_nums[1]);
238-
mp_printf("data_gpio_nums[2]=%d\n", self->panel_io_config.data_gpio_nums[2]);
239-
mp_printf("data_gpio_nums[3]=%d\n", self->panel_io_config.data_gpio_nums[3]);
240-
mp_printf("data_gpio_nums[4]=%d\n", self->panel_io_config.data_gpio_nums[4]);
241-
mp_printf("data_gpio_nums[5]=%d\n", self->panel_io_config.data_gpio_nums[5]);
242-
mp_printf("data_gpio_nums[6]=%d\n", self->panel_io_config.data_gpio_nums[6]);
243-
mp_printf("data_gpio_nums[7]=%d\n", self->panel_io_config.data_gpio_nums[7]);
244-
mp_printf("data_gpio_nums[8]=%d\n", self->panel_io_config.data_gpio_nums[8]);
245-
mp_printf("data_gpio_nums[9]=%d\n", self->panel_io_config.data_gpio_nums[9]);
246-
mp_printf("data_gpio_nums[10]=%d\n", self->panel_io_config.data_gpio_nums[10]);
247-
mp_printf("data_gpio_nums[11]=%d\n", self->panel_io_config.data_gpio_nums[11]);
248-
mp_printf("data_gpio_nums[12]=%d\n", self->panel_io_config.data_gpio_nums[12]);
249-
mp_printf("data_gpio_nums[13]=%d\n", self->panel_io_config.data_gpio_nums[13]);
250-
mp_printf("data_gpio_nums[14]=%d\n", self->panel_io_config.data_gpio_nums[14]);
251-
mp_printf("data_gpio_nums[15]=%d\n", self->panel_io_config.data_gpio_nums[15]);
252-
mp_printf("sram_trans_align=%d\n", self->panel_io_config.sram_trans_align);
253-
mp_printf("psram_trans_align=%d\n", self->panel_io_config.psram_trans_align);
254-
mp_printf("refresh_on_demand=%d\n", self->panel_io_config.flags.refresh_on_demand);
255-
mp_printf("fb_in_psram=%d\n", self->panel_io_config.flags.fb_in_psram);
256-
mp_printf("double_fb=%d\n", self->panel_io_config.flags.double_fb);
257-
mp_printf("data_width=%d\n", self->panel_io_config.data_width);
219+
mp_printf(&mp_plat_print, "pclk_hz=%lu\n", self->bus_config.pclk_hz);
220+
mp_printf(&mp_plat_print, "hsync_pulse_width=%lu\n", self->bus_config.hsync_pulse_width);
221+
mp_printf(&mp_plat_print, "hsync_back_porch=%lu\n", self->bus_config.hsync_back_porch);
222+
mp_printf(&mp_plat_print, "hsync_front_porch=%lu\n", self->bus_config.hsync_front_porch);
223+
mp_printf(&mp_plat_print, "vsync_pulse_width=%lu\n", self->bus_config.vsync_pulse_width);
224+
mp_printf(&mp_plat_print, "vsync_back_porch=%lu\n", self->bus_config.vsync_back_porch);
225+
mp_printf(&mp_plat_print, "vsync_front_porch=%lu\n", self->bus_config.vsync_front_porch);
226+
mp_printf(&mp_plat_print, "hsync_idle_low=%d\n", self->bus_config.flags.hsync_idle_low);
227+
mp_printf(&mp_plat_print, "vsync_idle_low=%d\n", self->bus_config.flags.vsync_idle_low);
228+
mp_printf(&mp_plat_print, "de_idle_high=%d\n", self->bus_config.flags.de_idle_high);
229+
mp_printf(&mp_plat_print, "pclk_active_neg=%d\n", self->bus_config.flags.pclk_active_neg);
230+
mp_printf(&mp_plat_print, "pclk_idle_high=%d\n", self->bus_config.flags.pclk_idle_high);
231+
mp_printf(&mp_plat_print, "clk_src=%d\n", self->panel_io_config.clk_src);
232+
mp_printf(&mp_plat_print, "hsync_gpio_num=%d\n", self->panel_io_config.hsync_gpio_num);
233+
mp_printf(&mp_plat_print, "vsync_gpio_num=%d\n", self->panel_io_config.vsync_gpio_num);
234+
mp_printf(&mp_plat_print, "de_gpio_num=%d\n", self->panel_io_config.de_gpio_num);
235+
mp_printf(&mp_plat_print, "pclk_gpio_num=%d\n", self->panel_io_config.pclk_gpio_num);
236+
mp_printf(&mp_plat_print, "data_gpio_nums[0]=%d\n", self->panel_io_config.data_gpio_nums[0]);
237+
mp_printf(&mp_plat_print, "data_gpio_nums[1]=%d\n", self->panel_io_config.data_gpio_nums[1]);
238+
mp_printf(&mp_plat_print, "data_gpio_nums[2]=%d\n", self->panel_io_config.data_gpio_nums[2]);
239+
mp_printf(&mp_plat_print, "data_gpio_nums[3]=%d\n", self->panel_io_config.data_gpio_nums[3]);
240+
mp_printf(&mp_plat_print, "data_gpio_nums[4]=%d\n", self->panel_io_config.data_gpio_nums[4]);
241+
mp_printf(&mp_plat_print, "data_gpio_nums[5]=%d\n", self->panel_io_config.data_gpio_nums[5]);
242+
mp_printf(&mp_plat_print, "data_gpio_nums[6]=%d\n", self->panel_io_config.data_gpio_nums[6]);
243+
mp_printf(&mp_plat_print, "data_gpio_nums[7]=%d\n", self->panel_io_config.data_gpio_nums[7]);
244+
mp_printf(&mp_plat_print, "data_gpio_nums[8]=%d\n", self->panel_io_config.data_gpio_nums[8]);
245+
mp_printf(&mp_plat_print, "data_gpio_nums[9]=%d\n", self->panel_io_config.data_gpio_nums[9]);
246+
mp_printf(&mp_plat_print, "data_gpio_nums[10]=%d\n", self->panel_io_config.data_gpio_nums[10]);
247+
mp_printf(&mp_plat_print, "data_gpio_nums[11]=%d\n", self->panel_io_config.data_gpio_nums[11]);
248+
mp_printf(&mp_plat_print, "data_gpio_nums[12]=%d\n", self->panel_io_config.data_gpio_nums[12]);
249+
mp_printf(&mp_plat_print, "data_gpio_nums[13]=%d\n", self->panel_io_config.data_gpio_nums[13]);
250+
mp_printf(&mp_plat_print, "data_gpio_nums[14]=%d\n", self->panel_io_config.data_gpio_nums[14]);
251+
mp_printf(&mp_plat_print, "data_gpio_nums[15]=%d\n", self->panel_io_config.data_gpio_nums[15]);
252+
mp_printf(&mp_plat_print, "sram_trans_align=%d\n", self->panel_io_config.sram_trans_align);
253+
mp_printf(&mp_plat_print, "psram_trans_align=%d\n", self->panel_io_config.psram_trans_align);
254+
mp_printf(&mp_plat_print, "refresh_on_demand=%d\n", self->panel_io_config.flags.refresh_on_demand);
255+
mp_printf(&mp_plat_print, "fb_in_psram=%d\n", self->panel_io_config.flags.fb_in_psram);
256+
mp_printf(&mp_plat_print, "double_fb=%d\n", self->panel_io_config.flags.double_fb);
257+
mp_printf(&mp_plat_print, "data_width=%d\n", self->panel_io_config.data_width);
258258
#endif
259259

260260
self->panel_io_handle.get_lane_count = &rgb_get_lane_count;
@@ -274,10 +274,30 @@
274274
mp_lcd_rgb_bus_obj_t *self = (mp_lcd_rgb_bus_obj_t *)obj;
275275

276276
#if CONFIG_LCD_ENABLE_DEBUG_LOG
277-
mp_printf("rgb_del(self)\n");
277+
mp_printf(&mp_plat_print, "rgb_del(self)\n");
278278
#endif
279279

280+
if (self->view1 != NULL || self->view2 != NULL) {
281+
mp_raise_msg(&mp_type_MemoryError, MP_ERROR_TEXT("Framebuffers have not been released"));
282+
return mp_const_none;
283+
}
284+
285+
rgb_bus_lock_acquire(&self->tx_color_lock, -1);
286+
self->partial_buf = NULL;
287+
rgb_bus_event_set(&self->copy_task_exit);
288+
rgb_bus_lock_release(&self->copy_lock);
289+
rgb_bus_lock_release(&self->tx_color_lock);
290+
280291
mp_lcd_err_t ret = esp_lcd_panel_del(self->panel_handle);
292+
293+
rgb_bus_lock_delete(&self->copy_lock);
294+
rgb_bus_lock_delete(&self->tx_color_lock);
295+
rgb_bus_lock_delete(&self->swap_lock);
296+
297+
rgb_bus_event_delete(&self->swap_bufs);
298+
rgb_bus_event_delete(&self->last_update);
299+
rgb_bus_event_delete(&self->copy_task_exit);
300+
281301
return ret;
282302
}
283303

@@ -287,7 +307,7 @@
287307
LCD_UNUSED(param);
288308

289309
#if CONFIG_LCD_ENABLE_DEBUG_LOG
290-
mp_printf("rgb_rx_param(self, lcd_cmd=%d, param, param_size=%d)\n", lcd_cmd, param_size);
310+
mp_printf(&mp_plat_print, "rgb_rx_param(self, lcd_cmd=%d, param, param_size=%d)\n", lcd_cmd, param_size);
291311
#else
292312
LCD_UNUSED(lcd_cmd);
293313
LCD_UNUSED(param_size);
@@ -302,7 +322,7 @@
302322
LCD_UNUSED(param);
303323

304324
#if CONFIG_LCD_ENABLE_DEBUG_LOG
305-
mp_printf("rgb_tx_param(self, lcd_cmd=%d, param, param_size=%d)\n", lcd_cmd, param_size);
325+
mp_printf(&mp_plat_print, "rgb_tx_param(self, lcd_cmd=%d, param, param_size=%d)\n", lcd_cmd, param_size);
306326
#else
307327
LCD_UNUSED(lcd_cmd);
308328
LCD_UNUSED(param_size);
@@ -327,13 +347,13 @@
327347
heap_caps_free(item_buf);
328348
self->view1 = NULL;
329349
#if CONFIG_LCD_ENABLE_DEBUG_LOG
330-
mp_printf("rgb_free_framebuffer(self, buf=1)\n");
350+
mp_printf(&mp_plat_print, "rgb_free_framebuffer(self, buf=1)\n");
331351
#endif
332352
} else if (array_buf == self->view2) {
333353
heap_caps_free(item_buf);
334354
self->view2 = NULL;
335355
#if CONFIG_LCD_ENABLE_DEBUG_LOG
336-
mp_printf("rgb_free_framebuffer(self, buf=2)\n");
356+
mp_printf(&mp_plat_print, "rgb_free_framebuffer(self, buf=2)\n");
337357
#endif
338358
} else {
339359
mp_raise_msg(&mp_type_MemoryError, MP_ERROR_TEXT("No matching buffer found"));
@@ -344,7 +364,7 @@
344364
mp_obj_t rgb_allocate_framebuffer(mp_obj_t obj, uint32_t size, uint32_t caps)
345365
{
346366
#if CONFIG_LCD_ENABLE_DEBUG_LOG
347-
mp_printf("rgb_allocate_framebuffer(self, size=%lu, caps=%lu)\n", size, caps);
367+
mp_printf(&mp_plat_print, "rgb_allocate_framebuffer(self, size=%lu, caps=%lu)\n", size, caps);
348368
#endif
349369

350370
mp_lcd_rgb_bus_obj_t *self = (mp_lcd_rgb_bus_obj_t *)obj;
@@ -380,7 +400,7 @@
380400
LCD_UNUSED(cmd_bits);
381401
LCD_UNUSED(param_bits);
382402
#if CONFIG_LCD_ENABLE_DEBUG_LOG
383-
mp_printf("rgb_init(self, width=%i, height=%i, bpp=%d, buffer_size=%lu, rgb565_byte_swap=%d)\n", width, height, bpp, buffer_size, rgb565_byte_swap);
403+
mp_printf(&mp_plat_print, "rgb_init(self, width=%i, height=%i, bpp=%d, buffer_size=%lu, rgb565_byte_swap=%d)\n", width, height, bpp, buffer_size, rgb565_byte_swap);
384404
#endif
385405
mp_lcd_rgb_bus_obj_t *self = (mp_lcd_rgb_bus_obj_t *)obj;
386406

@@ -422,10 +442,10 @@
422442
self->panel_io_config.flags.double_fb = 1;
423443

424444
#if CONFIG_LCD_ENABLE_DEBUG_LOG
425-
mp_printf("h_res=%lu\n", self->panel_io_config.timings.h_res);
426-
mp_printf("v_res=%lu\n", self->panel_io_config.timings.v_res);
427-
mp_printf("bits_per_pixel=%d\n", self->panel_io_config.bits_per_pixel);
428-
mp_printf("rgb565_byte_swap=%d\n", self->rgb565_byte_swap);
445+
mp_printf(&mp_plat_print, "h_res=%lu\n", self->panel_io_config.timings.h_res);
446+
mp_printf(&mp_plat_print, "v_res=%lu\n", self->panel_io_config.timings.v_res);
447+
mp_printf(&mp_plat_print, "bits_per_pixel=%d\n", self->panel_io_config.bits_per_pixel);
448+
mp_printf(&mp_plat_print, "rgb565_byte_swap=%d\n", self->rgb565_byte_swap);
429449
#endif
430450
mp_lcd_err_t ret = esp_lcd_new_rgb_panel(&self->panel_io_config, &self->panel_handle);
431451
if (ret != 0) {
@@ -459,9 +479,9 @@
459479
self->idle_fb = rgb_panel->fbs[0];
460480

461481
rgb_bus_lock_init(&self->copy_lock);
482+
rgb_bus_lock_init(&self->tx_color_lock);
462483
rgb_bus_event_init(&self->copy_task_exit);
463484
rgb_bus_event_init(&self->last_update);
464-
rgb_bus_event_init(&self->partial_copy);
465485
rgb_bus_event_init(&self->swap_bufs);
466486
rgb_bus_lock_init(&self->swap_lock);
467487

@@ -478,7 +498,7 @@
478498
mp_lcd_rgb_bus_obj_t *self = (mp_lcd_rgb_bus_obj_t *)obj;
479499
*lane_count = (uint8_t)self->panel_io_config.data_width;
480500
#if CONFIG_LCD_ENABLE_DEBUG_LOG
481-
mp_printf("rgb_get_lane_count(self)-> %d\n", (uint8_t)self->panel_io_config.data_width);
501+
mp_printf(&mp_plat_print, "rgb_get_lane_count(self)-> %d\n", (uint8_t)self->panel_io_config.data_width);
482502
#endif
483503

484504
return LCD_OK;
@@ -488,12 +508,15 @@
488508
mp_lcd_err_t rgb_tx_color(mp_obj_t obj, int lcd_cmd, void *color, size_t color_size, int x_start, int y_start, int x_end, int y_end, uint8_t rotation, bool last_update)
489509
{
490510
#if CONFIG_LCD_ENABLE_DEBUG_LOG
491-
mp_printf("rgb_tx_color(self, lcd_cmd=%d, color, color_size=%d, x_start=%d, y_start=%d, x_end=%d, y_end=%d)\n", lcd_cmd, color_size, x_start, y_start, x_end, y_end);
511+
mp_printf(&mp_plat_print, "rgb_tx_color(self, lcd_cmd=%d, color, color_size=%d, x_start=%d, y_start=%d, x_end=%d, y_end=%d)\n", lcd_cmd, color_size, x_start, y_start, x_end, y_end);
492512
#endif
493513

494514
LCD_UNUSED(color_size);
495515

496516
mp_lcd_rgb_bus_obj_t *self = (mp_lcd_rgb_bus_obj_t *)obj;
517+
518+
rgb_bus_lock_acquire(&self->tx_color_lock, -1);
519+
497520
self->partial_buf = (uint8_t *)color;
498521
self->x_start = x_start;
499522
self->y_start = y_start;

0 commit comments

Comments
 (0)