ESP32-P4 --- LCD 控制与触屏

LCD控制 

用户把需要更新的像素数据通过拷贝或者DMA搬到 frame buffer,然后刷一下CACHE

static esp_err_t dpi_panel_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, const void *color_data)

frame buffer 的数据是通过DMA不停的发送到 DSI bridge(FIFO memory of peripheral: DSI),一帧搬完,在完成回调函数重新启动DMA

static esp_err_t dpi_panel_create_dma_link(esp_lcd_dpi_panel_t *dpi_panel)

DMA的源地址和目的地址在这里设置

完成回调函数即是场同步信号,可以在这里计数得到实际刷新频率(frame per second)

复制代码
IRAM_ATTR
static bool dma_trans_done_cb(dw_gdma_channel_handle_t chan, const dw_gdma_trans_done_event_data_t *event_data, void *user_data)
{
    bool yield_needed = false;
    esp_lcd_dpi_panel_t *dpi_panel = (esp_lcd_dpi_panel_t *)user_data;
    uint8_t fb_index = dpi_panel->cur_fb_index;
    dw_gdma_link_list_handle_t link_list = dpi_panel->link_lists[fb_index];

    // restart the DMA transfer, keep refreshing the LCD
    dw_gdma_block_markers_t markers = {
        .is_valid = true,
        .is_last = true,
    };
    dw_gdma_lli_set_block_markers(dw_gdma_link_list_get_item(link_list, 0), markers);
    dw_gdma_channel_use_link_list(chan, link_list);
    dw_gdma_channel_enable_ctrl(chan, true); // 启动 DMA 搬移

    // the DMA descriptor is large enough to carry a whole frame buffer, so this event can also be treated as a fake "vsync end"
    if (dpi_panel->on_refresh_done) {
        if (dpi_panel->on_refresh_done(&dpi_panel->base, NULL, dpi_panel->user_ctx)) {
            yield_needed = true;
        }
    }
    return yield_needed;
}
复制代码

当数据从缓存拷贝到帧缓存,会回调函数 on_color_trans_done

当数据从帧缓存发送到DSI,会回调函数 on_refresh_done

    ESP_LOGI(TAG, "Register DPI panel event callback for LVGL flush ready notification");
    esp_lcd_dpi_panel_event_callbacks_t cbs = {
        .on_color_trans_done = example_notify_lvgl_flush_ready,
#if CONFIG_EXAMPLE_MONITOR_FPS_BY_GPIO
        .on_refresh_done = example_monitor_fps,
#endif
    };

防撕裂

on_refresh_done 释放信号量,表示搬完一帧数据到LCD

把数据刷新到帧缓存,并且把 cur_fb_index 更新为已经更新过数据的帧缓存的索引

 刷新数据到帧缓存后,先清空信号量再等待信号量

 防撕裂需要双帧缓存,lvgl支持双缓存

触屏

触屏中断脚的中断服务函数设置

 

 

 

posted @   流水灯  阅读(278)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2018-04-23 UDP 和 TCP 的对比
2018-04-23 UDP ------ UDP打洞
2016-04-23 MP150 AC-DC电源芯片note
2016-04-23 JAVA tomcat
点击右上角即可分享
微信分享提示